Аннотация: В этой статье автор показывает нам различные передовые технологии ООП в PHP на примерах, основанных на его понимании концепций ООП. Как сказал автор: «
Если вы понимаете основные концепции ООП, то я вам
».будут показаны более продвинутые методы.
Сериализация (сериализация)
PHP не поддерживает постоянные объекты. В ООП постоянный объект — это объект, который может сохранять состояние и функциональность среди ссылок в нескольких приложениях. Это означает возможность сохранять объект в файл или базу данных и загружать его. объект позже. Это так называемый механизм сериализации. PHP имеет метод сериализации, который можно вызвать для объекта, и этот метод сериализации может возвращать строковое представление объекта. Однако сериализация сохраняет только данные-члены объекта, а не методы.
В PHP4, если вы сериализуете объект в строку $s, затем освобождаете объект, а затем десериализуете объект в $obj, вы можете продолжать использовать методы объекта! Я не рекомендую этого делать, потому что (а) в документации нет гарантии, что такое поведение будет работать в будущих версиях. (б) Это может привести к недопониманию при сохранении сериализованной версии на диск и выходе из сценария. Когда вы позже запустите этот сценарий, вы не можете ожидать, что при десериализации объекта его методы останутся там, поскольку строковое представление вообще не включает методы.
В общем, сериализация в PHP очень полезна для сохранения переменных-членов объекта. (Вы также можете сериализовать связанные массивы и массивы в файл).
Пример:
<?php
$obj=new Classfoo();
$str=serialize($obj);
//Сохраняем $str на диск
//Несколько месяцев спустя
//Загружаем str с диска.
$obj2=десериализовать($str)
Вы восстановили данные членов, но не методы (согласно документации). В результате получается единственный способ получить доступ к переменным-членам (другого способа у вас нет!), например, с помощью $obj2->x, поэтому не пытайтесь повторить это дома.
Есть несколько способов решить эту проблему, я их опускаю, потому что они слишком плохи для этой краткой статьи. Я бы с радостью приветствовал полностью сериализованные функции в последующих версиях PHP.
Использование классов для хранения данных Одна из замечательных особенностей PHP и ООП заключается в том, что вы можете легко определить класс для выполнения каких-либо действий и вызывать соответствующий класс всякий раз, когда захотите его использовать. Предположим, у вас есть HTML-форма, которая позволяет пользователю выбирать продукт, выбирая идентификационный номер продукта. В базе данных есть информация о товаре, и вы хотите отобразить товар, его цену и т. д. У вас разные типы продуктов, и одно и то же действие может означать разное для разных продуктов. Например, отображение звука может означать его воспроизведение, но для продуктов других типов это может означать отображение изображения, хранящегося в базе данных. Вы можете использовать ООП или PHP, чтобы уменьшить количество кода и улучшить качество.
Определите класс продукта, определите методы, которые он должен иметь (например: display), а затем определите класс для каждого типа продукта, производный от класса продукта (класс SoundItem, класс ViewableItem и т. д.), охватывающий методы продуктов в классы, чтобы заставить их вести себя так, как вы хотите.
Назовите класс в соответствии с полем типа каждого продукта в базе данных. Типичная таблица продуктов может иметь поля (идентификатор, тип, цена, описание и т. д.)... Затем в сценарии обработки вы можете получить его из базы данных. Получите значение типа из , а затем создайте экземпляр объекта с именем type:
<?php
$obj=new $type();
$obj->action();
Это очень хорошая особенность PHP. Вы можете вызывать метод display или другие методы $obj, не принимая во внимание тип объекта. Используя этот метод, вам не нужно модифицировать сценарий для добавления нового типа объекта, достаточно создать класс для его обработки.
Эта функция очень мощная. Просто определите методы, не учитывая типы всех объектов, реализуйте их в разных классах разными методами, а затем используйте их в основном скрипте для любого объекта, нет, если... иначе, нет. Требуется два программиста. только счастлив.
Теперь вы согласны с тем, что программирование просто, обслуживание дешево и возможность повторного использования верна?
Если вы управляете группой программистов, распределять работу очень просто; каждый человек может отвечать за тип объекта и класс, который его обрабатывает.
Интернационализация может быть достигнута с помощью этой технологии, просто примените соответствующий класс в соответствии с языковым полем, выбранным пользователем, и так далее.
Копирование и клонирование
Когда вы создаете объект $obj, вы можете скопировать его по формуле $obj2=$obj. Новый объект является копией (а не ссылкой) $obj, поэтому на тот момент он имеет состояние $obj. . Иногда вы не хотите этого делать. Вам просто нужно создать новый объект, например класс obj. Вы можете вызвать конструктор класса, используя оператор new. Этого также можно достичь в PHP посредством сериализации и базового класса, но все остальные классы должны быть производными от базового класса.
Вход в опасную зону
Когда вы сериализуете объект, вы получаете строку в каком-то формате, который вы можете запросить, если вам интересно, где в строке есть имя класса (отлично!), и вы можете поместить его вынимается так:
<?php
$herring=serialize($obj);
$vec=explode(':',$herring);
$nam=str_replace(""",'',$vec[2]) ;
Итак, предполагая, что вы создаете класс «Universe» и заставляете все классы расширяться из юниверса, вы можете определить метод клонирования в юниверсе следующим образом:
<?php
function clone() {
$herring=serialize($ this)
; взорвать(':',$herring);
$nam=str_replace(""",'',$vec[2]);
$ret=new $nam;
return $ret;
}
}
/ /Then
$obj=new Something();
//Расширить вселенную
$other=$obj->clone();
Вы получаете новый объект класса Something, который аналогичен объекту, созданному с помощью нового метода и вызова конструктора. Я не знаю, сработает ли это для вас, но хорошее практическое правило гласит, что класс юниверса знает имя производного класса. Воображение – единственный предел.
Этот оператор записывает текущее время.