首頁  >  文章  >  後端開發  >  __call、__set 和 __get的用法

__call、__set 和 __get的用法

巴扎黑
巴扎黑原創
2016-11-29 11:28:281139瀏覽

1. __call的用法

PHP5 的物件新增了一個專用方法 __call(),這個方法用來監視一個物件中的其它方法。如果你試著呼叫一個物件中不存在的方法,__call 方法將會被自動呼叫。  

例:__call

<?php  
class foo {  
    function __call($name,$arguments) {  
        print("Did you call me? I&#39;m $name!<br>");  
        print_r($arguments);  
        print("<br><br>");  
    }  
  
    function doSecond($arguments)  
    {  
        print("Right, $arguments!<br>");  
    }  
}   
   
$test = new foo();  
$test->doFirst(&#39;no this function&#39;);  
$test->doSecond(&#39;this function exist&#39;);  
?>

2. __call 實現「過載」動作

 這個特殊的方法可以被用來實現「過載(overloading)」的動作,這樣你就可以檢查你的參數並且透過一個調用私有的方法來傳遞參數。

例:使用__call 實現「過載」動作  

<?php  
class Magic {  
    function __call($name,$arguments) {  
        if($name==&#39;foo&#39;) {  
            if(is_int($arguments[0])) $this->foo_for_int($arguments[0]);  
            if(is_string($arguments[0])) $this->foo_for_string($arguments[0]);  
        }  
    }     
      
    private function foo_for_int($x) {  
        print("oh an int!");  
    }     
          
    private function foo_for_string($x) {  
        print("oh a string!");  
    }  
}   
  
$test = new Magic();  
$test->foo(3);  
$test->foo("3");  
?>

3.  物件重載  5. __set 和__get的用法

 

這是一個很棒的方法,__set 和__get 方法可以用來捕捉一個物件中不存在的變數和方法。

 

例: __set 與 __get

 

<?php  
/*__call(string $name,array $arg)的用法 
*当调用一个不可访问的方法的时候调用$name是方法名称 $arg是个数组包含要传递给方法的参数 
*/  
class Account{  
    private $user=1;  
    private $pwd=2;  
    public function __call($name,$arg){  
        switch(count($arg)){  
            case 2:  
                echo $arg[0]*$arg[1],PHP_EOL;  
                break;  
            case 3:  
                echo array_sum($arg),PHP_EOL;  
                break;  
            default:  
                echo "参数不对",PHP_EOL;  
                break;  
        }  
    }  
  
}  
    $a= new Account();  
    //这里模拟了重载  
    //重载:一个类中可以定义参数列表不同但名字相同的多个方法  
    $a->make(5);  
    $a->make(5,6);

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn