【问题标题】:PHP4 parameter by reference?PHP4参数引用?
【发布时间】:2011-05-31 20:46:14
【问题描述】:

我很习惯 PHP5 但必须编写一个 PHP4 同步脚本,现在我正在做一些挖掘以找出 PHP5 和 4 之间的差异。问题是我有很多矛盾,一些网站告诉我 PHP4没有任何 byref,其他人告诉我这个问题只在使用 foreach 时出现..

为了澄清一个例子:

function doSomething()
{
    $aMyAr = array();
    $oUser = new User();

    addUser($aMyAr, $oUser);
}

function addUser($aDestArray, $oUser)
{
    $aMyAr[] = $oUser;
}

我知道你会想为什么不自己运行这个脚本并 echo/print_r 输出呢?好吧,由于某些原因,PHP4 无法在最新的 WAMP/XAMPP 中运行(是的,我尝试了一堆据说兼容的 apache 版本......)

【问题讨论】:

    标签: php4 byref


    【解决方案1】:

    变化只是,在 PHP4 中,对象被默认复制,而在 PHP5 中,它们被默认视为引用。即:

    $a = new stdClass();
    $a->prop = "original";
    $b = $a;
    
    $b->prop = "changed";
    echo $a->prop;
    
    # PHP4 outputs "original" because $a and $b are different objects
    # PHP5 outputs "changed" because $a and $b are the same object
    

    当您进行函数调用或使用 foreach 时,在 PHP4 中对象被复制而不是通过引用传递。

    要让 PHP4 的函数参数表现得像 PHP5,你只需要显式地pass function arguments by reference,即:

    function someFunc(& $someObject) {
      $someObject->prop = "changed";
    }
    
    someFunc($a);
    echo $a->prop; # prints "changed"
    

    所以,PHP4 面向对象的代码最终到处都是&(在过去编写真正的 OO 代码,这变得非常烦人!)。

    另一个例子是通过引用分配。 $b =& $a 在 PHP4 中对对象的作用与简单的 $b = $a 在 PHP5 中的作用相同。

    最后,通过引用返回。如果您在函数内创建一个对象并想要返回它(而不是返回它的副本),则必须使用& 定义该函数,即function &someFunc() {}

    再次,PHP docs 解释语法。到目前为止,最好的办法就是不要使用 PHP4!

    【讨论】:

    • 谢谢,这正是我要找的 :)
    • 酷,我已经打开了一个编辑框,里面有一些额外的信息给你,以防万一。如果您习惯了 PHP5,那么编写尤其是调试 PHP4 OO 代码会非常烦人(当时已经够烦人了)。经过这么多年的“正常”物体,我很难回去。
    • 是的,我很想使用 PHP5.3,客户无法升级,因为他有很多 webapps 正在运行,升级对于这个小项目需要付出很多努力。对我来说幸运的是,它只是一个有 10 个类的项目,所以不会出现太多可怕的错误。我只是不使用修饰符、__construct、foreach、接口和扩展。应该安全吧?
    • 哦,是的,你绝对可以做到,我也写了我的遗留代码。仅供参考,而不是 __construct 将构造函数命名为与类相同,您可以正常子类化/扩展。正常的foreach 可以正常工作,它在 PHP4 中(使用对象数组,如果你想要类似 PHP5 的行为,你必须记住使用引用,即foreach ($arr as &$value)),你不能使用 PHP5 迭代器。
    • 我在 C# 和 java 中也使用类名作为构造函数,所以我还是习惯了 :)。感谢您的帮助。
    猜你喜欢
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 2011-03-29
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多