我知道PHP4已经“死了”,但是我们的客户大约有二十几个仍然位于使用PHP4的服务器上,我们将在大约一年或两年后才能获得任何服务器升级。
我即将开始重构和改进我们的核心Web框架,现在编码为最低的公分母PHP4(例如,所有类都有var $ foo)。
我从来没有在PHP4中做过任何OO,但我想知道我是否应该为PHP版本创建不同的类,并且基于PHP的版本包含该版本?我意识到的缺点是,如果进行了更新,我将不得不更新两个地方,并且可能没有真正的世界优势。
因此,如果有人能提供有关如何支持旧版PHP版本的提示,我将非常感激。
答案 0 :(得分:1)
确保您的课程使用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...
}
...
}
所以它在两个PHP版本中都能很好用。
答案 1 :(得分:1)
我很难想象我会为php4开发任何东西,但如果我被迫,我可能会制作两个代码库来保持php5代码清洁和漂亮。
答案 2 :(得分:1)
大多数PEAR仍然以php4为目标,因此您可以将其用作“框架”。我相信drupal和codeignitor也仍然针对php4(也许是cakephp?)。
对象和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;
}
}
只想念其中一个&符号,你就是敬酒。此外,请确保您非常了解引用的行为方式 - 它们并不完全直观。