我正在转换PHP 5.3库以在PHP 5.2上工作.支持我的主要方法是使用后期静态绑定return new static($options);,如果我将其转换为return new self($options)将得到相同的结果?
new self和之间有什么区别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)
它的目的是什么?我看到在这里我们不使用新的表达式语法,如果这是重点 - 那么为什么他们没有使所有方法成为例如静态?有什么区别,有什么理由让这个方法返回新的静态?
该克隆模式被用来做派生类的副本,而不拆毁到基类.不幸的是,clone必须在每个子类中实现(或者使用带有CRTP的mixin).
C++ 11是否有可能decltype使其不必要?
我不认为下面的代码实际上是复制original,而只是指向它的引用.当我试图使用时new decltype(*original),我收到一个错误:
error: new cannot be applied to a reference type.
是clone仍然走在C++ 11的方式吗?或者是否有一些新方法使用RTTI从基类指针复制派生类对象?
#include <iostream>
struct Base
{
virtual void print()
{
std::cout << "Base" << std::endl;
}
};
struct Derived : public Base
{
int val;
Derived() {val=0;}
Derived(int val_param): val(val_param) {}
virtual void print()
{
std::cout << "Derived " << val << std::endl;
}
};
int main() {
Base * original = …Run Code Online (Sandbox Code Playgroud)
[C++11: 7.1.6.2/4]:表示的类型decltype(e)定义如下:
- if
e是未加密码的id-expression或未加括号的类成员访问(5.2.5),decltype(e)是名为的实体的类型e.如果没有这样的实体,或者e命名一组重载函数,程序就会形成错误;- 否则,如果
e是xvalue,decltype(e)则是T&&,其中T的类型是e;- 否则,如果
e是左值,decltype(e)则是T&,其中T的类型e;- 否则,
decltype(e)是的类型e.说明符的操作数
decltype是未评估的操作数(第5条).
第二,第三和第四种情况清楚地指代表达式的类型,其不包括任何多态性考虑因素.
但是,我并不完全确定" 实体 "在这里意味着什么,第一种情况似乎是命名表达式所引用的对象e.对于我来说,"实体的类型"是指其运行时类型还是静态类型是不明确的.
我从事一个专有项目,该项目使用了很多种形式的工厂.他们中的大多数不通过名称实例化类,幸运的是,但是否new self()还是new static()用于实例取决于开发商变化.
我知道不同之处,但我很好奇是否有一些共识,即当技术上不需要后期静态绑定时哪一个是"正确"的方法.例如,new static()经常在服务类中找到几乎肯定永远不会被子类化的服务类.它在抽象类中显然很重要,但我的偏好是使用new self()我不期望子类的地方.
解决技术差异的问题:
我很好奇:
new self(),我必须覆盖/更改所有这些情况,但如果我的构造函数更改,这可能不是一件坏事.