Я прочитал весь этот пост . В нем описывается класс обертки для других опытных программистов, но не для новичков, подобных мне.
Я понимаю PHP-синтаксис, объектно-ориентированную концепцию, но еще не написал собственное приложение в объектно-ориентированном коде. Я не смущен, когда пытаюсь выяснить, что такое класс обертки. Я не понимаю технический жаргон.
Надеюсь, что кто-то отвечает красивым подробным детским описанием, которое легко понять для кого-то, кто понимает основы объектно-ориентированной программы и прочитал почти всю ссылку на язык php.net, но не имеет реального объектно-ориентированного программирования. Пока нет приложений.
Поскольку объяснения по вопросу, с которым вы связаны, довольно обширны, я больше не буду переопределять его для вас. Вместо этого я попытаюсь показать вам пример инъекции.
class Logger { private $__logger; public function __construct($logger) { $class = $logger . "Logger"; $this->$__logger = new $class(); } public function write($message) { $this->$__logger->write($message); } }
Итак, выше у вас есть класс Logger
который вы можете использовать для записи информации где-то. Нам все равно, как это происходит, мы просто знаем, что это так.
Теперь у нас есть пара различных возможностей ведения журнала …
class DBLogger { public function write($message) { // Connect to the database and // INSERT $message } } class FileLogger { public function write($message) { // open a file and // fwrite $message } } class EMailLogger { public function write($message) { // open an smtp connection and // send $message } }
Теперь, когда мы используем наш регистратор, мы делаем это, выполняя любое из следующих действий:
$logger = new Logger("DB"); $logger = new Logger("EMail"); $logger = new Logger("File");
Мы всегда взаимодействуем с $logger
одинаково (т. Е. Называем write($message)
). Экземпляр экземпляра- Logger
обертывает фактический класс ведения журнала и вызывает его методы от нашего имени.
Более распространенное использование вышеуказанного типа кода было бы при использовании файлов конфигурации для определения того, что ваш регистратор. Например, рассмотрите случай, когда вы хотите, чтобы ваш журнал был отправлен в файл. У вас может быть конфигурация, которая выглядит так:
$logging = array( 'type' => 'file', 'types' => array( 'file' => array( 'path' => '/var/log' 'name' => 'app_errors.log' ), 'email' => array( 'to' => 'webmaster@domain.com', 'from' => 'error_logger@domain.com', 'subject' => 'Major fail sauce' ), 'db' => array( 'table' => 'errors', 'field' => 'error_message' ) ) );
И ваши адаптированные классы могут выглядеть так:
class FileLogger { public function __construct() { // we assume the following line returns the config above. $this->config = Config::get_config("logger"); } public function write($message) { $fh = fopen($this->config->path . '/' . $this->config->file); fwrite($fh, $message . "\n"); fclose($fh); } }
Мы бы сделали то же самое для других adapted
классов. Затем, с небольшим изменением основного Wrapper Logger
, мы могли бы создать правильный завернутый экземпляр, используя данные конфигурации и основывать его на type
который определен в конфиге. Когда у вас есть что-то подобное, переключение на регистрацию по электронной почте так же просто, как изменение type
в конфиге.
Классы Wrapper просто делают свой класс детей более удобным для использования в определенных обстоятельствах. Многие библиотеки написаны для охвата самых разных ситуаций и поэтому становятся громоздкими и сложными в использовании. Многие проекты создадут обертки для библиотеки, чтобы упростить ее использование.
Возьмите это использование класса PDO, например:
$sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour'); $sth->bindParam(':calories', $calories, PDO::PARAM_INT); $sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12); $sth->execute();
Не беспокойтесь о деталях. Просто знайте, что эти строки кода запрашивают базу данных. Класс-оболочка позволяет использовать те же функции выше:
Db::query('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour', array($calories, $colour));
Мы удалили некоторые из громоздких, но редко используемых функций дочернего класса в простой в использовании интерфейс. Внутри класса-оболочки создается тот же вид вызовов PDO, но это скрыто от разработчика.
Отказ от ответственности: примеры – это просто примеры. Не предназначено для показа лучших практик или даже быть практичным.