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