zoukankan      html  css  js  c++  java
  • 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()时,这个静态方法会被调用,本方法的唯一的参数就是数组

  • 相关阅读:
    二叉树的层序遍历-102
    剑指offer 06 从尾到头打印链表
    替换空格:剑指offer05
    面试题16.11.跳水板----leetcode
    JVM——垃圾回收
    新生代Eden与两个Survivor区的解释
    JVM 1.8 永久代---元空间 的变动
    Git拉取项目避坑
    python-装饰器
    python-Queue
  • 原文地址:https://www.cnblogs.com/hylaz/p/2797961.html
Copyright © 2011-2022 走看看