为什么在PHP中通过引用传递?
作者:互联网
我编写了一个函数,该函数应该接受一些变量,然后更改这些变量的值.但是,运行该函数后,变量保持不变.然后,我进行了一次谷歌搜索,发现您需要放置&在变量名前面.然后代码执行了我想要的操作.但是,我不明白为什么您需要添加&.还有其他方法可以完成我需要做的事情吗?基本上,我对引用传递的概念感到困惑.这是我的困境开始的地方,大声笑:
到目前为止,在我所学的所有语言(python,java,ruby)中,函数所采用的参数都将按照算法中的指示更改变量的值,而无需任何引用,这只是我的一个概念在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)并更改了参数,则该值将不会更改.对于字符串,情况也是如此,因为您不能修改它们的状态,只能修改作为参数传递的引用.请注意,它仍然是按值传递的,因为您复制的引用基本上就是您的方法为对象保留的内容.
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
是一个特殊功能,您可以通过引用来调用变量(是的,您确实可以,它实际上是手册中所述的一种语言构造).关键是当您将数组分配给列表构造时,数组中的元素将按元素分配给列表中指定的变量.例如(取自here):
list($drink, $color, $power) = array('coffee', 'brown', 'caffeine');
等效于:
$drink = 'coffee';
$color = 'brown';
$power = 'caffeine';
因此,它或多或少与array相反:将数组拆分为元素并执行按元素分配.
使用列表,每个人都清楚这些变量将改变.此外,您不必查看函数签名即可知道变量是否会更改:它不会更改.如果您改变主意并想要设置其他变量,那也很容易.
标签:pass-by-reference,pass-by-value,php 来源: https://codeday.me/bug/20191027/1945300.html