在类中创建动态方法

时间:2016-09-24 17:08:44

标签: php oop

我想在运行时创建方法并将它们添加到类中。好的,让我解释一下它的背景。

我有一个字符串数组。基于这个数组,我想根据该字符串创建具有不同功能的方法,例如。

$fruits = ["apple", "pear", "avocado"];
foreach($fruits as $fruit){
  if($fruit == "apple"){
    // create function doing X
  }else{
        // create function doing Y
   }
}

Php有方法create_function(),但它创建了一个我不感兴趣的匿名函数。我希望能够调用MyClass->apple()

这可能吗?

1 个答案:

答案 0 :(得分:1)

PHP没有名为create_method()的功能,你可能会想到create_function()。但是,PHP类确实有一个魔术方法,允许您对对象的__call()不可访问的方法调用函数调用,静态类方法也有__callStatic()

  在对象上下文中调用不可访问的方法时会触发

__call()

     在静态上下文中调用不可访问的方法时会触发

__callStatic()

但重要的是区分在运行时动态添加方法的概念与在运行时动态创建代码的想法。例如,注册回调的概念通常是使用闭包的合理概念。

class Fruits {

    protected $methods = [];

    public function __call($name, $arguments) {
        if (isset($this->methods[$name])) {
            $closure = $this->methods[$name];
            return $closure(...$arguments);
        }
    }

    public function registerMethod($name, Callable $method) {
        $this->methods[$name] = $method;
    }

}

$apple = function($color) {
    return "The apple is $color.";
};

$pear = function($color) {
    return "The pear is $color.";
};

$avocado = function($color) {
    return "The avocado is $color.";
};

$methods = ["apple" => $apple, "pear" => $pear, "avocado" => $avocado];

$fruits = new Fruits;

foreach($methods as $methodName => $method) {
    $fruits->registerMethod($methodName, $method);
}

echo $fruits->apple("red"), "\n";
echo $fruits->pear("green"), "\n";
echo $fruits->avocado("green"), "\n";

输出

The apple is red.
The pear is green.
The avocado is green.