魔术方法
在 PHP 中以两个下划线开头的方法,__construct(), __destruct (), __call(), __callStatic(),__get(), __set(), __isset(), __unset (), __sleep(), __wakeup(), __toString(), __set_state,() __clone() __autoload()等,被称为"魔术方法"(Magic methods)。
集合涵义
在PHP中以两个下划线开头的方法,__construct(), __destruct (), __call(), __callStatic(),__get(), __set(), __isset(), __unset (), __sleep(), __wakeup(), __toString(), __set_state,() __clone() __autoload()等,被称为"魔术方法"(Magic methods)。如果希望PHP调用这些魔术方法,首先必须在类中定义,否则PHP不会执行未创建的魔术方法。
注意:PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀。
包含成员
__set()
简介:
当程式试图写入一个不存在或者不可见的成员变数时,PHP就会执行__set()方法。__set()方法包含两个参数,分别表示变数名称和变数值,两个参数都不可省略。
实例1:
<?phpclass SportObject{ private $type=''; public function __get($name){ if(isset($this->$name)){ echo'变数'.$name.'的值为:'.$this->$name.'<br>'; }else{ echo'变数'.$name.'未定义,初始化为0<br>'; $this->$name=0; } } public function __set($name,$value){ if(isset($this->$name)){ $this->$name=$value; echo'变数'.$name.'赋值为:'.$value.'<br>'; }else{ $this->$name=$value; echo'变数'.$name.'被初始化为:'.$value.'<br>'; } }} $MyComputer=newSportObject(); $MyComputer->type='DIY'; $MyComputer->type;?>
例1输出结果为:
变数type赋值为:DIY
变数type的值为:DIY
变数type的值为:DIY
__get()
简介:
当程式试图调用一个未定义或不可见的成员变数时,可以通过__get()方法来读取变数值。__get()方法有一个参数,表示要调用的变数名。
实例2:
<?phpclass SportObject{ private $type=''; public function__get($name){ if(isset($this->$name)){ echo'变数'.$name.'的值为:'.$this->$name.'<br>'; }else{ echo'变数'.$name.'未定义,初始化为0<br>'; $this->$name=0; } } public function __set($name,$value){ if(isset($this->$name)){ $this->$name=$value; echo'变数'.$name.'赋值为:'.$value.'<br>'; }else{ $this->$name=$value; echo'变数'.$name.'被初始化为:'.$value.'<br>'; } }} $MyComputer=newSportObject(); $MyComputer->name;?>
例2输出结果为:
变数name未定义,初始化为0
变数name被初始化为:0
__construct(),__destruct()
简介:
- 在每次创建新对象时先调用此方法
-对象的所有引用都被删除或者当对象被显式销毁时执行
实例3:
<?php/** * 清晰的认识__construct() __destruct */class Example { public static $link; //在类实例化的时候自动载入__construct这个方法 public function __construct($localhost, $username, $password, $db) { self::$link = mysql_connect($localhost, $username, $password); if (mysql_errno()) { die('错误:' . mysql_error()); } mysql_set_charset('utf8'); mysql_select_db($db); } /** * 通过__construct连结好资料库然后执行sql语句...... */ //当类需要被删除或者销毁这个类的时候自动载入__destruct这个方法 public function __destruct() { echo '<pre>'; var_dump(self::$link); mysql_close(self::$link); var_dump(self::$link); }}$mysql = new Example('localhost', 'root', 'root', 'test');
例3输出结果为:
resource(2) of type (mysql link)
resource(2) of type (Unknown)