從網上找的。
引自:http://bbs.17php.com/show_title.php?id=1443
PHP5 的對象新增了一個專用方法 __call(),這個方法用來監視一個對象中的其它方法。如果你試著調用一個對象中不存在的方法,__call 方法將會被自動調用。
例七:__call
class foo {
function __call($name,$arguments) {
print("Did you call me? I'm $name!");
}
} $x = new foo();
$x->doStuff();
$x->fancy_stuff();
?>
這個特殊的方法可以被用來實現“過載(overloading)”的動作,這樣你就可以檢查你的參數並且通過調用一個私人的方法來傳遞參數。
例八:使用 __call 實現“過載”動作
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!");
}
} $x = new Magic();
$x->foo(3);
$x->foo("3");
?>
引自:
_call和___callStatic這兩個函數是php類 的預設函數,
__call() 在一個對象的上下文中,如果調用的方法不能訪問,它將被觸發
__callStatic() 在一個靜態上下文中,如果調用的方法不能訪問,它將被觸發
執行個體:
abstract class Obj
{
protected $property = array();
abstract protected function show();
public function __call($name,$value)
{
if(preg_match("/^set([a-z][a-z0-9]+)$/i",$name,$array))
{
$this->property[$array[1]] = $value[0];
return;
}
elseif(preg_match("/^get([a-z][a-z0-9]+)$/i",$name,$array))
{
return $this->property[$array[1]];
}
else
{
exit("
;Bad function name '$name' ");
}
}
}
class User extends Obj
{
public function show()
{
print ("Username: ".$this->property['Username']."
;");
//print ("Username: ".$this->getUsername()."
;");
print ("Sex: ".$this->property['Sex']."
;");
print ("Age: ".$this->property['Age']."
;");
}
}
class Car extends Obj
{
public function show()
{
print ("Model: ".$this->property['Model']."
;");
print ("Sum: ".$this->property['Number'] * $this ->property['Price']."
;");
}
}
$user = new User;
$user ->setUsername("Anny");
$user ->setSex("girl");
$user ->setAge(20);
$user ->show();
print("
;
;");
$car = new Car;
$car ->setModel("BW600");
$car ->setNumber(5);
$car ->setPrice(40000);
$car ->show();
?>