【问题标题】:Syntax for object creation specification?对象创建规范的语法?
【发布时间】:2021-04-21 12:51:25
【问题描述】:

PHP 使用关键字new 来创建给定类的实例。 PHP 手册中的描述似乎相当模糊,不清楚这里允许使用什么语法。哪些标记/表达式可以传递给new

class Foo {}

// using class identifier obviously works
new Foo();  // => Foo{#2574}
// ... including omitting parens for constructor arguments as optional 
new Foo;    // => Foo{#2577}

// passing class name in a string (mentioned in manual) however fails
new "Foo";
new "Foo()";
new "Foo"();
// => PHP Parse error: Syntax error, unexpected T_CONSTANT_ENCAPSED_STRING

// passing class name in a string works only indirectly, through a variable (why?)
$className = "Foo";
new $className;    // Foo {#2580}

// other expressions resulting in *string* value also does not seem to work
function getFoo() {return "Foo";}
new (getFoo());
// => PHP Error:  syntax error, unexpected '(', expecting ';'

new 的所有可能语法是什么? 是否有一些 PHP 的语法参考,其中详细描述了这个和其他核心语言结构?喜欢 Python 语言参考吗?

【问题讨论】:

  • “在字符串中传递类名(在手册中提到)但是失败了” - 您能否指出文档中让您相信这是可能的部分?
  • @El_Vanja 它就在链接手册条目的第 2 段中:“如果包含类名称的字符串与 new 一起使用,则将创建该类的新实例。 "
  • 不确定github.com/php/php-langspec 的最新情况。
  • @NigelRen 太好了,这就是我一直在寻找的。 github.com/php/php-langspec/blob/master/spec/… 将深入研究此参考。 20 年 3 月的最后一次提交,希望不要过时太多..

标签: php token


【解决方案1】:

PHP 手册说:

如果包含类名的字符串与 new 一起使用,则会创建该类的新实例。

它确实可以以错误的方式解释(即使用字符串常量:new "Foo"),但很快就会意识到你永远不会这样做。如果你指定一个常量字符串值,你也可以写成常规形式(new Foo),这样就没有优势了。

但是,能够使用保存字符串值的变量有一个优势,例如$className = "Foo"; new $className;,因为它可以动态创建类名并实例化它们。没有人应该滥用这种可能性,但它在某些情况下会派上用场。

【讨论】:

  • 我知道我可以直接写类标识符new Foo,而不是它的字符串文字new "Foo",但是它不能解决手册中描述的歧义。它还对语法本身及其当前实现的完整性产生怀疑和不确定性。
  • @dunrix 它的意思可能是“字符串变量”,而不是单纯的文本文字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 2021-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多