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:wamp64wwwtesttest.php:142:string 'O:1:"A":1:{s:3:"var";N;}' (length=24)

__sleep called __wakeup called

E:wamp64wwwtesttest.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 constructorn";
       $this->name = "MyDestructableClass";
   }

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

$obj = new MyDestructableClass();
0 条评论
发表一条评论