为什么 return 新静态? (PHP)
Why return new static? (PHP)
为什么有些开发人员创建了一个 returns new static 的方法?为什么要有一个方法returns new static? 我不是在问 static 和 self 有什么区别,或者 static 和 self 是什么意思。 例如,这里有一个简单的 class:
<?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 方法 make() returns new静态。然后,一些开发人员像这样调用其他方法:
$regex = Expression::make()->find('www');
这样做的目的是什么?我看到这里我们没有使用 new Expression 语法,如果这就是重点——那么为什么不将所有方法设为静态呢?有什么区别,为什么要使用 returns new static 的方法(而其他方法不是静态的)?
new static
从当前 class 实例化一个新对象,并使用后期静态绑定(如果 class 是 sub[=39,则实例化 subclass =]ed,我希望你明白这一点)。
在 class 上有一个 static
方法,returns 相同的新实例是 替代构造函数 。意思是,通常您的构造函数是 public function __construct
,并且通常它需要一组特定的参数:
class Foo {
public function __construct(BarInterface $bar, array $baz = []) { ... }
}
有一个替代构造函数允许您提供不同的默认值,或方便的快捷方式来实例化这个class而不必提供那些特定的参数and/or能够提供不同的参数,替代构造函数将其转换为规范参数:
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]);
}
}
现在,即使您的规范构造函数需要一堆复杂的参数,您也可以创建 class 的默认实例,这可能适合大多数用途,只需使用 Foo::getDefault()
。
PHP 中的典型示例是 DateTime
和 DateTime::createFromFormat
。
在您的具体示例中,替代构造函数实际上不执行任何操作,因此它相当多余,但我认为这是因为它是一个不完整的示例。如果确实有一个除了 new static
之外什么都不做的替代构造函数,它可能只是 (new Foo)->
的便利语法,我觉得这有问题。
完整回答here
TLDR
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
为什么有些开发人员创建了一个 returns new static 的方法?为什么要有一个方法returns new static? 我不是在问 static 和 self 有什么区别,或者 static 和 self 是什么意思。 例如,这里有一个简单的 class:
<?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 方法 make() returns new静态。然后,一些开发人员像这样调用其他方法:
$regex = Expression::make()->find('www');
这样做的目的是什么?我看到这里我们没有使用 new Expression 语法,如果这就是重点——那么为什么不将所有方法设为静态呢?有什么区别,为什么要使用 returns new static 的方法(而其他方法不是静态的)?
new static
从当前 class 实例化一个新对象,并使用后期静态绑定(如果 class 是 sub[=39,则实例化 subclass =]ed,我希望你明白这一点)。
在 class 上有一个 static
方法,returns 相同的新实例是 替代构造函数 。意思是,通常您的构造函数是 public function __construct
,并且通常它需要一组特定的参数:
class Foo {
public function __construct(BarInterface $bar, array $baz = []) { ... }
}
有一个替代构造函数允许您提供不同的默认值,或方便的快捷方式来实例化这个class而不必提供那些特定的参数and/or能够提供不同的参数,替代构造函数将其转换为规范参数:
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]);
}
}
现在,即使您的规范构造函数需要一堆复杂的参数,您也可以创建 class 的默认实例,这可能适合大多数用途,只需使用 Foo::getDefault()
。
PHP 中的典型示例是 DateTime
和 DateTime::createFromFormat
。
在您的具体示例中,替代构造函数实际上不执行任何操作,因此它相当多余,但我认为这是因为它是一个不完整的示例。如果确实有一个除了 new static
之外什么都不做的替代构造函数,它可能只是 (new Foo)->
的便利语法,我觉得这有问题。
完整回答here
TLDR
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