只有变量应该通过引用传递

320
// Other variables
$MAX_FILENAME_LENGTH = 260;
$file_name = $_FILES[$upload_name]['name'];
//echo "testing-".$file_name."<br>";
//$file_name = strtolower($file_name);
$file_extension = end(explode('.', $file_name)); //ERROR ON THIS LINE
$uploadErrors = array(
    0=>'There is no error, the file uploaded with success',
    1=>'The uploaded file exceeds the upload max filesize allowed.',
    2=>'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form',
    3=>'The uploaded file was only partially uploaded',
    4=>'No file was uploaded',
    6=>'Missing a temporary folder'
);

有什么想法吗?两天过去了还是卡住了。


7
提供更好的解释原因:https://vijayasankarn.wordpress.com/2017/08/28/php-only-variables-should-be-passed-by-reference/只有变量应该通过引用传递,因为PHP函数中的参数默认情况下是按值传递的。这意味着将变量作为参数传递时,将创建一个新的副本,其值与原始变量相同。当您尝试在函数内部更改参数的值时,实际上只是更改了该副本的值,而不会对原始变量产生任何影响。为了避免出现这种情况,可以通过引用传递变量,从而使函数能够直接操作原始变量,而不是副本。 - Anant
警告:自 PHP 7.4(可能是早期版本),将变量内联分配为通过引用传递的函数参数会导致此通知级别错误。例如:https://onlinephp.io/c/4c871 - Troy Niemeier
14个回答

0

PHP官方手册: end()

参数

array

数组。该数组通过引用传递,因为它被函数修改。这意味着您必须传递一个真实的变量,而不是返回数组的函数,因为只有实际变量可以通过引用传递。

3
从官方手册中引用,不要自己重写。此外,请考虑让您的答案比现有答案更好。 - Victor Polevoy

0

首先,您需要像这样将值存储在变量中

$value = explode("/", $string);

接着,您可以使用 end 函数来获取数组的最后一个索引,就像这样

echo end($value);

希望它能对你有用。


0
假设:
function endSimulator (&$var) {
    echo $var;
}
function explodeSimulator ($var) {
    return $var;
}

现在,与可以获取“函数输出”的explodeSimulator相反,您可以仅通过变量来传递endSimulator。 否则,PHP会报错“只能传递变量的引用”。 您可以使用以下代码进行检查:
  endSimulator(explodeSimulator(":)")); // warnings arise

为什么?
因为当PHP遇到"&"符号时,它会寻找它后面的“指向某个东西(通常是变量)的指针”,任何变量都是一个“指针”(指向原始值或引用-请参考附加信息),但函数可以被评估为值而不是指针!(尽管我认为在JavaScript中它们指向与相应函数同名的变量)
换句话说,当你使用endSimulator(explodeSimulator(":)"))时,解释器看到的是类似endSimulator(":)")的内容,正如你所知道的,你不能将“:)”发送给一个只接收指针的函数。
所以最终你可以这样解决:
  $explodeSimulatorOutput = explodeSimulator(":)");
  endSimulator($explodeSimulatorOutput);

额外信息

我觉得这里很多人对于"按引用传递"这个短语有一种模糊的理解,请注意"按引用传递"是一个普遍的概念,可以在各种不同的情况下使用,比如:

a=10   // a <-- 10; 
// content of a is passed by a value into it

b="a" // b <-- "a";
// content of b is passed by a value into it

obj = {a,b} // obj <-- {} <-- 10,"a";
// content of obj is passed by a reference (which is {}) into it

function func1 (var) {...}
// the "var" variable is passing by value

function func2 (&var) {...}
// the "var" variable is passing by reference into the function

在这个主题中,“通过引用传递”指的是func2而不是abobj的概念。

-1

请看下面的图片,正如您所见,在$tmp = explode('.', $file_name);中,实际上(1)$tmp不等于(2)explode('.', $file_name);

enter image description here


所以,左边实际上是两个不同的内存部分连接(引用)在一起(粉色块和黑色箭头可以被认为是指向实际值的指针,即绿色块),但右边只是一个块(没有指针),你明白了吗?

现在,end()函数只接受“带有指针的变量”,或者换句话说,“通过引用传递的变量”...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接