为什么返回新的静态? (PHP)

为什么有些人创建一个返回新静态的方法,而不是使所有方法都是静态的? 有什么理由让该方法返回新的静态我不是问静态和自我有什么区别,或者静态和自我意味着什么。 例如,这里有一个简单的类:

<?php

class Expression
{
    public static function make()
    {
        return new static;
    }


    public function find($value)
    {
        return '/' . $value .'/';
    }

    public function then($value)  
    {
        return $this->find($value);
    }

    public function hi($value)  
    {
        return "hi";
    }

}

正如你所看到的,有一个静态方法make()返回新的静态 。 然后,有些人称这样的其他方法:

$regex = Expression::make()->find('www');

它的目的是什么? 我看到这里我们不使用新的表达式语法,如果这是重点 - 那么为什么他们没有使所有的方法,例如,静态? 有什么区别,有什么理由让该方法返回新的静态?


new static实例化一个新的对象从当前类,并与后期静态绑定(实例化子类,如果类是子类,我希望你明白这一点)。

在一个返回新实例的类上有一个static方法是另一个构造函数。 意思是,通常你的构造函数是public function __construct ,通常它需要一些参数:

class Foo {
    public function __construct(BarInterface $bar, array $baz = []) { ... }
}

拥有一个可选的构造函数允许您提供不同的默认值或方便捷径来实例化此类,而无需提供这些特定参数和/或能够提供其他构造函数将转换为规范变量的不同参数:

class Foo {

    public function __construct(BarInterface $bar, array $baz = []) { ... }

    public static function fromBarString($bar) {
        return new static(new Bar($bar));
    }

    public static function getDefault() {
        return new static(new Bar('baz'), [42]);
    }

}

现在,即使您的规范构造函数需要大量复杂参数,您也可以创建类的默认实例,对于大多数用途来说,这可能很好,只需使用Foo::getDefault()

PHP中的规范示例是DateTimeDateTime::createFromFormat

在你的具体例子中,替代构造函数实际上并没有做任何事情,所以它是多余的,但我期望这是因为它是一个不完整的例子。 如果确实有一个替代构造函数除了new static之外什么也不做,它可能只是作为方便的语法(new Foo)-> ,我觉得这是很有问题的。


get_called_class() )。

class A {
    public static function get_self() {
        return new self();
    }

    public static function get_static() {
        return new static();
    }
}

class B extends A {}

echo get_class(B::get_self());  // A
echo get_class(B::get_static()); // B
echo get_class(A::get_self()); // A
echo get_class(A::get_static()); // A
链接地址: http://www.djcxy.com/p/58057.html

上一篇: Why return new static? (PHP)

下一篇: ground between self and static?