PHP函数按引用传递参数时原变量未被修改原因咨询
问题核心原因
你遇到的现象和引用传递的特性无关,是strtoupper函数本身的设计逻辑导致的:PHP内置的绝大多数字符串处理函数(包含strtoupper)都是返回处理后的新字符串,不会直接修改传入的原始参数。哪怕你传入的是引用变量,函数本身没有修改参数值的逻辑,自然不会改变原始变量的内容。
引用传递有效性验证
可以用下面的逻辑验证引用传递本身是正常生效的:
<?php $str = "ciao"; increment($str); function increment(&$str){ // 直接修改引用指向的变量内容 $str = "test"; } echo $str."\n"; // 输出结果为test ?>
运行后外部的$str会被修改为test,足以证明引用传递的机制是正常工作的。
关于PHP字符串可变性的说明
PHP的字符串属于可变类型,和Java的不可变字符串设计完全不同,你可以直接通过下标修改字符串的单个字符,比如$str[0] = 'C'就会直接修改原字符串的值,不需要生成新的字符串对象。
引用传递的通用规则说明
PHP中按引用传递参数时,是否需要把结果赋值给引用变量,取决于你使用的处理函数/操作的行为:
- 如果你使用的是直接修改输入参数的函数(比如数组排序的
sort()、rsort(),这类函数的参数本身就要求传引用),不需要额外赋值,调用后原始变量就会被修改; - 如果你使用的是返回处理结果、不修改输入参数的函数(比如
strtoupper()、substr()、array_map()等),不管你是不是用引用传递,都需要把函数返回值赋值给引用变量,才能修改外部的原始变量。
修正后的可运行代码
<?php $str = "ciao"; increment($str); function increment(&$str){ // 把strtoupper返回的新字符串赋值给引用变量,同步修改外部原始变量 $str = strtoupper($str); } echo $str."\n"; ?>
运行后会输出预期的CIAO。
内容的提问来源于stack exchange,提问作者Luca Olivieri
相关产品推荐
相关产品推荐

