【问题标题】:Why return new static? (PHP)为什么要返回新的静态? (PHP)
【发布时间】:2016-09-24 10:37:07
【问题描述】:

为什么有些开发人员会创建一种返回new static的方法?有一个返回新静态的方法的原因是什么? 我不是在问 static 和 self 有什么区别,或者 static 和 self 是什么意思。例如,这里有一个简单的类:

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

}

如您所见,有一个 static 方法 ma​​ke() 返回 new static。然后,一些开发者调用其他方法是这样的:

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

这样做的目的是什么?我看到这里我们不使用 new Expression 语法,如果这就是重点 - 那么为什么不将所有方法都设为静态呢?有什么区别,有一个方法返回 new static(而其他方法不是静态的)的原因是什么?

【问题讨论】:

  • what means new static?的可能重复
  • New self vs. new static 的答案清楚地说明了差异。
  • @Ankur Tiwari 我不是staticself有什么区别,或者静态 & self 做。
  • @jeyoung 我的问题不在于新自我与新静态之间的区别......
  • @PeraMika 看起来你不明白new static() 的目的,但如果你明白了……它是为了重复使用。您可以在单个基类中定义静态 make 方法,并且您将拥有与派生类相同的功能。

标签: php class oop static late-static-binding


【解决方案1】:

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)-&gt;,我觉得这有问题。

【讨论】:

  • 现在我明白了它的目的,非常感谢!
  • 我猜构造函数真的是空的,这只是为了糖。可能开发人员更喜欢以这种方式调用新对象以联系它们。所以不用写:$search = (new Expression)-&gt;find("wow");,他可以写$search = Expression::make()-&gt;find("wow")。当然是一样的。
【解决方案2】:

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(A::get_self()); // A
echo get_class(A::get_static()); // A
echo get_class(B::get_self());  // A
echo get_class(B::get_static()); // B

【讨论】:

  • 不是问题的真正答案,但仍然有用,清楚地显示了 self 和 static 之间的区别。
  • @sergeyshuchkin 很好的例子... 很少描述会更有帮助
猜你喜欢
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多