__isset() 方法:在看这个方法之前我们看一下“isset()”函数的应用,isset()是测定变量是否设定用的函数,传入一个变量作为参数,如果传入的变量存在则传回true,否则传回false。那么如果在一个对象外面使用“isset()”这个函数去测定对象里面的成员是否被设定可不可以用它呢?分两种情况,如果对象里面成员是公有的,我们就可以使用这个函数来测定成员属性,如果是私有的成员属性,这个函数就不起作用了,原因就是因为私有的被封装了,在外部不可见。那么我们就不可以在对象的外部使用“isset()”函数来测定私有成员属性是否被设定了呢?可以,你只要在类里面加上一个“__isset()”方法就可以了,当在类外部使用”isset()”函数来测定对象里面的私有成员是否被设定时,就会自动调用类里面的“__isset()”方法了帮我们完成这样的操作,“__isset()”方法也可以做成私有的。你可以在类里面加上下面这样的代码就可以了: private function __isset($nm) { echo "当在类外部使用isset()函数测定私有成员$nm时,自动调用<br />"; return isset($this->$nm); } __unset()方法:看这个方法之前呢,我们也先来看一下“unset()”这个函数,“unset()”这个函数的作用是删除指定的变量且传回true,参数为要删除的变量。那么如果在一个对象外部去删除对象内部的成员属性用“unset()”函数可不可以呢,也是分两种情况,如果一个对象里面的成员属性是公有的,就可以使用这个函数在对象外面删除对象的公有属性,如果对象的成员属性是私有的,我使用这个函数就没有权限去删除,但同样如果你在一个对象里面加上“__unset()”这个方法,就可以在对象的外部去删除对象的私有成员属性了。在对象里面加上了“__unset()”这个方法之后,在对象外部使用“unset()”函数删除对象内部的私有成员属性时,自动调用“__unset()”函数来帮我们删除对象内部的私有成员属性,这个方法也可以在类的内部定义成私有的。在对象里面加上下面的代码就可以了: private function __unset($nm) { echo "当在类外部使用unset()函数来删除私有成员时自动调用的<br />"; unset($this->$nm); } 我们来看一个完整的实例: <?php class Person { // 下面是人的成员属性 private $name; //人的名子 private $sex; //人的性别 private $age; //人的年龄 // __get()方法用来获取私有属性 private function __get($property_name) { if (isset($this->$property_name)) { return ($this->$property_name); } else { return NULL; } } // __set()方法用来设置私有属性 private function __set($property_name, $value) { $this->$property_name = $value; } // __isset()方法 private function __isset($nm) { echo "isset()函数测定私有成员时,自动调用<br />"; return isset($this->$nm); } //__unset()方法 private function __unset($nm) { echo "当在类外部使用unset()函数来删除私有成员时自动调用的<br />"; unset($this->$nm); } } $p1 = new Person(); $p1->name = "this is a person name"; // 在使用isset()函数测定私有成员时,自动调用__isset()方法帮我们完成,返回结果为true echo var_dump(isset($p1->name)) . "<br >"; echo $p1->name . "<br />"; // 在使用unset()函数删除私有成员时,自动调用__unset()方法帮我们完成,删除name私有属性 unset($p1->name); // 已经被删除了,所这行不会有输出 echo $p1->name; ?> 输出结果为: isset()函数测定私有成员时,自动调用 boolean true this is a person name 当在类外部使用unset()函数来删除私有成员时自动调用的 isset()函数测定私有成员时,自动调用 __set()、__get()、__isset()、__unset() 这四个方法都是我们添加到对象里面的,在需要时自动调用的,来完成在对象外部对对象内部私有属性的操作。 最后补充说明: 1、__set(), __get() 是专门为类的私有属性(private、protected)设立的,对于类的公开(public)属性,外面是可以直接访问与设置的(如:$p1->name),即不走__set(),__get()函数的!!! 2、在PHP5.3及以后,上述魔术方法(__get(),__set(),__isset(),__unset() 等)提倡是 public 类型的,并且不是 static 方法,否则会给出警告信息! <?php class A { private $name = 'qianyunlai'; public $old = '26'; private function __get($name) { echo $name, '<br />'; return $this->$name; } } $a = new A(); print_r($a->name); ?> 输出: ( ! ) Warning: The magic method __get() must have public visibility and cannot be static in D:/PHP/xampp/htdocs/discuz/discuzx3.0/123.php on line 6 name qianyunlai |