在同一个类中调用__call而不是__callstatic,而不是调用另一个类

时间:2017-09-01 13:09:01

标签: php static call static-methods

我有一个关于一个奇怪的comportement的问题。

看看这段代码:

class User
{
    public function can($name) {
        return call_user_func(array($name, 'test'));
    }

    public static function __callStatic($name, $args) {
        return 'User::__callStatic';
    }

    public function __call($name, $args) {
        return 'User::__call';
    }
}

class Foo
{
    public static function __callStatic($name, $args) {
        return 'Foo::__callStatic';
    }

    public function __call($name, $args) {
        return 'Foo::__call?';
    }
}

$u = new User();
var_dump($u->can('User'));
var_dump($u->can('Foo'));

第一个var转储的结果是:    “用户:: __叫” 第二个:    “富:: __ callStatic”

为什么第一个不调用函数__callStatic?

PS:我看其他主题,但没有找到解释。

由于

2 个答案:

答案 0 :(得分:1)

调用call_user_func时,这只是范围问题。

当您第一次调用can函数时,您处于班级User上下文中,它将需要__call。在第二次调用中,您的上下文来自第二个类之外,因此它需要__callStatic。查看callback manualcall-user-func

例如code

<?php

class User
{
    public function can($name) {
        return call_user_func(array($name, 'test'));
    }

    public static function __callStatic($name, $args) {
        return 'User::__callStatic';
    }

    public function __call($name, $args) {
        return 'User::__call';
    }
}

class Foo
{
    public function can($name) {
        return call_user_func(array($name, 'test'));
    }

    public static function __callStatic($name, $args) {
        return 'Foo::__callStatic';
    }

    public function __call($name, $args) {
        return 'Foo::__call?';
    }
}

    function can($name) {
        return call_user_func(array($name, 'test'));
}

$u = new User();
$f = new Foo();
var_dump($u->can('User'));
var_dump($u->can('Foo'));
var_dump($f->can('User'));
var_dump($f->can('Foo'));
var_dump(can('User'));
var_dump(can('Foo'));

将返回:

string(12) "User::__call" 
string(17) "Foo::__callStatic" 
string(18) "User::__callStatic" 
string(12) "Foo::__call?"
string(18) "User::__callStatic"
string(17) "Foo::__callStatic"

答案 1 :(得分:0)

谢谢你们两位。

是的,这是由于上下文,这是PHP的一个错误(修复后来的版本,而不是7.2,所以...;))或者它只是一个奇怪的comportement。 / p>

@Edwin我知道如果我将函数can()转换为静态,它会起作用,但我不想这样做。要解决&#34;问题&#34;,我只在调用自我类的情况下调用函数__callStatic()中的函数can()

if($name instanceof User) return self::__callStatic($functionName, $args);