【问题标题】:Parse error: syntax error, unexpected 'new' (T_NEW) in .../test6_2.php on line 20解析错误:语法错误,第 20 行 .../test6_2.php 中的意外“新”(T_NEW)
【发布时间】:2016-07-30 15:51:37
【问题描述】:

只是试图保存和修复来自PHPBench.com的源

并遇到此错误(网站已关闭且作者未回答问题)。这是来源:

<?php

// Initial Configuration
class SomeClass {
  function f() {

  }
}
$i = 0; //fix for Notice: Undefined variable i error

// Test Source
function Test6_2() {
  //global $aHash; //we don't need that in this test
  global $i; //fix for Notice: Undefined variable i error

  /* The Test */
  $t = microtime(true);
  while($i < 1000) {
    $obj =& new SomeClass();
    ++$i;
  }

  usleep(100); //sleep or you'll return 0 microseconds at every run!!!
  return (microtime(true) - $t);
}

?>

它是否是有效的语法?如果我错了,请纠正我,但认为它创建了对 SomeClass 的引用,因此我们可以致电 new $obj() ...提前感谢您的帮助

【问题讨论】:

  • =&amp; new ... 是无效语法
  • 类实例需要赋值给一个变量,所以你必须把实例赋值给一个变量,然后把变量的引用放到$obj,但是我的问题是,你为什么需要参考吗?
  • 这是测试-创建新对象时= new=&amp; new之间的比较
  • 语法自 PHP 5.0 被弃用并在 PHP 7.0 中被删除。 PHP 5.0Strict Standards: Assigning the return value of new by reference is deprecated 3v4l.org/AKH8r
  • 正如我所说,这是来自已经非活动站点的代码:)

标签: php reference operators


【解决方案1】:

无论如何,对象总是通过引用存储。你不需要=&amp;,正如夏洛特所说,这是不推荐使用的语法。

如果我错了,请纠正我,但认为它创建了对 SomeClass 的引用,所以我们可以调用 new $obj() 。

不,这是不正确的。 new 运算符始终创建类的实例,而不是作为类型的类的引用。

您可以通过使用类名创建一个字符串变量并使用它来创建变量对象实例化。

$class = "MyClass";
$obj = new $class();

get_class()ReflectionClass::getName() 等函数将类名作为字符串返回。 PHP 中没有像 Java 中那样的“类引用”概念。

您想到的最接近的东西是ReflectionClass::newInstance(),但这是动态创建对象的一种不必要的方式。在几乎所有情况下,最好只使用new $class()

【讨论】:

  • 在谈到微基准测试时,使用更多内存来定义字符串变量会更好吗?
  • 比什么好?没有定义字符串变量?它只是一个标量。如果您的代码对性能如此敏感以至于使用字符串变量会破坏交易,那么您可能一开始就不应该使用 PHP。
猜你喜欢
  • 2018-05-16
  • 2014-09-10
  • 1970-01-01
  • 2011-06-24
  • 2015-05-28
  • 1970-01-01
  • 2012-08-15
  • 2013-12-09
  • 1970-01-01
相关资源
最近更新 更多