只能说常用,因为魔术方法太多了,但是我们经常打交道的有限。
__construct():
类的构造方法,实例化类时调用:
class Bar{
function __construct($name){
$this->name = $name;
echo "call construct";
}
}
new Bar();//call construct;
__destruct()
类的析构方法,销毁对象时调用:
class Bar{
function __destruct(){
echo "destruct";
}
}
$bar = new Bar();
$bar = null;//destruct
unset($bar);//destruct
__get()
__set()
__get()和__set()是一对,起到的作用仿佛是为每个成员变量都隐含的设置了get和set方法,
所以,在外部设置局部变量也成为可能,就像是访问public权限的变量一样。
class Bar{
private $name;
function __get($key){
return $this->$key;
}
function __set($key,$value){
$this->key = $value;
}
}
$bar = new Bar();
$bar->name = 'foo';
echo $bar->name;//foo
__clone()
使用clone自动调用__clone()方法:
class Bar{
function __clone(){
echo "clone object";
}
}
$bar = new Bar();
$foo = clone $bar;//clone object
关于__clone
,官方有更好的说明
__sleep()
序列化对象时调用
__wakeup()
反序列化对象时调用
与一般的对象(如数组),类对象(自定义的class)的实例化和反实例化,尤其是单例(singleton)的序列化比较复杂,我们将用另一篇文章来说明。
__toString()
打印一个对象时调用:
class Bar{
private $item = array(1,2,3);
function toString(){
echo implode($this->item,',');
}
}
__invoke()
以函数的方式调用一个方法时自动调用__invoke():
class Bar{
function __invoke($str)
{
// TODO: Implement __invoke() method.
echo $str;
}
}
$bar = new Bar;
$bar('foo');//foo