Класс конфликтует с плагинами фреймворков - PHP / Wordpress - PullRequest
1 голос
/ 28 апреля 2011

Я нахожусь на начальных этапах написания базовой среды разработки плагинов для WordPress MVC, и я понимаю, что у меня возникнет проблема конфликта имен. Если я захочу включить этот фреймворк в несколько плагинов и / или тем, которые я разрабатываю, в конце концов я столкнусь с проблемой, которую class_exists () не решит.

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

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

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

Ответы [ 3 ]

1 голос
/ 28 апреля 2011

Пространство имен может решить вашу проблему.

0 голосов
/ 26 мая 2011

Решение, которое я выбрал в итоге, состояло в том, чтобы создать файл 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' );
}
0 голосов
/ 28 апреля 2011

UPDATE

Извиняюсь перед тем, что спрашиваю, что не понял это правильно с первого раза. Люк прав. Пространство имен - лучший вариант.

Оригинал

Некоторые фреймворки предпочитают помещать буквы перед именами своих классов, чтобы избежать конфликтов. Yii просто нокаутирует C впереди:

class CClassName 
{
}
...