Почему функция PHP без параметров требует скобок? - PullRequest
3 голосов
/ 14 мая 2010

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

session_start;

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

session_start();

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

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

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

Ответы [ 5 ]

9 голосов
/ 14 мая 2010

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

Примечание: использование неопределенной константы session_start - предполагается, что 'session_start' в /t.php в строке 5

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

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

$myArray[myString] = 25;
2 голосов
/ 14 мая 2010

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

1 голос
/ 14 мая 2010

Скобки обязательны, потому что в языковой спецификации 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, чтобы включить все сообщения об ошибках.

- редактировать: многие избивают многих.

0 голосов
/ 14 мая 2010

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

$callable = session_start;
$callable();
0 голосов
/ 14 мая 2010

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

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

Посмотрите на http://en.wikipedia.org/wiki/Function(computer_science)

...