PHP5带给我们的面向对象的变化是伟大的是空前的是胜利的,就像所有的两会一样。尤其是它提供给我们的那些魔术函数,更是像桂林山水一样令人流连忘返。
1. __construct() 构造函数
这是PHP默认的构造函数,它并不能主动被程序调用只能是在对象创建的时候被自动调用。同时为了向下兼容,PHP5也支持与类同名的构造函数,值得一提的是当两种构造函数同时存在的时候,__construct()将不会被调用。
2. __destruct() 析构函数
3. __get($key)
当读取一个不存在的属性时调用。
< ?php class Obj { public function __get($key) { echo $key.' is not exsit'; } } $obj = new Obj(); echo $obj->varnotexist; ?>
上面的这段程序将会输出:varnotexist is not exist。
4. __set($key, value)
与__get($key)类似,而它是在修改一个不存在的属性时被调用。
5. __call($key, $args)
与__get($key)类似,而它是在调用一个不存在的方法时被调用。
6. __toString()
在试图打印一个对象时被调用
< ?php class Obj { private $a; private $b; public function __construct() { $this->a = 'a'; $this->b = 'b'; } public function __toString() { echo $this->a.'|'.$this->b; } } $obj = new Obj(); echo $obj; ?>
此时程序会打印:a|b
7. __clone()
当对象被克隆的时候被打印。
< ?php class Obj { public function __clone() { echo 'another me'; } } $obj = new Obj(); $obj1 = clone $obj; ?>
程序输入:another me
8. __sleep()
该函数在对象进行序列化之前调用,它可以清除对象,并返回一个将被用于序列化的变量的数组。通常被用来做一些无需存储的数据和一些数据库连接的清理工作。
9. __wakeup()
与__sleep()正好相反,他在unserialize()之前被调用,通常用来重建一些变量和资源,或者用来初始化。
10. __isset()
在isset()函数执行前调用。
11. __unset()
在unset()函数执行前调用。
12. __set_state()
在var_export()前被调用,var_export()是一个被我忽视的函数,他和var_dump()一样返回的是一个变量的结构,不同的是他返回的是一个合法的PHP代码。比如:
< ?php class Obj{ private $a='apple'; private $b='banana'; static public function __set_state($array) { foreach($array as $key=>$item) { echo $key . '=>' . $item . '<br />'; } } } $obj = new Obj(); eval(var_export($obj,true).';'); ?>
程序将会输出:
a=>'apple' b=>'banana'
这有什么用呢,它可以让我们缓存或保存一个变量的结构并且随时使用。
13. __autoload($key)
在实例一个对象时,如果找不到相应的类的定义,则会调用。
最后
以上函数中__get(), __set(), __call(), __autoload()之类的函数也许会消耗相当多的系统资源,并不推荐使用。

Posts
魔术函数本身不会带来性能上的问题 该用就用吧 :D
| 2009年02月27日 @ 12:16