PHPのカリー化と部分的なアプリケーションについての記事に触発されて、メソッドの部分的なアプリケーション、つまり関数ではなくメソッドを実装することに思いつきました。
はじめに
最初に、カリー化の定義は、関数を引数のペアから、一度に1つの引数を取る関数への変換として与えられます。 この変換はM.シャインフィンケルとG.フレーゲによって導入され、H。カレーに敬意を表してその名前が付けられました。 この定義をメソッドに拡張してみましょう。 このアイデアの実装は2バイトと同じくらい簡単ですが、大きな可能性をもたらします。 これは、メソッドの本体を明示的に記述することなく、いわば実行時にメソッドを作成できる場合のメタプログラミングの共有です。
ソースコード
したがって、ここでは
カリー化メソッドを備えたクラスであり、クラスメソッドの部分的な使用を実装しています。 同時に、擬似メソッドが作成されます。これは、__ call()マジックメソッドを使用して(再び、scalamburil)呼び出されます。
abstract class ACurry { protected function curry($callback, $args = array()) { return function() use($callback, $args) { $methodInfo = new ReflectionMethod(get_class($callback[0]), $callback[1]); if (count(array_merge($args, func_get_args())) >= $methodInfo->getNumberOfParameters()) { return call_user_func_array($callback, $args); } else { return $callback[0]->curry($callback, $args); } }; } public function createMethod($methodName, $curryMethodName, $args = array()) { $this->$methodName = $this->curry(array($this, $curryMethodName), $args); return $this; } public function __call($name, $args) { if (property_exists($this, $name) && is_callable($this->$name)) { return call_user_func_array($this->$name, $args); } } }
例
ここに私の応用例があります、それは同志
ボディグリムの例との類推によって作られてい
ます <?php require_once 'ACurry.php'; class Masses extends ACurry{ public function __construct(){ $this->createMethod('ironCube', 'cube', array(7.8)); } public function get($density, $length, $width, $height){ return $density * $length * $width * $height; } public function cube($density, $length){ return $this->get($density, $length, $length, $length); } } $masses=new Masses(); echo $masses->ironCube(2);
この例では、ironCube()擬似メソッドは、辺が2 cmの鉄立方体の重量をグラムで計算します(ご存じのとおり、鉄の密度は7.8 g /cm³です)。
まとめ
そのため、一種のオブジェクト指向の機能的メタプログラミングが判明しました。 もちろん、クラスをトレイトに変換すると、この手法の範囲が大幅に拡大します。これにより、既に継承されたメソッドをカリー化できます。