0

PHP4が「死んでいる」ことは知っていますが、PHP4が使用されているサーバーにはまだ約2ダースほどのクライアントがあり、サーバーのアップグレードは1〜2年ほど行われません.

コア Web フレームワークのリファクタリングと改善に取り組み始めようとしています。これは現在、最小公分母である PHP4 用にコーディングされています (たとえば、すべてのクラスに var $foo があります)。

PHP4 で OO を行ったことはありませんが、PHP バージョンごとに異なるクラスを作成し、PHP のバージョンに基づいてそのバージョンを含める必要があるかどうか疑問に思っています。私が認識しているマイナス面は、更新が行われた場合に 2 つの場所を更新する必要があり、実際には利点がない可能性があることです。

そのため、レガシー PHP バージョンをサポートする方法についてヒントを提供できる人がいれば、非常にありがたいです。

4

3 に答える 3

1

php4用に何かを開発することはほとんど想像できませんが、強制された場合は、php5コードをクリーンで快適に保つために2つのコードベースを作成する可能性があります。

于 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;
  }
}

これらのアンパサンドの 1 つを逃すと、乾杯します。また、参照がどのように動作するかを十分に理解していることを確認してください。参照は正確には直感的ではありません。

于 2009-11-11T10:26:37.263 に答える
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 に答える