关于Laravel中的Macros
这些宏背后的想法是在运行时为Laravel的内置类添加功能,以便以后可以全局使用它们。换句话说,效果与使用继承相同。
Laravel宏
\Illuminate\Support\Str::macro('isLength', function (string $string, int $length) {
return strlen($string) === $length;
});
继承
class MyStr extends \Illuminate\Support\Str
{
public static function isLength(string $string, int $length): bool
{
return strlen($string) === $length;
}
}
用途
\Illuminate\Support\Str::isLength('test', 4);
MyStr::isLength('test', 4);
我想知道这和常规继承有什么区别(不包括在运行时添加的方法),因为如果我使用继承,效果完全相同。
那么,这些方法之间的区别是什么,以及每种方法的优点/缺点,如果有的话,因为它看起来像是为了艺术而艺术。
1条答案
按热度按时间nlejzf6q1#
Laravel中的宏来自
Macroable
trait,它覆盖了__call
和__callStatic
函数。然而,使用宏,你不能覆盖现有的方法。如果一个方法已经存在,那么就不会调用魔术函数,所以没有宏函数可以被定义来代替它。虽然这是一个非常古怪的方式来提供额外的功能,但是有时候这是添加东西的最快方式(因为你可以在服务提供者中调用SomeClass::macro('myFunction', ...)
)。然而,在现有类上进行扩展可以为IDE提供更多的可能性和更好的代码帮助,并且是添加功能的正确方法。但正如您所指出的,您必须自己显式引用新类。
总之,这取决于情况:更改越大,您越有可能希望使用继承:)