Я написал функцию, которая должна принимать некоторые переменные, а затем изменять значение этих переменных. Однако после запуска функции переменные остались без изменений. Потом я немного погуглил и обнаружил, что нужно поставить &
перед именами переменных. Затем код сделал то, что я хотел. Тем не менее, я не понимаю, почему вы должны поставить &
, Есть ли другой способ сделать то, что мне нужно было сделать? В основном меня смущает понятие передачи по ссылке. Вот где начинаются мои беды, 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;
?>
Причина того, что немного другие языки не должны этого делать, потому что они используют объекты: изменение состояния объекта отражается на всех ссылках, указывающих на этот объект. Однако, если вы передаете примитивный тип в 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
Всем понятно, что эти переменные изменятся. Более того, вам не нужно заглядывать в сигнатуру функции, чтобы узнать, изменится ли переменная: не будет. Если вы передумаете и захотите установить другие переменные, это тоже легко.
Других решений пока нет …