直接上代码:
class A{
public static function __callStatic($name, $arguments)
{
echo $name.'静态方法不存在!';
}
public function test()
{
echo 'test 方法';
}
}
A::test();
上面代码输出什么?
结果调用了 test()方法,并没有执行__callStatic()方法,我的本意是想用__callStatic()处理A::test()
这种错误的调用情况,这种情况该怎么处理呢?
1
gouchaoer 2017-09-21 18:30:51 +08:00 via Android
印象里有个 rfc 说这个,不过为了兼容社区不太可能改
|
2
gouchaoer 2017-09-21 18:32:00 +08:00 via Android
java 里 object.staticMethod()也类似,都别改了
|
3
wjfz 2017-09-21 19:13:06 +08:00
1、__callStatic 没有影响对 test 的调用,**只要**方法中没有$this 伪变量,就可以通过双冒号访问。
只有当报错级别为 E_STRICT 时会报 warning,参考: http://php.net/manual/zh/language.oop5.basic.php 2,__callStatic 的作用不是看方法存不存在,而是有没有“权限”访问到。 > 在对象中调用一个不可访问方法时,__call() 会被调用。 > 在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用。 参考: http://php.net/manual/zh/language.oop5.overloading.php#object.callstatic 目标方法非 public 时__callStatic 才会起作用。 ```php <?php class A{ public static function __callStatic($name, $arguments) { echo "{$name}静态方法不存在!\n"; } public function test() { echo "test 方法\n"; } public static function test2() { echo "test2 方法\n"; } private static function test3() { echo "test3 方法\n"; } protected static function test4() { echo "test4 方法\n"; } } A::test(); A::test2(); A::test3(); A::test4(); ``` 刚刚现查的,大神们要是看出什么错误记得指出。 |
4
linxl 2017-09-22 10:25:36 +08:00
php 手册里都说了 "当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。"
你的 test() 是 public , 自然会被调用. http://php.net/manual/zh/language.oop5.overloading.php |
5
coooooooode 2017-09-22 12:10:39 +08:00
照你这样说
public function a();和 public static function a(); 可以同时存在? 楼上说的对,我记得魔术方法是当你的方法名称不存在这个类中的时候才会调用。 |
6
chemf 2017-09-30 12:21:41 +08:00
PHP 是可以静态调用非静态方法的,5.3 之前的某个版本允许,之后的不建议使用
|