Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类实例上的PHP闭包_Php_Oop_Closures_Anonymous Function - Fatal编程技术网

类实例上的PHP闭包

类实例上的PHP闭包,php,oop,closures,anonymous-function,Php,Oop,Closures,Anonymous Function,如果我有一门课,比如: class MyClass { public function foo() { echo "foo"; } } 然后在类外部实例化它并尝试在其中创建匿名函数: $mine = new MyClass(); $mine->bar = function() { echo "bar"; } 然后试着像$mine->bar()那样调用它,我得到: 致命错误:调用中未定义的方法MyClass::bar() 如何在类实例上创建匿名函数

如果我有一门课,比如:

class MyClass
{
   public function foo() 
   {
      echo "foo";
   }
}
然后在类外部实例化它并尝试在其中创建匿名函数:

$mine = new MyClass();

$mine->bar = function() {
   echo "bar";
}
然后试着像
$mine->bar()
那样调用它,我得到:

致命错误:调用中未定义的方法MyClass::bar()

如何在类实例上创建匿名函数/闭包?


旁白:在你告诉我应该重新考虑我的逻辑或正确使用接口和OOP之前,在我的例子中,它是一种方便的方法,适用于bastardized类的这个特定实例,试图清理遗留过程应用程序。是的,我使用的是PHP 5.3+

请参阅我的博客文章:

您需要添加一个神奇的功能:

public function __call($func, $args) {
    return call_user_func($this->$func, $args);
}
问题在于,在此构造中,您可以从公共范围调用私有方法。 我建议not只需将新变量添加到未定义的类中。您可以使用magic
\u set
函数避免这种情况,并捕获容器(=数组,如我的博客文章中所述)中所有未定义的变量,并将call\u user\u func行为更改为仅在数组内调用:

// inside class:
public $members = array();

public function __call($func, $args) {
    // note the difference of calling only inside members:
    return call_user_func($this->members[$func], $args);
}

\u呼叫

这会奏效的

class Foo {

    public $bar;
    public function __construct()
    {
        $this->bar = function()
        {
            echo 'closure called';
        };

        $this->bar();
    }

    public function __call($method, $args) {
        return call_user_func($this->$method, $args);
    }

}

new Foo();

正在创建该函数。 PHP在调用它时遇到问题

肮脏,但有效:

$f = $mine->bar;
$f();

伟大的碰巧这个类扩展了一个实现了神奇方法的类,所以添加这个就不费吹灰之力了。我做的一个补充是在实际调用它之前检查
is\u callable()
。谢谢这可以在某些方面进行扩展,但你会得到它背后的想法B-)先到先得:)有趣。让我想起了动态名称空间的问题。在实例化之前,必须先将其放入变量中,如$ns=“\\App\\Lib\\”$myClass$object=new$ns()`@cillosis您可以(至少在PHP5.4中)使用括号:
$object=new{$ns}()与fluent类相同:不起作用:
$x=new xxx()->method()有效:
$x=(新的xxx())->method()