【问题标题】:Php Dynamic class methodsPHP动态类方法
【发布时间】:2018-07-08 02:16:23
【问题描述】:

我有一个数组(类属性),它存储 PHP 方法(即“闭包”类)。就这样。

$this->methods[$name]=$action;

$action 是函数。

当我尝试调用像$this->methods[$name]() 这样的函数时,我无法访问函数内部的$this 指针。

为什么会出现这个问题,我该如何解决。

【问题讨论】:

  • 你为什么希望闭包有$this
  • 我猜你的代码中需要Closure::bind
  • 我希望函数作为类方法执行。关闭这个术语是否令人困惑?我没有返回任何回调。它将一个函数附加到一个数组,然后在稍后的时间点,在类本身内部调用同样的函数。
  • 如果函数没有被定义为类方法,它就没有$this。仅仅因为您从作为对象属性的数组执行它并不能使其成为类方法。这不是 Javascript。
  • 实际上是Closure::call

标签: php php-closures


【解决方案1】:

你应该看看“魔法方法”。 http://php.net/manual/en/language.oop5.overloading.php#object.call

也许你可以试试这个实现(未测试):

class MyClass
{
    public function __call($method_name, $arguments)
    {
        // $method_name is case sensitive
        $this->$method_name($arguments);
    }
   public function doSomethingCool($param){
      echo 'something cool happened';
   }
}

$obj = new MyClass();
$method = 'doSomethingCool';
$obj->$method('robert', 42)

【讨论】:

    【解决方案2】:

    我不知道我是否理解你的问题。如果我这样做了,我不知道您为什么要这样做,但是:

    <?php
    
    class Foo
    {
        protected $methods     = [];
    
        public    $some_number = 42;
    
        public function callFunction($action)
        {
            if ( ! array_key_exists($action, $this->methods)) {
                throw new Exception(sprintf('Method %s doesn\'t exist!', $action));
            }
    
            $this->methods[$action]($this);
        }
    
        public function addFunction(closure $closure, $label)
        {
            $this->methods[$label] = $closure;
        }
    }
    
    $foo = new Foo();
    
    $foo->addFunction(function (Foo $context) {
        echo $context->some_number;
    }, 'test');
    
    $foo->callFunction('test');
    

    【讨论】:

    • 我会帮你举个例子。我正在构建一个具有一些内置模板标签的模板解析器。在某个时间点,如果用户想要使用他自己的模板标签,我们会提供一个方法,在该方法中它接受函数作为参数(这将是标签解析逻辑)。现在,比如说,该函数必须访问任何解析器对象属性,然后应该可以访问当前对象,对吧?我有上述场景的工作代码。 @弗里德里希·罗尔
    • 那么为什么不使用 ObjectProperites 调用用户闭包。或者创建一个像MyTemplateVarBag 这样的辅助模型,然后像这样调用他的函数。 $userClosure(MyTemplateVarBag $var);
    • 我需要访问类的私有方法/属性。因此,如果闭包可以访问$this 指针会更好。我已经为此编写了一个工作代码。但是当我复制时,它失败了。
    • 以上面相同的例子。我有一个用户定义的模板标签,其中包含嵌套的模板标签。为了处理用户定义模板中的模板块,我们有一个私有方法。我有上面的工作代码。我正在尝试复制相同的逻辑,例如参数解析,但不起作用。
    猜你喜欢
    • 2014-07-12
    • 2013-12-06
    • 1970-01-01
    • 2018-03-21
    • 2010-09-20
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 2016-02-05
    相关资源
    最近更新 更多