2015-12-24 3 views
3

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

На всех языках, которые я изучил до сих пор (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

Это плохая практика программирования. Передать значения в, получить новые значения. Это намного удобнее и безопаснее. –

+2

http://stackoverflow.com/questions/2157799/when-to-pass-by-reference-in-php --- http://stackoverflow.com/questions/11360810/php-pass-by-reference-confusion и вопрос: * почему? * –

+0

Если функция возвращает новые значения в виде массива, вы можете сделать «list ($ var1, $ var2) = myFunc()' – SmokeyPHP

ответ

4

Причина, по которой некоторым других языков не должны делать это, потому что они используют объекты: изменение состояния объекта является отражается на всех ссылках, указывающих на этот объект. Если, однако, вы передаете примитивный тип в 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 присваиваются элементарным переменным, указанным в списке. Например (взяты из here):

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

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

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

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


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

+0

Спасибо! Не могли бы вы объяснить код в своем ответе? Итак, вы в конечном итоге возвращаете массив, а затем что именно вы делаете, когда вы устанавливаете список? Я этого раньше не видел. –

+0

@GovindRai: см. Обновленный ответ. –

+1

«Причина, по которой некоторым другим языкам это не нужно, заключается в том, что они используют объекты: изменение состояния объекта отражается во всех ссылках, указывающих на этот объект». То же самое верно для объектов в PHP 5+. – newacct

Смежные вопросы