我知道PHP4已经“死了”,但是我们有大约20多个客户端仍然位于使用PHP4的服务器上,我们直到一两年左右才会得到任何服务器升级。
我正要开始重构和改进我们的核心web框架,它现在被编码为最小的公分母PHP4 (例如所有的类都有变量$foo )。
我从来没有在PHP4中做过任何面向对象的工作,但是我想知道我是否应该为不同的PHP版本制作不同的类,并根据PHP的版本包括那个版本?我意识到的缺点是,如果进行了更新,我将不得不更新两个地方,而这可能没有实际的优势。
因此,如果有人能提供关于如何支持遗留PHP版本的提示,我将不胜感激。
发布于 2009-11-11 18:26:37
PEAR的大部分仍然是针对php4的,所以你可以把它作为一个“框架”来使用。我相信drupal和codeignitor也在瞄准php4 (也许cakephp也是如此?)。
objects和php4最大的问题是对象是按值传递的,因此您需要使用引用来获取大多数其他语言(包括php5)对对象具有的常见语义。您必须非常小心,始终将引用分配给对象。否则它将被隐式克隆。这是单调乏味的,如果你搞砸了也很难调试。此外,它还会使您的代码与php5不兼容。例如:
创建对象:
$foo =& new Foo();将对象作为参数传递给函数:
class Bar {
function cuux(&$foo) {
}
}
$bar =& new Bar();
$bar->cuux($foo);由于参数是引用,所以不能传递常量。因此,如果您必须传递NULL而不是对象,则必须首先将NULL赋给局部变量。例如:
$bar =& new Bar();
$foo = null;
$bar->cuux($foo);从函数返回对象:
class Bar {
function &doink() {
$foo =& new Foo();
return $foo;
}
}
$bar =& new Bar();
$foo =& $bar->doink();请注意,您必须将$foo赋给一个变量,这使得不可能直接返回另一个函数的结果。例如:这是非法的:
class Bar {
function &doink() {
return $this->foo->doink();
}
}它应该是:
class Bar {
function &doink() {
$tmp =& $this->foo->doink();
return $tmp;
}
}只要错过其中一个,你就完蛋了。另外,要确保你对引用的行为有很好的理解--它们并不是很直观。
发布于 2009-11-11 17:31:25
确保您的类是用PHP 4语法编写的,即:
class MyClass {
var $my; // PHP4 style declaration
function MyClass() { // PHP4 constructor
$this->__construct(); // calling PHP5 constructor
}
function __construct() { // PHP5 constructor
$this->my = 1;
...other initialization stuff...
}
...
}因此,它在和两个版本中都能很好地工作。
发布于 2009-11-11 17:54:12
我很难想象我会为php4开发任何东西,但如果我必须这样做,我可能会做两个代码库来保持php5代码的整洁和美观。
https://stackoverflow.com/questions/1714023
复制相似问题