sswffw
__get(),__set(),__isset(),__unset()
__get和__set方法的使用
<?php
class MagicTest{
//__tostring会在把对象转换为string时自动调用
public function __tostring(){
return "This is the class MagicTest";
}
//__invoke会把在对象当做一个方法的时候自动调用
public function __invoke($x){
echo "_invoke called with parameter ".$x."\n";
}
//方法的重载
//这个方法的参数第一个就是调用的方法的名称,第二个参数是方法调用的参数组成的数组
public function __call($name,$arguments){
echo "calling ".$name." with parament:".implode(",",$arguments)."\n";
}
//静态方法的重载,需要将这个方法设定成static
public static function __callStatic($name,$arguments){
echo "calling static ".$name. " with parament:".implode(",",$arguments)."\n";
}
public function __get($name){
return "getting the property ".$name;
}
public function __set($name,$value){
echo "setting the property".$name." to value".$value."\n";
}
}
$obj=new MagicTest();
// echo $obj."\n";
// $obj(5);
// $obj->runTest("para1","para2");
// //静态调用
// MagicTest::runTest("para1","para2");
echo $obj->ClassName."\n";
$obj->ClassName='magicClassX';
?>
使用一个类库时,可以使用__get来获取某个方法
在给不可访问属性赋值时,__set()会被调用 定义function __set($name,$value)
读取不可访问属性的值时,__get()会被调用 定义function __get($name)
当对不可访问属性调用isset()或empty()时,__isset()会被调用
当对不可访问的属性调用unset()时,__unset()会被调用
所谓不可访问属性,实际上就是在调用某个属性时发现这个属性没有被定义(不可访问属性,也包括虽然定义了没有访问权限),这时候不同的操作会触发不同的魔术方法
这几个方法也被成为属性重载的魔术方法
属性重载只能在对象中进行。在静态方法中,这些魔术方法将不会被调用。所以这些方法都不能被 声明为 static。从 PHP 5.3.0 起, 将这些魔术方法定义为 static 会产生一个警告。
在给不可访问属性赋值时,__set()会被调用 定义function __set($name,$value)
读取不可访问属性的值时,__get()会被调用 定义function __get($name)
所谓不可访问属性,实际上就是在调用某个属性时发现这个属性没有被定义(不可访问属性,也包括虽然定义了但没有访问权限),这时候不同的操作会触发不同的魔术方法
格式:
__get()方法:这个方法用来获取私有成员属性值的,有一个参数,参数传入你要获取的成员属性的名称,返回获取的属性值,这个方法不用我们手工的去调用,因为我们也可以把这个方法做成私有的方法,是在直接获取私有属性的时候对象自动调用的。
__set()方法:这个方法用来为私有成员属性设置值的,有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。
案例:
//定义一个类
class Fruit{
//定义类的私有属性
private $color;
//__set()方法用来设置私有属性
public function __set($name,$value){
$this->$name = $value;
}
//__get()方法用来获取私有属性
public function __get($name){
return $this->$name;
}
}
//以上类Fruit中有两个私有的成员属性,设置了__set和__get以后,可以直接通过下面这种方式对成员变量进行调用。
$fruit = new Fruit();
//调用没有访问权限的属性并给其设置值
$fruit->color = 'red';
echo $fruit->color;
//调用没有被定义的属性并给其设置值
$fruit->weight = '80kg';
echo $fruit->weight;
如果没有__set和__get,直接通过$fruit->color这种方式调用,则会出错。
注意:将__get()和__set()方法设置为private私有的访问权限,并不影响其被自动调用;只要对象调用了未定义的或者没有访问权限的属性,就会触发这两个方法
这几个方法也被成为属性重载的魔术方法
属性重载只能在对象中进行。在静态方法中,这些魔术方法将不会被调用。所以这些方法都不能被 声明为 static。从 PHP 5.3.0 起, 将这些魔术方法定义为 static 会产生一个警告。
详情:https://blog.csdn.net/wanghongios/article/details/49357891
通过这两个方法,设置的属性,相当于是个动态属性;即这个属性在类里面压根就不存在;
因为这两个魔术方法是在对象调用某个属性时发现这个属性没有被定义(不可访问属性,也包括虽然定义了但没有访问权限),这时候这两个方法就会被触发
这些方法不是默认存在的,而是我们手工添加到类里面去的,像构造方法(__construct())一样, 类里面添加了才会存在