__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 ),
但在面向对象的魔术方法中却可以。
本文介绍了PHP中的方法重载技术,包括__call()和__callStatic()方法的应用。通过实例展示了如何利用这两种方法处理对象中不存在的方法调用,以及如何区分它们与方法重写的区别。
354

被折叠的 条评论
为什么被折叠?



