魔术方法
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()
打印所需调试信息