1、__call(string $Fname, array $arguments);
在对象中调用一个不可访问的方法时会调用该方法。用静态方式调用一个不可访问的方法时会调用
__callstatic()。
例: function __call($name, $argus){ $err = "Call dont exited function :".$name."("; for($i=0;$i<count($argus)-1;$i++){ $err.= gettype($argus[$i]).", "; } echo $err,gettype($argus[count($argus)-1]),")"; }
2、__construct()构造函数
如果子类中定义了构造函数,则在实例化子类的实例时就不会隐式调用父类的构造函数。要在子类的
构造函数中执行父类的构造函数:parent::__construct(); 如果子类中没有定义构造函数,则会从父类继承。 为了实现向后兼容,如果php 5在类中找不到__construct()并且也没有从父类继承的话,他就会尝试
寻找旧式 的构造函数,也就是和类名同名的函数。
__destruct() 析构函数
在php中,没有任何变量指向对象时,该对象占用的内存空间会被释放,对象被销毁。这就是php的垃
圾回收机制,防止内存溢出。
当一个php线程结束时,当前占用的所有内存空间会被释放,所有对象会被销毁。
class Person { public function __destruct(){ echo '析构函数现在执行了 <br />'; } } $p = new Person(); $p = null; // 析构函数在这里执行了 $p = "abc"; // 一样的效果 for($i = 0; $i < 5; $i++){ echo "$i <br />"; }
3、__clone() 当复制完成时,如果定义了__clone()方法,则新创建的对象(复制生成的对象)中的__clone() 方法会
被调用,可用于修改属性的值(如果有必要的话)。私有化__clone可以防止克隆该类的对象。
class B{ static $a = 1; public $b;
public function __construct(){ $this->b = ++self::$a; } public function __clone(){ $this->b = ++self::$a; } }
class A{ public $obj1; public $obj2;
public function __clone(){ //强制复制一份this->obj1 ,否则保存同一个对象 $this->obj1 = clone $this->obj1; } } $ad = new A(); $af = $ad; //clone方法会被调用 ??? $ag = clone $ad; //强制复制对象
4、__invoke() 当以调用函数的方式调用一个对象时,改魔术方法会被执行。
例: class A{ public function __invoke($x){ print_r($x); } } $test = new A(); $test(9); //此时__invoke()会被调用
5、__get(string $name)
在读取不可访问的属性的值时改函数会被调用。$name 是属性名。
__set(string $name,mixed $val) 设置不可访问的值时会调用该方法。通过该方法可以禁止对类属性的扩展:在没有该方法的情况下对类对
象的一个不存在的属性赋值相当于扩展该对象的属性。 function __set(){} //禁止扩展该类对象的属性
模拟java的get() 、set() 方法:
class A{ private $asd = 'as'; public function __get($name){ if(isset($name))return $this->$name; else return false; } public function __set($name,$val){ if(isset($name)) $this->$name = $val; } }
6、__isset(string $name) 当对不可访问属性进行isset()或empty()时,改方法会被调用。
7、当对不可访问属性调用 unset()时,__unset() 会被调用。
8、__sleep( void )
serivalize()函数会检查类中是否存在魔术方法__sleep(),如果存在,该方法会先被调用,然后才执行序
列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应该被序列化的变量名称的数组。如果该方
法未返回任何内容,则NULL被序列化,并产生E_NOTICE级别的错误。
__sleep()常用作提交未提交的数据,或类似的数据清理工作。同时,如果有一些很大的对象,但不需要保
存全部信息,这个魔术方法就很有用。
与之相反,unserivalize()会检查是否存在一个__wakeup()方法,如存在则先调用改方法,预先准备对象
需要的资源。
calss Connection{
private $server,$user,$password,$db; protected $link;
public function __construct($server,$user,$password,$db){ $this->server = $server; $this->password = $password; $this->db = $db; $this->user = $user; $this->connect(); }
public function connect(){ $this->link = mysql_connect($this->server,$this->user,$this->password); mysql_select_db($this->db,$this->link); }
public function __sleep(){ return array('server','user','password','db'); //要保存的属性 }
public function __wakeup(){ $this->connect(); //要预备的资源,重新进行数据库链接,或一些其他的初始化操作。 } }
9、自动加载 __autoload
function __autoload($className){ require './'.$className; }