我正在转换PHP 5.3库以在PHP 5.2上工作.支持我的主要方法是使用后期静态绑定return new static($options);,如果我将其转换为return new self($options)将得到相同的结果?
new self和之间有什么区别new static?
我在一些框架中看到了这行代码:
return new static($view, $data);
Run Code Online (Sandbox Code Playgroud)
你怎么理解的new static?
为什么有些人创建一个返回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)
它的目的是什么?我看到在这里我们不使用新的表达式语法,如果这是重点 - 那么为什么他们没有使所有方法成为例如静态?有什么区别,有什么理由让这个方法返回新的静态?
从5.3版开始,PHP支持静态方法的后期绑定.虽然这是一个无疑是有用的功能,但只有几种情况需要使用它(例如Active Record模式).
考虑这些例子:
1.便利施工人员(::create())
class SimpleObject
{
public function __construct() { /* ... */ }
public static function create()
{
return new static; // or: return new self;
}
}
Run Code Online (Sandbox Code Playgroud)
如果这个类可能被扩展(但是,它没有被同一个包中的任何类扩展),那么应该使用延迟静态绑定来使它更容易扩展(无需重写::create()方法,更重要的是,不必记住要做到这一点)?
注意:这个习惯用于解决在构造对象上调用方法的不可能性:new SimpleObject()->doStuff()在PHP中无效.
2.类常数
class TagMatcher
{
const TAG_PATTERN = '/\<([a-z\-]+?)\>/i';
private $subject;
public function construct($subject) { $this->subject = $subject; }
public function getAllTags()
{
$pattern = static::TAG_PATTERN;
preg_match_all($pattern, $this->subject);
return $pattern[1];
}
}
Run Code Online (Sandbox Code Playgroud)
static::在此示例中使用的原因与前一个类似.它的使用只是因为这个类可以通过扩展它并覆盖常量来匹配不同形式的标签.
那么,要将它们全部包装起来,这些后期静态绑定的使用(以及类似的)是否过度杀伤?是否有明显的性能影响?此外,频繁使用后期绑定是否会降低操作码缓存的整体性能提升?