相关疑难解决方法(0)

新的自我与新的静态

我正在转换PHP 5.3库以在PHP 5.2上工作.支持我的主要方法是使用后期静态绑定return new static($options);,如果我将其转换为return new self($options)将得到相同的结果?

new self和之间有什么区别new static

php static late-static-binding

483
推荐指数
3
解决办法
19万
查看次数

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

为什么有些人创建一个返回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)

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

php oop static class late-static-binding

23
推荐指数
2
解决办法
8543
查看次数

C++ 11的decltype是否不需要克隆?

克隆模式被用来做派生类的副本,而不拆毁到基类.不幸的是,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++ clone c++11

11
推荐指数
1
解决办法
2474
查看次数

`decltype`会给我一个对象的静态类型,还是它的运行时类型?

[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.对于我来说,"实体的类型"是指其运行时类型还是静态类型是不明确的.

c++ decltype language-lawyer c++11

10
推荐指数
2
解决办法
3720
查看次数

我应该使用新的自我还是新的静态?

我从事一个专有项目,该项目使用了很多种形式的工厂.他们中的大多数不通过名称实例化类,幸运的是,但是否new self()还是new static()用于实例取决于开发商变化.

我知道不同之处,但我很好奇是否有一些共识,即当技术上不需要后期静态绑定时哪一个是"正确"的方法.例如,new static()经常在服务类中找到几乎肯定永远不会被子类化的服务类.它在抽象类中显然很重要,但我的偏好是使用new self()我不期望子类的地方.

解决技术差异的问题:

我很好奇:

  • 使用后期静态绑定是否会影响性能?
  • 采用一种做法是否会对代码维护产生影响?例如.如果我使用类子类new self(),我必须覆盖/更改所有这些情况,但如果我的构造函数更改,这可能不是一件坏事.
  • 有没有记录在案的最佳做法?我们使用PSR-2,至少是有抱负的,但我不认为它涵盖了这一点.

php late-static-binding psr-2

5
推荐指数
1
解决办法
1038
查看次数

标签 统计

late-static-binding ×3

php ×3

c++ ×2

c++11 ×2

static ×2

class ×1

clone ×1

decltype ×1

language-lawyer ×1

oop ×1

psr-2 ×1