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

Ash*_*gan 6 php static static-methods call

我有一个关于一个奇怪的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'));
Run Code Online (Sandbox Code Playgroud)

第一个var转储的结果是:"User :: __ call"和第二个:"Foo :: __ callStatic"

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

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

谢谢

Edw*_*win 1

这只是当您调用call_user_func.

当您第一次调用该can函数时,您位于类User上下文中,并且它将需要__call. 在第二次调用中,您的上下文来自第二个类之外,因此它需要__callStatic. 检查回调手册调用 call-user-func

例如代码

<?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'));
Run Code Online (Sandbox Code Playgroud)

将返回:

string(12) "User::__call" 
string(17) "Foo::__callStatic" 
string(18) "User::__callStatic" 
string(12) "Foo::__call?"
string(18) "User::__callStatic"
string(17) "Foo::__callStatic"
Run Code Online (Sandbox Code Playgroud)

  • 范围是错误的词,*上下文*是您要寻找的内容。那么问题是为什么 PHP 决定“User”上下文中的“call_user_func(['User', ...])”是实例调用,而在另一个上下文中它是静态的。 (2认同)