
日期:2006-09-26 作者:喜腾小二 来源:PHPChina
第19章 类与对象(PHP5) 之十:魔法方法(Magic Methods)
函数名__construct, __destruct (注意构造函数和析构函数), __call,
__get, __set, __isset, __unset (注意重载), __sleep, __wakeup, __toString,
__set_state, __clone and __autoload是PHP类里边的魔法函数.
函数名 __construct,
__destruct(注意构造函数和析构函数), __call, __get, __set, __isset, __unset (see 注意重载),
__sleep, __wakeup, __toString, __set_state, __clone and
__autoload在PHP类里是魔术的.在任何类里你不能用这些名字给函数命名除非你想与它们的魔术功能性相关联。
注意:
PHP储量将所有用__开始的函数名作为魔术函数。推荐地,在PHP里不能用__做函数名除非你想用文件证明是魔术函数。
__sleep()和__wakeup()
serialize()
检查类中是否有魔术名称 __sleep
的函数。如果这样,该函数将在任何序列化之前运行。它可以清除对象并应该返回一个包含有该对象中应被序列化的所有变量名的数组。
使用 __sleep
的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。
相反地,unserialize()
检查具有魔术名称 __wakeup 的函数的存在。如果存在,此函数可以重建对象可能具有的任何资源。
使用 __wakeup
的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。
例子 19-25. Sleep and wakeup
PHP代码如下:
>php
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() { mysql_close($this->link); }
public function __wakeup() { $this->connect(); }
}
?>
__toString
__toString方法允许一个类决定当它被修改为string类型时是如何起作用的。
例子
19-26.Simple example
PHP代码如下:
>php
class TestClass// Declare a simple class
{ public $foo;
public function __construct($foo){ $this->foo = $foo; }
public function __toString() { return $this->foo; }
}
$class = new TestClass('Hello');
echo $class;
?>
上例将输出:Hello
__toString方法将只在使用echo()和print()直接地组合时被调用是一个有效的注释方法。
例子 19-27. Cases where
__toString is called
PHP代码如下:
>php
echo $class; //__toString called
echo 'text',$class; //__toString called (still a normal parameter for echo)
echo 'text'.$class; // __toString not called (concatenation operator used first)
echo (string)$class; //__toString not called (cast to string first)
echo "text $class";//__toString not called (cast to string first)
?>
__set_state
从PHP
5.1.0开始static方法是通过var_export()函数来访问类接口的。这个方法的唯一参数是一个包含属性出口的以为array(‘property’=value,…)形式的数组