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

Per*_*ika 23 php oop static class late-static-binding

为什么有些人创建一个返回new static而不是将所有方法设为静态的方法?使用该方法返回新静态的原因是什么?我不是问静态和自我之间有什么区别,或者静态和自我意味着什么.例如,这是一个简单的类:

<?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";
    }

}
Run Code Online (Sandbox Code Playgroud)

如您所见,有一个静态方法make()返回新的静态.然后,有些人会调用其他方法:

$regex = Expression::make()->find('www');
Run Code Online (Sandbox Code Playgroud)

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

dec*_*eze 27

new static 从当前类中实例化一个新对象,并使用后期静态绑定(如果该类是子类,则实例化子类,我希望您理解这一点).

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

class Foo {
    public function __construct(BarInterface $bar, array $baz = []) { ... }
}
Run Code Online (Sandbox Code Playgroud)

使用替代构造函数允许您提供不同的默认值或方便快捷方式来实例化此类,而无需提供这些特定参数和/或能够提供替代构造函数将转换为规范参数的不同参数:

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]);
    }

}
Run Code Online (Sandbox Code Playgroud)

现在,即使你的规范构造函数需要一堆复杂的参数,你也可以创建一个类的默认实例,这对于大多数用途来说可能都没问题,只需使用Foo::getDefault().

PHP中用于此的规范示例是DateTimeDateTime::createFromFormat.

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


Ser*_*kin 5

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
Run Code Online (Sandbox Code Playgroud)

  • 不是问题的真正答案,但仍然有用,清楚地显示了 self 和 static 之间的区别。 (9认同)
  • 看来这个答案是在没有归属的情况下无耻地复制的,然后从 @BoltClock /sf/answers/363835881/ 的另一个更完整的答案错误地修改了答案,然后对答案进行了正确性编辑 - 回到原来的答案。我尝试编辑归因和更完整的解释,但编辑队列已满。 (4认同)