Почему функция PHP без параметров требует скобок?

Я просто потратил 3 часа на то, чтобы узнать, почему я не мог начать сеанс, а потом понял, что использовал:

session_start; 

когда я должен был использовать:

 session_start(); 

Я не получил сообщений об ошибках!

Возможно, тогда, подумал я, это ленивый способ дифференцировать функции от переменных, но потом вспомнил, что это не так, как переменные требуют $

Может ли кто-нибудь сказать мне, зачем нужны скобки, а также почему не возникает ошибка, когда они не используются?

Я получаю уведомление (установив error_reporting в E_ALL ):

Примечание. Использование неопределенной константы session_start – предполагаемый «session_start» в /t.php в строке 5

Функция всегда нуждается в круглых скобках, как и другие (как вы можете видеть), вы не можете отличить функцию от константы. Поскольку код должен быть написан так, чтобы его можно было понять, прочитав его человеком, не позволяя читателю видеть, является ли он постоянным или вызовом функции, делает его более трудным для чтения и отладки.

Я предполагаю, что это скорее уведомление, чем ошибка ошибки из-за обратной совместимости в том, что какой-то старый код имеет тенденцию обращаться к массивам с использованием некотируемых строк, которые PHP будет рассматривать в качестве цитируемых строк, если бы не было константы с этим именем.

 $myArray[myString] = 25; 

Вы не можете сделать разницу между функцией и константой, если функция не имеет скобок … Но странно, что она не бросает ошибки … вы отключили ошибки в файле php.ini?

Скобки необходимы, потому что спецификация языка 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.

Обратите внимание, что в заблуждение директива об ошибках E_ALL не включает в себя все уровни отчетности в PHP 5.x. В PHP 5 вам нужно использовать E_ALL | E_STRICT E_ALL | E_STRICT чтобы включить все сообщения об ошибках.

– отредактируйте: избили на удар многими людьми.

Все языки, которые я знаю или когда-либо использовали, используют скобки для описания функций, не принимают ли они никаких параметров (void) или имеют список параметров (необязательно или нет). Вы привыкли к этому. Возможно, это похмелье от C со всеми его прототипами функций и всего.

Сказав это, функция echo functon в PHP является странной, поскольку это не совсем функция, но это утверждение – зайдите в цифру.

Взгляните на http://en.wikipedia.org/wiki/Function(computer_science)

() означает, что функция должна быть вызвана. Без этого вы сможете передать ссылку. Например (PHP 5.3):

 $callable = session_start; $callable();