Я знаю, что PHP4 «мертв», однако около двух десятков наших клиентов, которые все еще находятся на серверах, где используется PHP4, и мы не будем получать обновления сервера до года или двух.
Я вот-вот начну работать над рефакторингом и улучшением нашей основной веб-структуры, которая теперь кодируется для самого низкого общего знаменателя, PHP4 (например, все классы имеют var $ foo).
Я никогда не делал OO в PHP4, но мне интересно, следует ли мне создавать разные классы для версий 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 вместо объекта, вы должны сначала присвоить 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; } }
Мисс только один из тех амперсандов, и вы тосты. Кроме того, убедитесь, что у вас есть очень хорошее представление о том, как ведут себя ссылки – они не совсем интуитивно понятны.
Я вряд ли могу представить, что я что-то разрабатываю для php4, но если бы я был вынужден, чтобы я мог сделать два кода, чтобы сохранить код php5 чистым и приятным.
Убедитесь, что ваши классы написаны в синтаксисе 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 .