您的位置:首页 > 其它

(38)面向对象的构造与析构方法(39)面向对象的三大特性之一封装性

2012-07-27 23:27 375 查看
(38)面向对象的构造与析构方法

1. 对象中成员的访问(就是在一个对象的内部方法中,去访问本对象中的其它方法和成员属性)例如:在说话得方法中说出自己的年龄姓名性别或者自己吃的什么

2. 在对象中的方法中都默认有一个$this关键字, 这个关键字代表调用这个方法的对象。也就是说在p1的方法中$this代表的就是p1这个对象。用什么调用方法$this就代表什么,用p1调用方法就代表p1,$this相当于内部的“我”

在PHP中调动成员的所有东西都是手动的,没有默认的。但是在java中不需要写$this都是默认的。

3. 第一人称代词:我

构造方法,也称构造器

(自定义构造的方法必须手动的去调用)

1. 是对象创建完成以后,“第一个” “自动调用”的方法

2. 构造方法的定义, 方法名一个固定的,

在PHP4中 和类名相同的方法就是构造方法

在PHP5中 构造方法选择使用 魔术方法 __construct() 所有类中声明构造方法都使用这个名称

写法的优点: 在改变类名时,构造方法不用改变

作用:就是为成员属性初使化;

魔术方法:

在类中写出了某个魔术方法, 这个方法对象的功能 就会添加上

方法、名称都固定的(都是系统给我们提供好),没有自己定义的,不加没有这个功能,加上就会出现

每一个魔术方法, 都是在不同时刻为了完成某一功能自动调用的方法

不同的魔术方法有不同调用 时机

都是以 __开头的方法,以下是

__construct(); //构造方法

__destruct(); //析构方法

__set(); //封装的时候用的

__get();

__isset();

__unset();

__clone();

__call();

__sleep();

__weakup();

__toString()

...

__autoload(); //类外用的魔术方法

析构方法:

1. 当对象被释放之前最后一个 “自动”调用的方法

当堆内存的资源没有栈内存的引用的时候(引用线断掉),堆内存里的资源收成为了垃圾。使用垃圾回收器(java PHP)而C++手动的用delete释放。java是在负载较轻的时候启用垃圾回收器,而PHP 不是,只要有垃圾就会启用

但是在释放之前,会自动调用一下析构方法。

作用:关闭一些资源, 作一些清理的工作

__destruct();

class Person {

var $name;

var $age;

var $sex;

1、function __construct($name="", $age=0, $sex="男"){

$this->name=$name; //加上$this就是全局的成员的name,不加$this就是参数的,自己声明的name。

$this->age=$age; //初始化的值等于给定的值。

$this->sex=$sex;

}

2、function __construct($name="", $age=0, $sex="男"){

$this->name=$name;

$this->age=$age;

$this->sex=$sex;

}

function person(){

echo "##########<br>"; //会出现三行########就是被自动调用

}

/*

*1和2在有的情况下是共存的。在兼容的情况下。在PHP5中首先找的是1的构造形式,找不到1就找2

*这两种方法都可以,但是在PHP4中只认准2的构造方法。

*/

function say(){

echo "我的名子:{$this->name},我的年龄:{$this->age},我的性别:{$this->sex}。<br>";

$this->eat();

}

function run(){

}

function eat(){

}

function __destruct(){

echo $this->name."再见!<br>"; //先是王五再见,然后李四再见,最后张三再见

}

}

$p1=new Person("zhangsan", 20, "女");

$p2=new Person("lisi", 25);

$p3=new Person("wangwu"); //栈内存的特点是先进后出,我们先创建的p1然后p2再然后p3,所以释放的顺序是p3>p2>p1

$p1->say();

$p1=null; //执行完张三立马释放p1所以p1最先被释放,先是张三再见,然后执行p2、p3再是王五再见、李四再见

$p2->say(); //可以让他们自己介绍,因为他们都知道了


$p3->say();

(39)面向对象的三大特性之一封装性

封装性: 面向对象的三大特性之一

1. 就是把对象的成员(属性,方法)结合成一个独立的相同单位,并尽可能隐藏对象的内部细节(只保留有限的对外接口)

public(公共的) protected (被保护的)

private 私有的, 用这个关键字修饰的成员,只能在对象内部访问(只有用$this访问),不能在对象外部使用

属性可以封装:

只要一个变量,需要在多个方法使用,就将这个方法声明为成员属性,可以直接在这个对象中的所有方法中使用

成员属性,就相当于这个对象中的全局变量

成员属性都会在方法中使用, 成员属性值的变化其实就是在改变方法的执行行为, 也就是改变了对象的功能

成员属性的值如果不正常, 方法执行的功能也就不正常 了

属性封装的目的:为了属性的值不影响方法的功能

450ma--650mA ---如果变成 5A

3.8--4.2V --- 如果220v

都会造成严重的后果

作用:不需要在对象外部改变或读取它的值

1. 封装

再提供一个公有的方法(经过方法对象成员属性进行赋值和取值就可以控制)

例如:

function setAge($age){

$this->age=$age;

}

后面我们直接调用不好用p1->age=20000;是错误的

而p1->setAge(age=20000);就好用了

方法也可以封装:

封装的作用:

1. 使用private修饰使用其只能在内部使用

2. 一个类中有100个方法, 封装了95个(为另外的5个服务的方法,95是内部服务的), 只有5个方法可以使用,例如电话,其本身程序是复杂的,但是其他的都封装值留下简单的操作功能给你使用,因为我们操作封装的程序是没有价值的,反而可能会搞坏程序。造成不必要的后果。这就是封装的目的。

100成员属性,都让取值,值都不可以改值,有个别的还不想让人知道真实的值。

所以这就要借助魔术方法了

和封装有关的魔术方法:(对封装后的设置方法以下四种)

__set():是直接设置成员属性值时,自动调用的方法,用于成员属性赋值

__get():是直接获取成员属性值时,自动调用的方法,用于成员属性取值

__isset(); 是直接isset查看对象中私有属性是否存时自动调用这个方法

__unset();是直接unset删除对象中私有属性时,自动调用的方法。它不仅能删除本页中的对象也能删除数组中的成员还能删除对象中的成员。但是私有的一般格式是删不了的。

class Person {

private $name; //私有封装

private $age;

private $sex;

function __construct($name="", $age=0, $sex="男"){

$this->name=$name;

$this->age=$age;

$this->sex=$sex;

}

function getPro($name){

return $this->$name; //想取什么值就输入什么值,这是PHP可以做的到的。

}

function setAge($age){ //允许你设置,但是要我控制范围

if($age > 100 || $age < 0 )

return;

$this->age=$age;

}

function getAge(){

if($this->age < 30)

return $this->age;

elseif($this->age < 40)

return $this->age-5;

elseif($this->age < 50)

return $this->age-10;

else

return $this->age-15;

}

function say(){

echo "我的名子:{$this->name},我的年龄:{$this->age},我的性别:{$this->sex}。<br>";

}

function run(){

$this->left(); //内部调用,没有封装的对象在哪里都可以调用

$this->left();

$this->right(); //调用一个left或right或gogo是没有意义的,只有调用完整的或者调用run

$this->right();

$this->gogo();

$this->gogo();

$this->gogo();

}

private function left(){ //用兔子舞的方式为例子,内部可以调用,但是外部不可以。

echo "LLLLLLLLLLLLL<br>";

}

private function right(){

echo "RRRRRRRRRRRRRR<br>";

}

private function gogo(){

echo "GGGGGGGGGGGGGGGGG<br>";

}

function eat(){

}

function __destruct(){

echo $this->name."再见!<br>";

}

}

private function __unset($proName){ //删除私有成员的方法

unset($this->$proName);

}

unset($p1->name); //加上它就可以删除

$p1=new Person("zhangsan", 20, "女");

$p2=new Person("lisi", 25);

$p3=new Person("wangwu");

//$p1->age=50000;

//echo $p1->age;

$p1->setAge(55);

echo $p1->getAge()."<br>";

//$p1->say();

private function __isset($proName){

if($proName=="age")

return false; //只要查看年龄是否存在的直接返回失败

return isset($this->$proName); //内部判断有没有,内部判断有,那么外部判断就有。

}

if(isset($p1->name)){ //查看p1中的name是否存在

echo "存在<br>";

}else{

echo "没有这个成员 <br>";

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐