You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 17:45:03