Если вашему плагину нужен объект словаря, он должен запросить его:
class MyPlugin
{
/**
* @var Dictionary
*/
private $dictionary;
private function __construct(Dictionary $dictionary)
{
$this->dictionary = $dictionary;
}
Теперь вы свободно связали свой плагин с Dictionary
, класс плагина больше не отвечает за созданиеСловарь для себя, потому что он вводится.Он берет то, что ему нужно.
Так как это будет работать?Плагин должен быть где-то создан, поэтому для этого нужна фабрика.Метод фабричной сборки знает, что нужно вашему плагину:
class MyPluginFactory
{
public static function build($pluginName)
{
$plugin = NULL;
switch($pluginName)
{
case 'MyPlugin':
$dictionary = new Dictionary();
$plugin = new MyPlugin($dictionary);
}
return $plugin;
}
}
Поскольку это WordPress, мы знаем, что начальная загрузка плагина осуществляется путем включения файла плагина.Итак, в начале плагин должен быть создан.Поскольку включения выполняются в глобальной области, мы хотим сохранить объект плагина в памяти, но, вероятно, не будучи доступными в качестве глобальной переменной.Это не мешает вам создавать более одного экземпляра плагина, но гарантирует, что когда WordPress инициализирует ваш плагин (загружает ваш плагин), он будет использовать только этот единственный экземпляр.Это можно сделать, добавив к фабрике плагинов некоторую дополнительную функцию:
class MyPluginFactory
{
...
public static $plugins;
public static function bootstrap($pluginName)
{
$plugin = self::build($pluginName);
self::$plugins[] = $plugin;
return $plugin;
}
Позаботьтесь, чтобы единственное использование статической переменной-члена класса было только для того, чтобы плагин оставался в памяти.Технически это глобальная переменная, которую мы обычно хотим предотвратить, однако, экземпляр должен где-то храниться, так что вот (я изменил это на public, потому что является глобальной переменной, и это не должно бытьстесняться этого. Наличие публичного может помочь в некоторых обстоятельствах, когда закрытый или защищенный слишком ограничительный. Также это не должно быть проблемой. Если это является проблемой, есть другая проблема, которая должна быть исправленаfirst).
Это в основном отделяет код вашего плагина от самого wordpress.Возможно, вы захотите также создать класс, который будет предлагать и взаимодействовать с любой функцией WordPress, которую вы используете, поэтому вы не привязаны к этим функциям напрямую, и ваш код плагина остается чистым и слабо связанным с самим WordPress.
class WordpressSystem
{
public function registerFilter($name, $plugin, $methodName)
{
... do what this needs with WP, e.g. call the global wordpress function to register a filter.
}
...
}
Затем снова добавьте его в качестве зависимости, если вашему плагину требуется WordpressSystem
для выполнения задач (что обычно имеет место):
class MyPlugin
{
...
public function __construct(WordpressSystem $wp, Dictionary $dictionary)
...
Таким образом, чтобы окончательно обернуть это, только плагинТребуется php-файл:
<?php
/*
* MyPlugin
*
* Copyright 2010 by hakre <hakre.wordpress.com>, some rights reserved.
*
* Wordpress Plugin Header:
*
* Plugin Name: My Plugin
* Plugin URI: http://hakre.wordpress.com/plugins/my-plugin/
* Description: Yet another wordpress plugin, but this time mine
* Version: 1.2-beta-2
* Stable tag: 1.1
* Min WP Version: 2.9
* Author: hakre
* Author URI: http://hakre.wordpress.com/
* Donate link: http://www.prisonradio.org/donate.htm
* Tags: my
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
Namespace MyPlugin;
# if your file is named 'MyPlugin.php' this will be 'MyPlugin'.
return PluginFactory::bootstrap(basename($plugin, '.php'));
class PluginFactory
{
private static $plugins;
public static function bootstrap($pluginName)
{
$plugin = self::build($pluginName);
self::$plugins[] = $plugin;
return $plugin;
}
public static function build($pluginName)
{
$plugin = NULL;
switch($pluginName)
{
case 'MyPlugin':
# Make your plugin work with different Wordpress Implementations.
$system = new System\Wordpress3();
$dictionary = new Dictionary();
$plugin = new Plugin($system, $dictionary);
}
return $plugin;
}
}
class Plugin
{
/**
* @var System
*/
private $system;
/**
* @var Dictionary
*/
private $dictionary;
private function __construct(System $system, Dictionary $dictionary)
{
$this->system = $system;
$this->dictionary = $dictionary;
}
...
Метод начальной загрузки также может позаботиться о регистрации автозагрузчика или выполнить необходимые действия.
Надеюсь, это полезно.