2011-05-31 99 views
2

我很习惯于PHP5,但必须编写一个PHP4同步脚本,现在我正在做一些挖掘以找到PHP5和4之间的差异。问题是我得到了很多矛盾,有些网站告诉我PHP4有没有按地址和任何人告诉我,这个问题只发生使用的foreach时..参考PHP4参数?

要澄清一个例子:

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

    addUser($aMyAr, $oUser); 
} 

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

我知道你会思考你为什么不只是运行此脚本自己和回声/ print_r的输出?那么由于某些原因,PHP4将不会运行在最新的WAMP/XAMPP(是的,我尝试了一个被称为兼容的Apache版本的垃圾负载...)

回答

3

只有这样的改变,在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面向对象的代码风了&散落各地的地方(写入真正面向对象的代码回来的时候,这非常令人讨厌!)。

另一个例子是按引用分配。 $b =& $a用PHP4中的对象做什么简单的$b = $a在PHP5中做什么。

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

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

+0

谢谢,那就是我一直在寻找:) – Rob 2011-05-31 21:08:27

+0

很酷,我已经有一个编辑框打开,并附带一些额外的信息,以防万一。编写和特别调试PHP4 OO代码如果习惯于PHP5,那么它会非常快速地变得非常烦人(当时它很烦人)。经过这么多年的“正常”物体之后,我会很难再回来。 – joelhardi 2011-05-31 21:24:43

+0

是的,我很乐意使用PHP5.3,客户无法升级,因为他有很多webapps在运行,升级会花费很多精力为这个小型项目做。 幸运的是,这只是一个有10个班级的项目,所以没有那么多的可怕的错误。我只是没有使用修饰符,__construct,foreach,接口和扩展。应该安全吗? – Rob 2011-05-31 21:33:59