#php #wordpress #namespaces
#php #wordpress #пространства имен
Вопрос:
Я нахожусь на начальных этапах написания базовой платформы разработки плагинов MVC WordPress, и я понимаю, что у меня возникнет проблема с конфликтом имен. Если я захочу включить этот фреймворк в несколько плагинов и / или тем, которые я разрабатываю, в конечном итоге я столкнусь с проблемой, которую class_exists () не собирается решать.
Я мог бы создать фреймворк как автономный плагин, но это потребовало бы, чтобы любой, кто загрузил один из моих плагинов или тем, также загрузил фреймворк, что не кажется реалистичным (особенно для обновлений существующих плагинов, у которых в настоящее время нет такой зависимости).
В любом случае, я подумал, что многие из вас, вероятно, сталкивались с подобными проблемами, и я хотел посмотреть, разработал ли кто-нибудь хорошую стратегию для решения проблемы.
Если возможно, я не знаю, что нужно иметь уникальный префикс для каждого плагина (это превратит обновление фреймворка в кошмар). Я надеюсь, что есть какой-нибудь умный способ динамического присвоения имен каждому из этих классов без необходимости его жесткого кодирования.
Ответ №1:
Пространство имен может решить вашу проблему.
Комментарии:
1. Не совсем, во-первых, для всех пространств имен требуется php 5.3., который многие люди не используют, а во-вторых, (насколько я могу судить) пространства имен не могут создаваться динамически, поэтому я застрял с той же проблемой.
2. Без пространства имен, без префикса, мне очень любопытно, как вы могли бы решить свою проблему.
Ответ №2:
Обновить
Приношу извинения задавшему запрос за то, что не понял это правильно с первого раза. Люк прав. Пространство имен — лучший вариант.
Оригинал
Некоторые фреймворки предпочитают ставить букву перед именами своих классов, чтобы избежать конфликтов. Yii просто использует C впереди, как:
class CClassName
{
}
Комментарии:
1. Я специально указал в вопросе, что я не хочу жестко кодировать префикс. Причина в том, что я хочу сделать фреймворк доступным для всех, кто может зайти в свой проект, и я не хочу просить их просмотреть каждый отдельный файл класса и изменить его на что-то уникальное.
Ответ №3:
Решение, которое я в конечном итоге выбрал, состояло в том, чтобы создать bootstrap.php
файл, чтобы каждый экземпляр фреймворка регистрировал (в глобальной переменной), какая у него версия и путь к его файлу. Затем я регистрирую действие для запуска после загрузки всех плагинов / темы, которое сравнивает все версии и загружает только классы, связанные с самой последней версией.
Единственным недостатком, который я вижу в этом, является то, что мне пришлось бы убедиться, что мой фреймворк обратно совместим, но я все равно планировал это сделать.
Вот код, который я использовал в своем файле начальной загрузки. Очевидно, что номер версии в каждом экземпляре фреймворка должен соответствовать номеру версии включенного фреймворка.
// register this version of the framework
$GLOBALS['pw_framework_meta']['0.1.2'] = __FILE__;
if ( !function_exists('pw_framework_init') ) {
/**
* Sort the $GLOBALS['pw_framework_meta'] variable for the latest registered
* version of the framework. Include the PW_Framework.php file and then call init()
*/
function pw_framework_init()
{
// get all the different versions registered with $GLOBALS['pw_framework_meta']
$versions = $GLOBALS['pw_framework_meta'];
// sort the versions
uksort($versions, 'version_compare');
// get the latest versions (the last in the array)
$latest = end($versions);
if ( !class_exists('PW_Framework') ) {
require_once( dirname($latest) . '/PW_Framework.php' );
}
PW_Framework::init();
}
// register pw_framework_init() with the 'after_setup_theme' hook
// This way we can ensure that all plugins or themes that might be using PW_Framework
// have had a chance to register with the $GLOBALS['pw_framework_meta'] variable
add_action( 'after_setup_theme', 'pw_framework_init' );
}