Статьи

‘клон’ для PHP4

Стивен Виттенс из Acko.net описывает способ реализации функции клонирования в PHP4 для эмуляции поведения клонов в PHP5.

Идея состоит в том, чтобы написать объектно-ориентированные программы, которые будут вести себя одинаково как в PHP4, так и в PHP5. Очевидно, что недостатком этого является то, что вы не можете использовать возможности только PHP5, такие как методы деструктора объекта. Но если вы принимаете ограничения, вы все равно можете написать код для PHP4, который работает на PHP5, но есть несколько важных ошибок. Обработка объектов и ссылок в PHP5 — одна из этих проблем.

В PHP4 вы можете создать копию объекта, используя только оператор equals (=). Тем не менее, в PHP5 это создаст другую ссылку на тот же объект (так же, как Java). PHP5 определяет ключевое слово clone , которое можно использовать для создания отдельной копии объекта.

Строго говоря, клон PHP5 — это не функция. Это языковая конструкция, и (как и некоторые другие языковые конструкции, такие как exit и include ), она может использоваться с круглыми скобками или без них. Если мы собираемся эмулировать его в PHP с помощью функции, нам всегда нужно использовать его в скобках.

Метод Стивена определяет «клон» как функцию при использовании PHP4, но все же позволяет использовать встроенный в клон PHP5 при работе в PHP5.

Недостатком его метода является его зависимость от eval , который я считаю неэффективным решением (см. Разглагольствование Лахлана о eval ). Здесь eval используется для предотвращения определения функции при использовании PHP5 (это зарезервированное слово в PHP5).

Если вы действительно не заботитесь о eval, возможным решением будет использование условного включения. Поместите определение функции для клона в отдельный файл php4.inc.php и включайте этот файл только в том случае, если PHP5 не используется.

Поэтому следующий код должен обеспечивать эмуляцию PHP4 клона PHP5 без использования eval:

php4.inc.php


// Define a PHP4 emulation of PHP5's clone
function clone($object)
{
return $object;
}

Ваше приложение:


if (version_compare(phpversion(), '5.0') < 0)
{
include 'php4.inc.php';
}

// For example, we can create an object
$object = &new object();

// Clone it!
$myclone = clone($object);

Что если вы не хотите клонировать объект? Если вы сделали какой-либо ООП в PHP4, то вы будете знакомы с использованием оператора ссылки & для передачи ссылки на объект. Хорошая новость заключается в том, что в PHP5 это продолжит работать.

С другой стороны, мы получили от вас много отзывов о том, что мешает вам полностью перейти на PHP5 . К различным проблемам относятся веб-хосты, не желающие двигаться, нарушение совместимости (особенно проблема клонирования, обсуждаемая в этой статье), а также проблемы со стабильностью, в то время как другие пользователи сообщают, что они с удовольствием используют исключительно PHP5 и не оглядываются назад.