php 魔术方法

public void __set(string $name,mixed $value) 在给末定义的变量赋值时,__set()会被调用

public mieed __get(string $name) 读取末定义的变量的值时__get会被调用

public bool __isset(string name) 当对末定义的变量调用isset()或empty()时,__isset()会被调用

public void __unset(string name)当对末定义的变量调用unset时 __unset会被调用

注意:参数$name是指要操作的变量的名称 __set()方法的$value参数指定了$name变量的值

属性重载只能在对象中进行,在静态方法中,这些魔术方法不会被调用,所以这些方法都不能被声明为static

在除isset外的其它语言结构中无法使用重载的属性, 这意味着当对一个重载的属性使用empty时,重载魔术方法将不会被调用。 为避开此限制,可以将重载属性赋值到本地变量再使用empty

__get()和__set() 可以被继承,子类中__get()和__se()t可以继承父类的__get()和__set()

例子:

<?

class PropertyTest{

         //被重载的数据保存在数组中

         private $date=array();

         //重载不能被用在已经定义的属性

         public $declared=1;

         //只用从类外部访问这个属性,重载才会发生

         private $hidden=2;

         public function __set($name,$value){

                   echo "setting '$name'to '$value'\n";

                   $this->date[$name]=$value;

         }

         public function __get($name){

                   echo "getting '$name'\n";

                   if(array_key_exists($name,$this->date)){

                            return $this->date[$name];

                   }

                   $trace=debug_backtrace();

                   trigger_error('unsigned property via_get():'.$name.'in'.$trace[0]['file'].'on line'.$trace[0]['line'],E_USER_NOTICE);

                   return null;

         }

         public function __isset($name){

                   echo "is'$name'set?\n";

                   return isset($this->date[$name]);

         }

         public function __unset($name){

                   echo "unsetting'$name'\n";

                   unset($this->date[$name]);

         }

         public function getHidden(){

                   return $this->hidden;

         }

}

echo "<pre>\n";

$obj = new PropertyTest;

$obj->a = 1;

echo $obj->a . "\n\n";

var_dump(isset($obj->a));

unset($obj->a);

var_dump(isset($obj->a));

?>

public mixed __call(string $name,sting $arguments) 当调用一个不可访问方法(如末定义,或不可见)时,__callstatic会被调用

public static mixed __callstatic (string $name.array $arrguments)

当在静态方法中调用一个不可访问的方法(如末定义或者不可见)时 __callstatic 会被调用

$name 参数是要调用的方法名称,$arraguments 参数是一个数组,包含着传递给方法的参数

例子

class MethodTest{

         public function __call($name,$arguments){

                   echo "calling object method '$name'".implode(',',$arguments)."\n";

         }

         public static function __callStatic($name,$arguments){

                   echo "calling static method '$name'".implode(',',$arguments)."\n";

         }

}

$obj = new MethodTest;

$obj->runTest('in object context');

MethodTest::runTest('in static context');

public array  __sleep(void) serialize()函数会检查是否存在一个魔术方法,如果存在__sleep(),__sleep()方法会先被调用,然后才执行序列化操作,这个功能可以用于清理对象,并返回一个包含对象中所有应被徐立华的变量名称的数组。如果方法不返回任何内容,则null 被序列化,并产生一个E_NOTICE错误

__sleep()方法用于提交未提交的数据,或类似的清理操作,同时,如果有一些很大的对象,不需要全部保存,这个功能就好用

unserialize()会检查是否存在一个_wakeup()方法,如果存在,则会先通用__wakeup方法,预先准备对象需要的资源

__wakeup()经常用在反序列化操作中,例如重新建立数据库连接,或执行其他初始化操作

__string()会在需要转成字符串时,在php内部会隐式自动调用它,进行对象类型的转化

__invoke()

当尝试以调用函数的方式调用一个对象时,__invoke()方法会被自动调用

__set_state()

当调用var_export()时,这个静态方法会被调用,本方法的唯一的参数就是数组

原文地址:https://www.cnblogs.com/hylaz/p/2797961.html