php類的魔術方法也就是帶下劃線的類方法介紹及應用

 

PHP把全部以__(兩個下劃線)開頭的類方法當成魔術方法,而且這些魔術方法的參數都不能經過引用傳遞。php的魔術方法有:
 __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state() 和 __clone()等。
 下面簡單說一下對應的功能:
 Class MyClass {
 __construct($var1,$var2) {
 //構造器
 }
 __destruct() {
 //析構方法
 }
 __clone() {
 //克隆方法 $obj2 = clone $obj1; 時執行

對象的複製

class a{  
    public $s = '';  
}  
$a_1 = new a();  
$a_1->s = 'a1';  
$a_2 = clone $a_1;  
$a_2->s = 'a2';  
echo $a_1->s; //'a1'  
echo $a_2->s; //'a2'  

淺度複製

class a{
  public $s = '';
 }
 class b{
  public $a = null;
  public $str = null;
 }

$str = '123';
 $b_1 = new b();
 $b_1->a = new a();
 $b_1->str = & $str;

$b_1->a->s = 'b1';
 $b_2 = clone $b_1;
 $b_2->a->s = 'aaaaa';
 $b_2->str = 'nihao';
 echo $b_1->a->s;
 echo "\n";
 echo $b_1->str;
 echo "\n";
 echo $b_2->a->s;
 echo "\n";
 echo $b_2->str;

 

深度複製

class a{
  public $s = '';
 }
 class b{
  public $a = null;
  public $str = null;
  public function __clone(){
   $b = $this->str;
   $this->str = & $b;
   $this->a = clone($this->a);
  }
 }

$str = '123';
 $b_1 = new b();
 $b_1->a = new a();
 $b_1->str = & $str;

$b_1->a->s = 'b1';
 $b_2 = clone $b_1;
 $b_2->a->s = 'aaaaa';
 $b_2->str = 'nihao';
 echo $b_1->a->s;
 echo "\n";
 echo $b_1->str;
 echo "\n";
 echo $b_2->a->s;
 echo "\n";
 echo $b_2->str;


 }
 __call($fun,$args) {
 //魔術調用 方法名和參數

    if(method_exists($this, $fun.count($args))){

       return call_user_func_array(array(&$this,$fun.count($args)),$args);

      }else{

       throw new Exception('調用了未知的方法:'.__METHOD__);

      }
 }
 __callStatic($fun,$args) {
 //魔術調用 靜態方法名和參數
 //可見性未設置爲public或未聲明爲static的時候會產生一個警告 。
 //本特性只在PHP 5.3.0 及以上版本有效。
    與__call區別:修飾stati
 }
 __invoke($args) {
 //把類做爲函數使用 參數
 //當嘗試以調用函數的方式調用一個對象時,__invoke() 方法會被自動調用
 //本特性只在PHP 5.3.0 及以上版本有效。    class Callme {             public function __invoke($phone_num) {                 echo "Hello: $num";         }     }      $call = new Callme();     $call(13810688888); // "Hello: 13810688888  }  __toSring() {  //對象輸出 $echo $obj = new Class(); 時輸出  }

 __set($var,$value) {
 //設置對象屬性 $obj->var = value 賦值
 //在給未定義的變量賦值時,__set() 會被調用。
 }
 __get($var) {
 //讀取對象屬性 $obj->var 獲取
 //讀取未定義的變量的值時,__get() 會被調用。
 }
 __isset($var) {
 //判斷對象內部屬性是否存在 isset($obj->var )。
 //當對未定義的變量調用isset() 或 empty()時,__isset() 會被調用。
 //自PHP 5.1.0起有效
 }
 __unset($var) {
 //釋放內部對象屬性 unset($obj->var)。
 //當對未定義的變量調用unset()時,__unset() 會被調用。
 //自PHP 5.1.0起有效
 }

__set_state(array $args) {
 //當調用var_export()時,這個靜態 方法會被調用。
 //本方法的惟一參數是一個數組,其中包含按array(‘property’ => value, …)格式排列的類屬性。
 //自PHP 5.1.0起有效
 }
 __sleep() {
 //序列化前奏方法 return array($var1,$var2);
 }
 __wakeup() {
 //反序列化前奏方法 $this->var = ‘other_value’
 }
 }

補充:一個類外面使用的自動加載方法: 

__autoload($classname) {
 require(PATH.$classname.’_class.php’);
 }
相關文章
相關標籤/搜索