我写了一个函数,它应该取一些变量,然后改变这些变量的值。但是,在运行函数之后,变量保持不变。然后我做了一些谷歌搜索,发现你需要在变量名前面加一个&
。然后代码做了我想做的事情。但是,我不明白为什么你需要放一个&
。有没有其他方法来完成我需要做的事情?基本上,我对通过引用传递的概念感到困惑。我的痛苦就从这里开始,哈哈:
在迄今为止我所学的所有语言(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这样的编程语言是不允许的。最好使用output来启用变量的修改,因为它使变量在语法上显式:
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
,每个人都清楚这些变量会改变。此外,您不必查看函数签名来知道变量是否会更改:它不会更改。如果您改变主意并希望设置其他变量,也很容易。