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

// 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' ); 

有任何想法吗? 2天后仍然卡住

explode的结果分配给一个变量并传递该变量以end

 $tmp = explode('.', $file_name); $file_extension = end($tmp); 

问题是,那end需要一个引用,因为它修改了数组的内部表示(即使当前元素指针指向最后一个元素)。

explode('.', $file_name)不能转换为引用。 这是PHP语言的一个限制,可能出于简单的原因。

PHP 7兼容正确的用法:

 $fileName = 'long.file.name.jpg'; $tmp = explode('.', $fileName); $fileExtension = end($tmp); echo $fileExtension; // jpg 

其他人已经给了你一个错误的原因,但这是做你想做的最好的方法: $file_extension = pathinfo($file_name, PATHINFO_EXTENSION);

将explode()中的数组保存到一个变量中,然后在这个变量上调用end():

 $tmp = explode('.', $file_name); $file_extension = end($tmp); 

btw:我使用这个代码来获取文件扩展名:

 $ext = substr( strrchr($file_name, '.'), 1); 

strrchr在最后提取字符串.substr切断了.

尝试这个:

 $parts = explode('.', $file_name); $file_extension = end($parts); 

原因是end的参数是通过引用传递的,因为end通过将其内部指针推进到最后一个元素来修改数组。 如果你没有传入一个变量,那么没有任何参考指向。

请参阅PHP手册中的更多信息。

就像你不能立即索引数组一样,你也不能直接调用它。 首先将它分配给一个变量,然后调用结束。

 $basenameAndExtension = explode('.', $file_name); $ext = end($basenameAndExtension); 

PHP的抱怨,因为end()期望引用它想要改变的东西(可以只是一个变量)。 然而你直接将explode()的结果传递给end()而不先保存到变量中。 在explode()返回你的值的时候,它只存在于内存中,没有变量指向它。 你不能创建一个对某个东西(或者对内存中未知的东西)的引用,这个东西不存在。

或者换句话说:PHP不知道,如果你给他的值是直接值或只是一个指针的值(一个指针也是一个变量(整数),它存储了内存的偏移量,实际值所在)。 所以PHP期望在这里总是一个指针(引用)。

但是由于这只是PHP 7中的一个通知(甚至不推荐使用),您可以保存忽略通知,并使用ignore-operator而不是完全停用错误报告通知:

 $file_extension = @end(explode('.', $file_name)); 

PHP官方手册:end()

参数

 array 

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

$ file_extension = end(explode('。',$ file_name)); //错误在这一行

改变这一行为,

$ file_extension = end( (explode('。',$ file_name)) ); //没有错误

技术很简单,请再放一个支架爆炸,

(explode()) ,那么只有它可以独立执行..