0

我知道 PHP4 已经“死”了,但是我们大约有两打左右的客户端仍然位于使用 PHP4 的服务器上,而且我们要等一两年左右才能进行任何服务器升级。

我正要开始重构和改进我们的核心 Web 框架,它现在是为最低公分母 PHP4 编码的(例如,所有类都有 var $foo )。

我从来没有在 PHP4 中做过任何面向对象,但我想知道我是否应该为 PHP 版本制作不同的类,并且基于 PHP 的版本包括那个版本?我意识到的缺点是,如果进行了更新,我将不得不更新两个地方,而且它可能没有现实世界的优势。

因此,如果有人可以提供有关他们如何支持旧 PHP 版本的提示,我将不胜感激。

4

3 回答 3

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 版本中都能很好地工作。

于 2009-11-11T09:31:24.893 回答
1

我很难想象我会为 php4 开发任何东西,但如果我被迫这样做,我可能会创建两个代码库来保持 php5 代码的整洁和美观。

于 2009-11-11T09:54:11.757 回答
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;
  }
}

错过其中一个 & 符号,你就完蛋了。另外,请确保您对引用的行为方式有很好的理解——它们并不完全直观。

于 2009-11-11T10:26:37.263 回答