PHP魔术方法

Posted 叫我大头

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP魔术方法相关的知识,希望对你有一定的参考价值。

__sleep:在serialize被调用时,被自动的调用

__wakeup:在unserialize别调用时,被自动的调用,可用于做对象的初始化操作

class A
{
    public $var;
   
    //serialize时被调用,当你不需要保存大对象的所有数据时很有用
    public function __sleep()
    {
        echo ‘__sleep called‘.php_EOL;
        return array(‘var‘);
    }

    //unserialize时被调用,可用于做些对象的初始化操作
    public function __wakeup()
    {
        echo ‘__wakeup called‘.PHP_EOL;
        $this->var = ‘test after wakeup‘;
    }
}

$a = new A;
var_dump(serialize($a));
var_dump(unserialize(serialize($a)));
 
#########################################

__sleep called

E:\wamp64\www\test\test.php:142:string ‘O:1:"A":1:{s:3:"var";N;}‘ (length=24)
__sleep called __wakeup called
E:\wamp64\www\test\test.php:143:
object(A)[2]
  public ‘var‘ => string ‘test after wakeup‘ (length=17)
  public ‘var1‘ => null
  public ‘var2‘ => null

__toString:当一个类被转换成字符串时被调用

class TestClass
{
    public $foo;


    /**
     * 对象被转化成字符串输出
     * 一个类被当成字符串时应怎样回应
     * @return mixed
     */
    public function __toString()
    {
        return "toString called";
    }
}
echo new  TestClass();

__construct:构造函数的类会在每次创建新对象时先调用此方法,一般用于动态注入属性。如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承

__destruct:析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct()。此外也和构造函数一样,子类如果自己没有定义析构函数则会继承父类的。

class MyDestructableClass {
   function __construct() {
       print "In constructor\n";
       $this->name = "MyDestructableClass";
   }

   function __destruct() {
       print "Destroying " . $this->name . "\n";
   }
}

$obj = new MyDestructableClass();

以上是关于PHP魔术方法的主要内容,如果未能解决你的问题,请参考以下文章

PHP中的常见魔术方法功能作用及用法实例

巧用PHP中__get()魔术方法

了解 PHP 中的魔术方法 [重复]

php魔术方法。。

php啥是魔术方法

php魔术方法__tostring