__call()
当对象访问不存在的方法时,__call()方法会被自动调用
__callStatic()
当对象访问不存在的静态方法时,__callStatic()方法会被自动调用
这两个方法在PHP里面也叫方法的重载(overloading)
注意区分重写(overwrite)
通过这两个方法,同一个方法的名称的调用可以对应不同的方法实现
<?php
class MagicTest{
//方法重载
//这个方法的参数第一个就是调用的方法的名称,
//第二个参数是方法调用的参数组成的数组
public function __call($name,$arguments) {
echo " Calling ".$name." whith parameters:".implode(", ",$arguments);
}
} $obj = new MagicTest();
$obj->runTest("para1","para2");
输出: Calling runTest whith parameters:para1, para2
MagicTest() 是不存在 runTest() 函数的,这时自动调用 __call() 函数
<?php
class MagicTest{
public static function __callStatic($name,$arguments) {
echo "Static Calling ".$name." whith parameters:".implode(", ",$arguments);
}
} $obj = new MagicTest();
MagicTest::runTest("para1","para2");
还有值得说的一点就是,两个函数可以同时出现
<?php
class MagicTest{
public function __call($name,$arguments) {
echo " Calling ".$name." whith parameters:".implode(", ",$arguments)."<br/>";
}
public static function __callStatic($name,$arguments) {
echo "Static Calling ".$name." whith parameters:".implode(", ",$arguments);
}
} $obj = new MagicTest();
$obj->runTest("para1","para2");
MagicTest::runTest("para1","para2");
输出:
Calling runTest whith parameters:para1, para2
Static Calling runTest whith parameters:para1, para2
正常时候是不允许同时出现两个相同的名称的( runTest ),
但在面向对象的魔术方法中却可以。