Php的魔术方法

__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo() 等方法在 PHP 中被称为"魔术方法"(Magic methods)。在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。

我用 不可访问属性(inaccessible properties)"和"不可访问方法(inaccessible methods)"来称呼这些或方法。

__construct() 构造方法,具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。

__destruct() 析构函数,析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

php的"重载"方法:

1 方法不能用static修饰。【在静态方法中,这些魔术方法将不会被调用】

2 这些魔术方法的参数都不能通过引用传递

__call() 当实例调用一个不存在的或者访问权限不足的方法时调用这个方法。

__callStatic() 会被调用,在静态上下文中调用一个不可访问方法时。

__get() 当获取一个未定义或不可见的类属性的值时.

__set()在给一个未定义或不可见的类属性赋值时.

当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。

在除 isset() 外的其它语言结构中无法使用重载的属性,这意味着当对一个重载的属性使用 empty() 时,重载魔术方法将不会被调用。

class A{

public $a=0;
function __get($b){
echo $this->a,222;
}

public function __isset($name)
{
echo "Is '$name' set?\n";
return 111;
}

}

$a = new A();
$a->b = 5;
var_dump(empty($a->b));

//没有出现 echo "Is 'b' set?";

为避开此限制,必须将重载属性赋值到本地变量再使用 empty()。

 

__sleep() 方法常用于提交未提交的数据,或类似的清理操作。同时,如果有一些很大的对象,但不需要全部保存,这个功能就很好用。

与之相反,unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。

__wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。

 

__toString() 方法用于一个类被当成字符串时应怎样回应。例如return $obj; 应该显示些什么。此方法必须返回一个字符串,否则将发出一条E_RECOVERABLE_ERROR 级别的致命错误。

当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。

 

static  __set_state($an_array)   当一个实例化被 var_export()的时候 这个静态的方法会被调用,参数是一个数组。

插曲:var_export() 第二个参数为true的时候,可以把一个数组变成字符串。

eval — 把字符串作为PHP代码执行.

 

当复制完成时,如果定义了 __clone() 方法,则新创建的对象(复制生成的对象)中的 __clone() 方法会被调用,可用于修改属性的值(如果有必要的话)。

clone (new A())

__debugInfo()       var_dump()调用此方法。如果此方法没有在对象中定义,那么将显示所有公共、受保护和私有属性。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注