1. __call的用法
PHP5 的物件新增了一個專用方法 __call(),這個方法用來監視一個物件中的其它方法。如果你試著呼叫一個物件中不存在的方法,__call 方法將會被自動呼叫。
例:__call
<?php class foo { function __call($name,$arguments) { print("Did you call me? I'm $name!<br>"); print_r($arguments); print("<br><br>"); } function doSecond($arguments) { print("Right, $arguments!<br>"); } } $test = new foo(); $test->doFirst('no this function'); $test->doSecond('this function exist'); ?>
2. __call 實現「過載」動作
這個特殊的方法可以被用來實現「過載(overloading)」的動作,這樣你就可以檢查你的參數並且透過一個調用私有的方法來傳遞參數。
例:使用__call 實現「過載」動作
<?php class Magic { function __call($name,$arguments) { if($name=='foo') { 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);