php Laravel宏与继承

oxalkeyp  于 2023-04-19  发布在  PHP
关注(0)|答案(1)|浏览(100)

关于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);

我想知道这和常规继承有什么区别(不包括在运行时添加的方法),因为如果我使用继承,效果完全相同。
那么,这些方法之间的区别是什么,以及每种方法的优点/缺点,如果有的话,因为它看起来像是为了艺术而艺术。

nlejzf6q

nlejzf6q1#

Laravel中的宏来自Macroable trait,它覆盖了__call__callStatic函数。然而,使用宏,你不能覆盖现有的方法。如果一个方法已经存在,那么就不会调用魔术函数,所以没有宏函数可以被定义来代替它。虽然这是一个非常古怪的方式来提供额外的功能,但是有时候这是添加东西的最快方式(因为你可以在服务提供者中调用SomeClass::macro('myFunction', ...))。
然而,在现有类上进行扩展可以为IDE提供更多的可能性和更好的代码帮助,并且是添加功能的正确方法。但正如您所指出的,您必须自己显式引用新类。
总之,这取决于情况:更改越大,您越有可能希望使用继承:)

相关问题