我知道,PHP4是“死”的,但也有我们的客户,仍然位于在使用PHP4的服务器大约二十二左右,而我们不会得到任何服务器升级,直到一两年左右。
我正要开始致力于重构和提高我们的核心网络架构,这是目前编码的最小公分母,PHP4(例如,所有类都具有变量$ FOO)。
我从来没有做过任何PHP4 OO但我不知道我是否应该为PHP版本进行不同的类,并且基于PHP的版本包括版本? 我认识的缺点是,我想如果有一个更新是为了更新两个地方,并有可能成为没有现实世界的优势吧。
因此,如果任何人都可以提供他们如何支持传统的PHP版本的提示,我将不胜感激。
大多数PEAR的仍瞄准PHP4,所以你可以使用它作为一个“框架”。 我相信Drupal和codeignitor也仍然瞄准PHP4(也或许CakePHP的?)。
使用对象和PHP4的最大问题是,对象是按值传递,所以你需要使用引用来获取常用语义,大多数其他语言中有物体(包括PHP5)。 你必须非常小心,总是分配给对象的引用。 否则将被隐式克隆。 这是乏味的很辛苦,如果你搞砸了调试。 此外,它会使你的代码在PHP5不兼容。 例如。:
创建一个对象:
$foo =& new Foo();
通过一个对象作为参数的函数:
class Bar {
function cuux(&$foo) {
}
}
$bar =& new Bar();
$bar->cuux($foo);
由于参数是引用,你不能传递一个常数。 所以,如果你必须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;
}
}
小姐只是那些&符号之一,你就完了。 此外,请确保您有引用的行为很好理解 - 他们不完全直观。
确保你的类都写在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版本工作的伟大。
我很难想象我开发PHP4什么,但如果我被迫我可能做两个代码库保持PHP5代码干净,漂亮。