Правильное понимание области действия в PHP (по сравнению с Javascript)

Я знаю, что область действия работает по-разному в PHP и в Javascript.

Когда я впервые начал изучать Javascript (через пару лет изучения PHP), я изначально не осознавал, что переменные, объявленные вне функции, также доступны внутри функции.

Теперь (после нескольких лет сосредоточения внимания на Javascript) я озадачен тем, как вернуть переменную области видимости функции PHP обратно в среду дополнительных функций.

Пример:

$myArray = array();

function addItemsToMyArray($myArray) {

    $myArray[] = 'apple';
    $myArray[] = 'banana';
    $myArray[] = 'coconut';

    return $myArray;
}  

addItemsToMyArray($myArray);

echo count($myArray);    /* Gives 0 */

Почему count($myArray) дает 0 вместо 3?


person Rounin    schedule 03.11.2017    source источник
comment
Вам нужно написать function addItemsToMyArray(&$myArray)   -  person Julien Rousé    schedule 03.11.2017
comment
или используйте возвращаемое значение: $myArray = addItemsToMyArray($myArray);   -  person Alex Blex    schedule 03.11.2017
comment
Поскольку параметр вашей функции является локальным для вашей функции и не изменяет внешнюю область вашей функции. Если вы добавите &, он скажет PHP записывать в $myArray глобально, а не локально. Я так во всяком случае это понимаю. Может быть, кто-то даст более развернутый ответ? Или правильнее? Изменить: @AlexBlex тоже прав   -  person Julien Rousé    schedule 03.11.2017


Ответы (2)


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

function addItemsToMyArray($tmpArray) {

    $tmpArray[] = 'apple';
    $tmpArray[] = 'banana';
    $tmpArray[] = 'coconut';

    return $tmpArray;
}  

$myArray = array();
$myArray = addItemsToMyArray($myArray);

echo count($myArray);    /* Gives 3 */

Переменная, используемая внутри функции, отличается от переменной $myArray вне функции.

person Tweek    schedule 03.11.2017
comment
Блестящий. Спасибо, @Tweek, за четкое объяснение. Я вижу, что разница между javascript и PHP в этой ситуации заключается в том, что поскольку PHP передает переменные функциям по значению (а не по ссылке), строка $myArray = addItemsToMyArray($myArray); должно быть указано явно, если значение $myArray должно обновляться. - person Rounin; 03.11.2017

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

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

Чтобы аргумент функции всегда передавался по ссылке, добавьте амперсанд (&) к имени аргумента в определении функции:

Обратите внимание на амперсанд перед $array на странице документа для функций сортировки, таких как asort() и < a href="http://php.net/manual/en/function.ksort.php" rel="nofollow noreferrer">ksort():

bool asort (массив &$array [, int $sort_flags = SORT_REGULAR])

bool ksort (массив &$массив [, int $sort_flags = SORT_REGULAR])

person Alex Howansky    schedule 03.11.2017
comment
Это четкое объяснение, помогающее мне лучше понять базовую механику PHP - спасибо, @AlexHowansky. Будет ли тогда правильно сказать, что в function myFunction(myVariable) в Javascript myVariable передается по ссылке, тогда как в function My_Function($My_Variable) в PHP $My_Variable передается по значению? - person Rounin; 03.11.2017
comment
Я считаю, что JS использует передачу по ссылке для объектов и передачу по значению для всего остального. - person Alex Howansky; 03.11.2017