PHP报错Cannot Pass Parameter 1 by reference:判断变量等于数组最后项问题
解决PHP中
end()函数传参报错的问题 嘿,这个问题我之前也踩过坑,咱们来一步步搞清楚咋回事~
错误原因
PHP里的end()函数有个特殊要求:它的参数必须是可以被引用的变量,因为这个函数会移动数组内部的指针到最后一个元素,需要对原数组进行操作。但你代码里的Self::Supported_Version是类常量,它的值是固定不可修改的,没办法作为引用传递给end(),所以就触发了Cannot Pass Parameter 1 by reference这个错误。
可行的解决办法
方法1:把常量赋值给变量后再调用end()
先把类常量的值复制到一个普通变量里,变量是可以被引用的,这样就能正常使用end()了:
$supportedVersions = Self::Supported_Version; if ($ver == end($supportedVersions)) { // 你的逻辑代码 }
方法2:直接通过数组下标获取最后一项(推荐)
如果你的PHP版本在7.3及以上,可以用array_key_last()函数直接拿到数组最后一个元素的键名,再通过键名取值,这种方法不需要移动数组指针,也不用额外变量:
if ($ver == Self::Supported_Version[array_key_last(Self::Supported_Version)]) { // 你的逻辑代码 }
要是你还在使用PHP 7.3以下的版本,可以用count()来计算下标(注意只适用于连续索引的数组):
$lastIndex = count(Self::Supported_Version) - 1; if ($ver == Self::Supported_Version[$lastIndex]) { // 你的逻辑代码 }
方法3:用array_pop()(注意副作用)
array_pop()会取出数组的最后一个元素,但它会修改原数组,所以如果不想改变类常量对应的数组,得先复制一份:
$tempVersions = Self::Supported_Version; if ($ver == array_pop($tempVersions)) { // 你的逻辑代码 }
总结
核心问题就是end()需要接收可引用的变量,而类常量做不到这点,所以要么转成变量,要么换一种不需要传引用的方式获取数组最后一项就行啦~
内容的提问来源于stack exchange,提问作者Zorono
相关产品推荐
相关产品推荐

