Как избежать столкновения имен классов PHP при распространении в виде библиотеки? - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь написать небольшой PHP класс updater, который можно использовать в нескольких плагинах Wordpress. Структура каталогов выглядит следующим образом:

Plugins
--pluginA
---main.php
---updater.php

--pluginB
---main.php
---updater.php

--pluginC
---main.php
---updater.php

Updater. php

class updater {

}

main. php

require_once 'updater.php';
new updater();

Но я всегда получаю фатальную ошибку, поскольку существует несколько определений одного и того же имени класса.

Мой подход # 1

if ( ! class_exists( 'start' ) ):
class updater {

}
endif;

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

Мой подход # 2 Я пробовал с пространствами имен. Он говорит неопределенный класс, потому что он пытается импортировать класс из текущего пространства имен pluginA. Здесь проблема в том, что плагин может уже иметь пространство имен согласно удобству разработчика или его структуре каталогов. И я не хочу, чтобы разработчики модифицировали ни свои собственные пространства имен, ни пространства имен lib.

Updater. php

namespace myLib;
class updater {
}

main. php

namespace pluginA;

require_once 'updater.php';
use myLib\updater;
new updater();

Итак, как я могу распространить мою библиотеку среди всех разработчиков, которые могут просто добавить несколько строк в свой основной файл. php и начать использовать мою библиотеку? Является ли единственным решением сделать имя класса полностью уникальным?

1 Ответ

0 голосов
/ 06 января 2020

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

Самый быстрый способ - не использовать одно и то же имя класса. Если вы настаиваете на использовании того же имени класса, вы должны использовать пространство имен для его разделения.

Выдержка PSR-4, спецификация 2-1 выглядит следующим образом:

  1. Полное имя класса ДОЛЖНО иметь имя пространства имен верхнего уровня, также известное как «пространство имен поставщика».
  2. Полное имя класса МОЖЕТ иметь один или несколько дочерних элементов. Имена пространств имен.

Если вы хотите сохранить имя поставщика, я думаю, что это нормально, но, по крайней мере, сохраните имя плагина.

Примите pluginA как Например, используйте myLib в качестве имени плагина и измените updater.php и main.php на:

Updater. php

namespace myLib\pluginA;

class updater {
}

main. php

require_once 'updater.php';

namespace myLib\pluginA;

new updater(); // Full class name  is myLib\pluginA\update

Другой плагин должен сделать это, в противном случае конфликт имен будет по-прежнему существовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...