PHP Framework支持遗留PHP4?

时间:2009-11-11 09:21:14

标签: php php4

我知道PHP4已经“死了”,但是我们的客户大约有二十几个仍然位于使用PHP4的服务器上,我们将在大约一年或两年后才能获得任何服务器升级。

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

我从来没有在PHP4中做过任何OO,但我想知道我是否应该为PHP版本创建不同的类,并且基于PHP的版本包含该版本?我意识到的缺点是,如果进行了更新,我将不得不更新两个地方,并且可能没有真正的世界优势。

因此,如果有人能提供有关如何支持旧版PHP版本的提示,我将非常感激。

3 个答案:

答案 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;
  }
}

只想念其中一个&符号,你就是敬酒。此外,请确保您非常了解引用的行为方式 - 它们并不完全直观。