2016-09-24 7 views
-1

実行時にメソッドを作成してクラスに追加したいと考えています。さて、私はそれの文脈を説明しましょう。クラス内での動的メソッドの作成

私は文字列の配列を持っています。この配列に基づいて、私は、たとえば、その文字列に応じて異なる機能を持つメソッドを作成したい。

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

PHPはメソッドcreate_function()を持っていますが、それは私が興味がないAnnonymousの機能を、作成します。私は、MyClass->apple()のように呼び出すことができるようにしたい。

これは可能ですか?

答えて

1

PHPにはcreate_method()という機能はありません。create_function()と考えているかもしれません。しかし、PHPクラスには、オブジェクトのための__call()というアクセスできないメソッドの関数呼び出しを呼び出すことができる魔法のメソッドがあり、静的クラスのメソッドには__callStatic()もあります。

は、オブジェクトコンテキストでアクセスできないメソッドを呼び出すとトリガされます。

__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. 
+0

は、私はCREATE_METHODを入力欠場。申し訳ありません –

+0

このアプローチを使用して、関数の定義は、kwown配列のサイズと値を使用して行う必要がありますか? –

+0

いいえ、PHP配列は動的にサイズ変更されます。 – Sherif

関連する問題