【问题标题】:Why does a PHP function with no parameters require parentheses?为什么没有参数的 PHP 函数需要括号?
【发布时间】:2010-05-14 10:46:13
【问题描述】:

我花了 3 个小时想知道为什么我不能开始一个会话,然后意识到我使用了:

session_start;

我应该在什么时候使用:

session_start();

我没有收到任何错误消息!

也许,我想,这是一种将函数与变量区分开来的懒惰方法 - 但后来记住它不能因为变量需要 $

谁能告诉我为什么需要括号,以及为什么不使用括号时没有错误?

【问题讨论】:

  • 您是 ASP/VBScript 程序员吗?
  • 我主要来自 Delphi/SQL 世界。
  • 您的通知错误消息是否处于活动状态? // error_reporting(E_ALL);

标签: php function parentheses


【解决方案1】:

我收到通知(已将 error_reporting 设置为 E_ALL):

注意:使用未定义的常量 session_start - 在 /t.php 第 5 行假设为“session_start”

函数总是需要括号,因为否则(如您所见)您无法区分函数和常量之间的区别。由于应该编写代码,以便阅读它的人可以理解它,不允许读者查看它是一个常量还是函数调用,这使得它更难阅读和调试。

由于向后兼容性,我认为这是一个通知而不是错误错误,因为一些较旧的代码倾向于使用不带引号的字符串访问数组,如果没有具有该名称的常量,PHP 会将其视为带引号的字符串。

$myArray[myString] = 25;

【讨论】:

  • 谢谢,是为了判断函数和常量的区别。
【解决方案2】:

如果函数没有括号,则无法区分函数和常量...但奇怪的是它不会引发错误...您是否在 php.ini 文件中关闭了错误?

【讨论】:

    【解决方案3】:

    括号是必需的,因为 PHP 的语言规范是这么说的(即使似乎没有明确的语言规范)。

    PHP 在遇到未知标识符时会输出一个 E_NOTICE 错误,让您知道使用了未知标识符,然后假定您打算将该标识符用作字符串

    <?php
    $foo = unknown_identifier;
    echo 'Now printing: ' . $foo; // prints 'Now printing: unknown_identifier' (PHP 5.2.6)
    ?>
    

    您没有看到任何错误的原因可能是因为 E_NOTICE 错误低于您的错误报告阈值。您可以使用 error_reporting 指令更改此阈值:

    <?php
    error_reporting(E_ALL);
    
    $foo = unknown_identifier;
    echo 'Now printing: ' . $foo;
    ?>
    

    这将输出 Yacoby 上面发布的“通知”错误消息。

    请注意,the E_ALL error reporting directive does not in fact include all reporting levels in PHP 5.x 具有误导性。在 PHP 5 中,您需要使用 E_ALL | E_STRICT 来启用所有错误消息。

    -- 编辑:被很多人打败了。

    【讨论】:

      【解决方案4】:

      我知道或曾经使用过的所有语言都使用括号来描述函数,无论它们不带参数(void)还是有参数列表(可选或不带参数)。 你会习惯的。也许它是 C 的遗留物,它的所有函数原型等等。

      话虽如此,PHP 中的 echo 函数是一个奇怪的函数,因为它不是一个函数,而是一个语句 - 看图。

      看看http://en.wikipedia.org/wiki/Function(computer_science)

      【讨论】:

      • Jujhar,那是因为 echo 不是 一个函数!是一种语言构造,其实写&lt;? echo "blablabla" ?&gt;&lt;?= "blablabla" ?&gt;是一样的见php.net/manual/en/function.echo.php
      【解决方案5】:

      () 表示要调用该函数。没有它,您可以传递参考。例如(PHP 5.3):

      $callable = session_start;
      $callable();
      

      【讨论】:

      • 严格来说,这不是真的。 session_start 被认为是字符串"session_start",并且在包含字符串的变量后添加括号会导致该字符串用作要调用的函数名。
      猜你喜欢
      • 2015-10-03
      • 2017-11-07
      • 2017-01-10
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 2012-08-03
      • 2013-06-16
      • 2018-06-24
      相关资源
      最近更新 更多