(spark at limao dot com dot br) 發佈了一個很棒的程式碼片段,可以動態產生方法,作為 StdClass 的多功能擴展,這裡有一個改進版本。
這個版本更快,針對閉包進行了優化,並且只適用於閉包。相容版本:>= PHP 5.6
<?php
class Dynamic extends \stdClass
{
public function __call($key, $params)
{
if ( ! isset($this->{$key})) {
throw new Exception("呼叫未定義的方法 " . __CLASS__ . "::" . $key . "()");
}
return $this->{$key}->__invoke(... $params);
}
}
?>
使用方法範例
<?php
$dynamic = new Dynamic();
$dynamic->anotherMethod = function () {
echo "Hey there";
};
$dynamic->randomInt = function ($min, $max) {
return mt_rand($min, $max); };
var_dump(
$dynamic->randomInt(1, 11),
$dynamic->anotherMethod()
);
?>
這個方法可以接受陣列、字串和閉包,但由於使用 call_user_func_array,速度會稍慢。
<?php
class Dynamic extends \stdClass
{
public function __call($key, $params)
{
if ( ! isset($this->{$key})) {
throw new Exception("呼叫未定義的方法 " . __CLASS__ . "::" . $key . "()");
}
return call_user_func_array($this->{$key}, $params);
}
}
?>
使用方法範例
<?php
$dynamic = new Dynamic();
$dynamic->myMethod = "thatFunction";
$dynamic->hisMethod = array($dynamic, "randomInt");
$dynamic->newMethod = array(SomeClass, "staticMethod");
$dynamic->anotherMethod = function () {
echo "Hey there";
};
$dynamic->randomInt = function ($min, $max) {
return mt_rand($min, $max); };
var_dump(
$dynamic->randomInt(1, 11),
$dynamic->anotherMethod(),
$dynamic->hisMethod()
);
?>