php魔术方法

魔术方法

PHP所提供的"重载"(overloading)是指动态地"创建"类属性和方法。我们是通过魔术方法(magic methods)来实现的。
当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。

1.__get($name)

class test
{
    public function __get($name)
    {
        echo $name; //age
    }
}

$obj = new test();

$obj->age;

当调用一个未定义的类属性时,__get()方法将被自动调用,参数是调用的未定义方法的名称.

2.__set($name, $value)

class test
{
    public function __set($name, $value)
    {
        echo $name .'---'. $value;   //age---5
    }
}

$obj = new test();
$obj->age = 5;

当给一个未定义的属性赋值的时候,自动调用__set方法,参数是调用的未定义方法的名称和值

3.__isset($name)

class test
{
    public function __isset($name)
    {
        echo $name;
    }
}

$obj = new test();
isset($obj->tall);

当一个未定义的属性赋值调用isset的时候,自动调用__isset方法,参数是调用的未定义方法的名称

4.__unset($name)

class test
{
    public function __unset($name)
    {
        echo $name;
    }
}

$obj = new test();
unset($obj->tall);

当一个未定义的属性赋值调用__unset的时候,自动调用__unset方法,参数是调用的未定义方法的名称

5.__call($name, $argument)

class test
{
    public function __call($name,  $argument)
    {
        var_dump($name, $argument);  //fun   7
    }
}

$obj = new test();
$obj->fun(7);

当调用一个未定义的方法的时候,自动调用__call方法, 参数是调用的函数名和参数

6.__callStatic($name)

class test
{
    public function __callStatic($name,  $argument)
    {
        var_dump($name, $argument);  //fun   7
    }
}

$obj = new test();
$obj::fun(7);

当调用一个未定义的静态方法的时候,自动调用__callStatic方法, 参数是调用的函数名和参数

7.__autoload($className)

function __autoload($className)
{
    echo $className;  //test
}

$obj = new test();

当尝试加载未定义的类,自动调用__autoload方法, 参数是调用的类名

8.__clone()

class test
{
    public function __clone()
    {
       echo "dada";     //dada
    }
}

$obj = new test();
$obj1 = clone $obj;

当克隆一个对象的时候,自动调用__clone方法

9.__toString()

class test
{
    public function __toString()
    {
       echo "dada";     //dada
    }
}

$obj = new test();
echo $obj;

在将一个对象转化成字符串时自动调用次方法

10.__invoke()

class test
{
    public function __invoke()
    {
       echo "dada";     //dada
    }
}

$obj = new test();
$obj();

在将一个对象当作函数调用时,调用次方法

11.__sleep()

class test
{
    public function __sleep()
    {
       echo "dada";
    }

}

$obj = new test();
serialize($obj);

在将一个对象序列化时

12.__wakeup()

class test
{
    public function __wakeup()
    {
       echo "dada";
    }

}

$obj = new test();
unserialize($obj);

在将一个对象反序列化时

13.__set_state()
调用var_export()导出类时,此静态方法会被调用。

14.__debugInfo()
打印所需调试信息

原文地址:https://www.cnblogs.com/binxyz/p/7441462.html