魔术方法(魔术函数
概念:PHP 将所有以 \_\_(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以 \_\_ 为前缀。
分别为:
__construct():
应用笔记:如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用**parent::\_\_construct()**。如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承(假如没有被定义为 private 的话)。
__destruct():
析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用**parent::\_\_destruct()**。此外也和构造函数一样,子类如果自己没有定义析构函数则会继承父类的。
析构函数即使在使用exit()终止脚本运行时也会被调用。在析构函数中调用exit()将会中止其余关闭操作的运行。
应用笔记:
1.析构函数在脚本关闭时调用,此时所有的 HTTP 头信息已经发出。脚本关闭时的工作目录有可能和在 SAPI(如 apache)中时不同。
2.试图在析构函数(在脚本终止时被调用)中抛出一个异常会导致致命错误。
__call(),在对象中调用一个不可访问方法时,__call()会被调用。
__callStatic(), 在静态上下文中调用一个不可访问方法时会被调用
__get(),在给不可访问属性赋值时,__get() 会被调用
__set(), 在给不可访问属性赋值时,__set() 会被调用
__isset(), 当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。
__unset(),当对不可访问属性调用 unset() 时,__unset() 会被调用。
__sleep():
方法常用于提交未提交的数据,或类似的清理操作。同时,如果有一些很大的对象,但不需要全部保存,这个功能就很好用
__wakeup(),经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作
~~~
class Connection
{
protected $link;
private $server, $username, $password, $db;
public function __construct($server, $username, $password, $db)
{
$this->server = $server;
$this->username = $username;
$this->password = $password;
$this->db = $db;
$this->connect();
}
private function connect()
{
$this->link = mysql_connect($this->server, $this->username, $this->password);
mysql_select_db($this->db, $this->link);
}
public function __sleep()
{
return array('server', 'username', 'password', 'db');
}
public function __wakeup()
{
$this->connect();
}
}
?>
~~~
__toString(),
方法用于一个类被当成字符串时回应。例如 echo $obj; 应该显示些什么。此方法必须返回一个字符串,否则将发出一条 E_RECOVERABLE_ERROR 级别的致命错误。
~~~
// Declare a simple class
class TestClass
{
public $foo;
public function __construct($foo)
{
$this->foo = $foo;
}
public function __toString() {
return $this->foo;
}
}
$class = new TestClass('Hello');
echo $class; //输出 Hello
?>
~~~
__invoke(),当尝试以调用函数的方式调用一个对象时,方法会被自动调用
~~~
class CallableClass
{
function __invoke($x) {
var_dump($x);
}
}
$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj)); // is_callable — 检测参数是否为合法的可调用结构
?>
以上会输出:
int(5)
bool(true)
~~~
__set_state(),
__clone() 和
对象复制。当复制完成时,如果定义了 __clone() 方法,则新创建的对象(复制生成的对象)中的 __clone() 方法会被调用,可用于修改属性的值(如果有必要的话)
__debugInfo()
等方法在 PHP 中被称为"魔术方法"(Magic methods)
__construct():