Поддержка PHP Framework для устаревшего PHP4? - PullRequest
0 голосов
/ 11 ноября 2009

Я знаю, что PHP4 "мертв", однако около двух десятков наших клиентов все еще находятся на серверах, где используется PHP4, и мы не получим никаких обновлений сервера примерно через год или два.

Я только начинаю работать над рефакторингом и улучшением нашей базовой веб-инфраструктуры, которая теперь написана для наименьшего общего знаменателя, PHP4 (например, все классы имеют переменную $ foo).

Я никогда не делал никаких ОО в PHP4, но мне интересно, должен ли я создавать разные классы для версий PHP, и основаны ли на версии PHP эту версию? Недостатком, который я понимаю, является то, что мне пришлось бы обновить два места, если бы обновление было сделано, и в этом не может быть никакого реального преимущества.

Так что, если кто-нибудь сможет дать советы о том, как они поддерживают устаревшие версии PHP, я был бы очень признателен.

Ответы [ 3 ]

1 голос
/ 11 ноября 2009

Я с трудом могу представить, что я разрабатываю что-то для php4, но если бы меня заставили, я бы, вероятно, сделал бы две кодовые базы, чтобы код php5 был чистым и красивым.

1 голос
/ 11 ноября 2009

Большая часть PEAR все еще нацелена на php4, так что вы можете использовать это в качестве «фреймворка». Я полагаю, что drupal и codeignitor по-прежнему нацелены на php4 (возможно, на cakephp?).

Самая большая проблема с объектами и php4 заключается в том, что объекты передаются по значению, поэтому вам нужно использовать ссылки, чтобы получить обычную семантику, которую большинство других языков имеют для объектов (включая php5). Вы должны быть очень осторожны, чтобы всегда назначать ссылку на объекты. В противном случае он будет неявно клонирован. Это утомительно и очень трудно отлаживать, если вы запутались. Кроме того, это сделает ваш код несовместимым с php5. Eg.:

Создание объекта:

$foo =& new Foo();

Передача объекта в качестве аргумента функции:

class Bar {
  function cuux(&$foo) {
  }
}
$bar =& new Bar();
$bar->cuux($foo);

Поскольку аргументы являются ссылками, вы не можете передать константу. Так что если вы должны передать NULL вместо объекта, вы должны сначала присвоить NULL локальной переменной. Eg.:

$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 голос
/ 11 ноября 2009

Убедитесь, что ваши классы написаны в синтаксисе 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 .

...