Как php выполняет функцию, назначенную переменной? - PullRequest
6 голосов
/ 22 мая 2009

Хорошо, я даже не знал, как сформулировать вопрос, но позвольте мне объяснить.

Предположим, у меня есть переменная:

$file = dirname(__FILE__);

Что произойдет, если я назначу $file другой переменной?

$anotherVariable = $file;

Выполняется ли функция dirname при каждом назначении?

Спасибо за любую помощь.

Ответы [ 4 ]

12 голосов
/ 22 мая 2009

Нет. PHP является обязательным, поэтому правая часть выражений присваивания оценивается , а результат сохраняется «в левой» части (в простом и почти повсеместном случае переменная, названная слева) .

$a = $b;  // Find the value of $b, and copy it into the value of $a
$a = 5 + 2; // Evaulate 5 + 2 to get 7, and store this in $a
$a = funcName(); // Evaluate funcName, which is equivalent to executing the code and obtaining the return value. Copy this value into $a

Это становится немного сложнее, когда вы назначаете по ссылке ($ a = & $ b), но сейчас нам не нужно об этом беспокоиться.

2 голосов
/ 18 января 2014

Ответ на главный вопрос:

$a = function(){ echo "Hello!"; };
$a();

Ответы на второстепенные вопросы:

$file = dirname(__FILE__); 
//means: 
//"Evaluate/Execute function dirname() and store its return value in variable $file"

Что произойдет, если я назначу $ file другой переменной?

Если мы говорим о регулярном присваивании ($anotherVariable = $file;),
просто копирует значение из $file в $anotherVariable, оба являются независимыми переменными.

Выполняется ли функция dirname при каждом назначении?

Нет, это не так. Потому что выполнение выполняется только с (). Нет () = Нет исполнения.

2 голосов
/ 22 мая 2009

PHP не имеет таких замыканий.

имя_директории ( FILE )

эта функция возвращает строку.

$ anotherVariable = $ file;

дает $ anotherVariable то же самое строковое значение.

поэтому я считаю, что ответ на ваш вопрос «нет», он не выполняется каждый раз.

1 голос
/ 22 мая 2009

Нет ни в коем случае.

Функции PHP не являются идентификаторами, которые указывают на экземпляр класса Function, как вы можете видеть в Java, ActionScript, JavaScript и т. Д. ... Вот почему вы не можете сохранить ссылку на функцию, самую функцию для переменной. Вот почему каждый раз, когда вы вызываете функцию, она обычно совпадает с включаемым () сценарием для выполнения. Конечно, есть различия, но в контексте этого вопроса, в том числе с include () и вызовом функции, почти идентичны.

Не путайте с этим делом

function myFunc() {return 'hello world';}
$func = 'myFunc';
$a = $func();
echo $a; // hello world

Прочтите об этом случае здесь Это поведение специально для PHP. Не уверен насчет других языков - возможно, где-то есть что-то. похоже на это, но я никогда не встречал его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...