欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

php macroable

李中冰1年前7瀏覽0評論

PHP里的宏(Macro)指的是可以在運行期間動態(tài)地為已有類或?qū)ο笤黾踊蛱鎿Q方法、屬性、閉包等操作的能力。而在實際開發(fā)中,經(jīng)常需要對第三方組件或框架進行擴展或定制化,這時php macroable就變得尤為實用。

舉個例子,Laravel這個非常流行的PHP框架就提供了macroable的設(shè)計,它允許我們?yōu)槿我釲aravel自帶的類或第三方類添加新的方法,例如:

use Illuminate\Support\Str;
Str::macro('partAfter', function ($subject, $delimiter) {
return array_reverse(explode($delimiter, $subject, 2))[0];
});
echo Str::partAfter('foo/bar/baz', '/');
// 輸出:baz

這段代碼通過調(diào)用Laravel默認自帶的輔助類Str,添加了一個新的以$delimiter為分隔符取字符串最后部分的方法partAfter,這樣在整個應(yīng)用程序中都可以使用了。

要實現(xiàn)macroable的設(shè)計,需要做出一些基礎(chǔ)性的改動,例如可以通過Trait來實現(xiàn)這種擴展,例如:

trait Macroable
{
protected static $macros = [];
public static function macro($name, $macro)
{
static::$macros[$name] = $macro;
}
public static function hasMacro($name)
{
return isset(static::$macros[$name]);
}
public function __call($method, $parameters)
{
if (static::hasMacro($method)) {
$macro = static::$macros[$method];
if ($macro instanceof Closure) {
return call_user_func_array(Closure::bind($macro, $this, get_class()), $parameters);
} else {
return call_user_func_array($macro, $parameters);
}
} else {
throw new BadMethodCallException("Method {$method} does not exist.");
}
}
}

這個traits實現(xiàn)了macro和hasMacro兩個基本方法,同時Override了__call方法,每次調(diào)用這個magic method時都會檢測當前是否有與調(diào)用的方法名匹配的macro,如果存在,則調(diào)用macro,否則返回BadMethodCallException。

此外,為了讓一個對象具有macroable的能力,只需要在其class definition里use這個trait就可以了:

class MyObject
{
use Macroable;
}

這樣MyObject就具有了macroable的能力,例如可以這樣為它添加新的方法:

MyObject::macro('myMethod', function () {
// 業(yè)務(wù)邏輯
});

至此,我們已經(jīng)簡單地了解了php macroable的實現(xiàn)方式和用法,實際使用的時候可以根據(jù)具體情況進行更靈活的設(shè)計和定制化。