日期:2006-09-26 作者:喜騰小二 來源:PHPChina
第19章 類與物件(PHP5)之七:多載(Overloading)
方法調用和成員訪問都能透過__call,__get和__set方法被載入。這些方法將隻有當妳試圖訪問不包括成員或方法的物件或繼承物件時觸發。不是所有的多載方法都必須被定義為static.
從PHP
5.1.0開始也可以透過__isset()和__unset()方法逐個多載isset()和unset()函式。
成員函式多載(Member
overloading)
void __set ( string name, mixed value )
mixed __get ( string
name )
bool __isset ( string name )
void __unset ( string name
)
類成員可以透過定義這些指定的特定方法載入類中的自訂程式碼。$name參數被用來命名變數,這些變數必須是被設定的或返回的。__set()方法的$value參數指定設定$name的物件的值。
例子
19-18.使用__get,__set,__isset和__unset多載的例子
PHP程式碼如下:
php
class Setter
{ public $n;
private $x = array("a" => 1, "b" => 2, "c" => 3);
private function __get($nm)
{ echo "Getting [$nm]
";
if (isset($this->x[$nm]))
{ $r = $this->x[$nm];
print "Returning: $r
";
return $r;
} else { echo "Nothing!
"; }
}
private function __set($nm, $val)
{ echo "Setting [$nm] to $val
";
if (isset($this->x[$nm]))
{ $this->x[$nm] = $val;
echo "OK!
";
} else { echo "Not OK!
"; }
}
private function __isset($nm)
{ echo "Checking if $nm is set
";
return isset($this->x[$nm]);
}
private function __unset($nm)
{ echo "Unsetting $nm
";
unset($this->x[$nm]);
}
}
$foo = new Setter();
$foo->n = 1;
$foo->a = 100;
$foo->a++;
$foo->z++;
var_dump(isset($foo->a)); //true
unset($foo->a);
var_dump(isset($foo->a)); //false
// this doesn't pass through the __isset() method
because 'n' is a public property
var_dump(isset($foo->n));
var_dump($foo);
?>
上例將輸出:
CODE:
Setting [a] to 100
OK!
Getting
[a]
Returning: 100
Setting [a] to 101
OK!
Getting
[z]
Nothing!
Setting [z] to 1
Not OK!
Checking if a is
set
bool(true)
Unsetting a
Checking if a is
set
bool(false)
bool(true)
object(Setter)#1 (2)
{
["n"]=>int(1)["x:private"]=>array(2) {
["b"]=>
int(2)
["c"]=>
int(3)
}
}
方法多載(Method
overloading)
mixed __call ( string name, array arguments
)
類方法可以透過定義這些指定的特定方法載入類中的自訂程式碼。$name參數被用來命名那些被請求的函式名。Arguments在定義為array的函式的$arguments參數中將被傳遞。從__call()方法返回的值將被返回方法的訪問者。
例子
19-19.使用__call多載的實例
PHP程式碼如下:
php
class Caller
{ private $x = array(1, 2, 3);
public function __call($m, $a)
{ print "Method $m called:
";
var_dump($a);
return $this->x;
}
}
$foo = new Caller();
$a = $foo->test(1, "2", 3.4, true);
var_dump($a);
?>
上例將輸出:
CODE:
Method test called:
array(4) {
[0]=>
int(1)
[1]=>
string(1) "2"
[2]=>
float(3.4)
[3]=>
bool(true)
}
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}