【问题标题】:callback invoked in class extension在类扩展中调用的回调
【发布时间】:2013-09-16 00:53:04
【问题描述】:

我正在通过 php 回调工作。我想我已经涵盖了基础知识,但是在类扩展中工作时,我仍然在某个地方碰壁了一段时间,因此是时候进行一些堆栈溢出 rubber duck programming...!

从类扩展调用回调:

class myClass {
    function cb_check($function) {
        call_user_func($this->$function);
    }

    static function myFunction() {
        var_dump("Hello World");
    }   
}

class myExtClass extends myClass {
    function cb_invoke() {
        $this->cb_check('myFunction');
    }
}

$x = new myExtClass;
$x->cb_invoke();

错误信息(或,通知和警告):

注意:未定义的属性:F:\test.php 中的 myExtClass::$myFunction 第 5 行

警告:call_user_func() 期望参数 1 是有效的回调, 第 5 行的 F:\test.php 中没有给出数组或字符串

第 5 行是上面的 call_user_func()

有人知道我在这里缺少什么吗?

提前谢谢你!

【问题讨论】:

  • call_user_func(array($this, $function));call_user_func('self::' . $function);

标签: php


【解决方案1】:

正如马克指出的那样,

call_user_func($this->$function);

应该替换为任一

call_user_func(array($this, $function));

call_user_func('self::' . $function);

谢谢,马克!

【讨论】:

    【解决方案2】:

    在使用静态类时,您应该必须使用范围解析运算符 :: 您不能直接创建实例。

    $x::myExtClass;
    

    试试看。

    【讨论】:

    • 抱歉,这行不通。更有可能导致另一个错误,例如 undefined class constant myExtClass 或类似的东西。
    【解决方案3】:

    出现错误是因为您已将 myFunction() 声明为 static。静态方法不属于类的任何特定实例,因此不能通过$this 变量访问。相反,您使用self::myFunction() 来调用静态方法。实现这一点的最简单方法是构建静态方法调用的字符串并将该字符串作为参数传递给call_user_func()。如果myFunction() 不是静态的,您的代码将按原样运行。

    class myClass {
        function cb_check($function) {
            // Build a static-method-style string
            call_user_func('self::' . $function);
        }
    
        static function myFunction() {
            var_dump("Hello World");
        }   
    }
    
    class myExtClass extends myClass {
        function cb_invoke() {
            $this->cb_check('myFunction');
        }
    }
    
    $x = new myExtClass;
    $x->cb_invoke();
    

    【讨论】:

    • As-written 在有或没有静态函数的情况下都不起作用。我已经尝试了两种方法,都导致了我的问题中提到的错误。但是,将函数与 self:: 链接为字符串可以使用和不使用静态声明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多