Зачем переходить по ссылке в PHP?

Я написал функцию, которая должна принимать некоторые переменные, а затем изменять значение этих переменных. Однако после запуска функции переменные остались без изменений. Потом я немного погуглил и обнаружил, что нужно поставить & перед именами переменных. Затем код сделал то, что я хотел. Тем не менее, я не понимаю, почему вы должны поставить &, Есть ли другой способ сделать то, что мне нужно было сделать? В основном меня смущает понятие передачи по ссылке. Вот где начинаются мои беды, LOL:

На всех языках, которые я выучил до сих пор (python, java, ruby), параметры, которые должна принимать функция, будут изменять значение переменных, как указано в алгоритме, без какого-либо passing by reference, концепция, которую я только что открыл в PHP. Почему PHP решил сделать это? Не могли бы вы объяснить логику ссылок? Наконец, в Интернете есть люди, которые говорят: «Не пользуйтесь ссылками? Если нет, как еще мне добраться до моего решения. Также есть ссылки на ссылки в PHP … Извините, это беспорядок.

Я просмотрел руководство по PHP для ссылок, но мне было довольно трудно это переварить.

Вот код, который я добавил & подписать к:

<?php

$comments = "";
$airline_name = "United";
$flight_number = "262";
$departure_airport = "";

function airport(&$one, &$two, &$three, &$four) {
if ( !empty($one) || !empty($two) || !empty($three) ) {
$one = !empty($one) ? "Airline Name: $one<br>" :"Airline Name: PLEASE PROVIDE AIRLINE NAME<br>";
$two = !empty($two) ? "Flight Number: $two<br>" : "Flight Number: PLEASE PROVIDE FLIGHT NUMBER<br>";
$three = !empty($three) ? "Departure Airport: $three<br>" : "Departure Airport: PLEASE PROVIDE DEPARTURE AIRPORT<br>";
$four = !empty($four) ? "Comments: $four<br>" : "";
}

}

airport($airline_name,$flight_number,$departure_airport,$comments);

echo $airline_name,$flight_number,$departure_airport,$comments;

?>

3

Решение

Причина того, что немного другие языки не должны этого делать, потому что они используют объекты: изменение состояния объекта отражается на всех ссылках, указывающих на этот объект. Однако, если вы передаете примитивный тип в Java (например, int), и вы измените параметр, значение не будет изменено. Та же история для StringТак как вы не можете изменить их состояние, вы можете изменить только ссылку, переданную в качестве аргумента. Обратите внимание, что это все еще передача по значению, так как вы копируете ссылку, которая в основном является тем, что ваш метод содержит для объекта.

PHP передает строку по значению, что означает — по крайней мере, концептуально — копия строки создается перед ее вызовом.

тем не менее пройти по ссылке иногда считается опасным. Это концепция, которая используется в C и C ++ (и даже в C #), но языки программирования, такие как Java, не допускают этого. Вам лучше использовать выходные данные, чтобы разрешить изменение переменных, поскольку это делает его синтаксически явным:

function airport($one,$two,$three,$four) {
if (!empty($one) || !empty($two) || !empty($three) ) {
$one = !empty($one) ? "Airline Name: $one<br>" :"Airline Name: PLEASE PROVIDE AIRLINE NAME<br>";
$two = !empty($two) ? "Flight Number: $two<br>" : "Flight Number: PLEASE PROVIDE FLIGHT NUMBER<br>";
$three = !empty($three) ? "Departure Airport: $three<br>" : "Departure Airport: PLEASE PROVIDE DEPARTURE AIRPORT<br>";
$four = !empty($four) ? "Comments: $four<br>" : "";
}
return array($one,$two,$three,$four);
}

и назовите это с:

list($airline_name,$flight_number,$departure_airport,$comments) = airport($airline_name,$flight_number,$departure_airport,$comments);

list это специальная функция, где вы вызываете переменные по ссылке (да, вы делаете, это на самом деле языковая конструкция как указано в руководстве). Дело в том, когда вы назначаете массив list построить, элементы в array назначаются поэлементно переменным, указанным в списке. Например (взято из Вот):

list($drink, $color, $power) = array('coffee', 'brown', 'caffeine');

эквивалентно:

$drink = 'coffee';
$color = 'brown';
$power = 'caffeine';

таким образом, это более или менее противоположность array: вы разбиваете массив на элементы и выполняете поэлементное присваивание.


С помощью listВсем понятно, что эти переменные изменятся. Более того, вам не нужно заглядывать в сигнатуру функции, чтобы узнать, изменится ли переменная: не будет. Если вы передумаете и захотите установить другие переменные, это тоже легко.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]