Псевдонимы глобального пространства имен PHP

Вот сценарий.

Я внедряю пространства имен в свои проекты.

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

У меня нет проблем с использованием полных пространств имен в моей пользовательской библиотеке мостов, но я хотел бы, чтобы код был максимально кратким в моих контроллерах, моделях и представлении.

Вот пример некоторых псевдонимов, которые я хотел бы использовать:

use BridgeLibName\Stdlib\Arrays as arr;
use BridgeLibName\Stdlib\Objects as obj;
use BridgeLibName\Stdlib\Strings as str;
use BridgeLibName\Stdlib\Numbers as num;
use BridgeLibName\Stdlib\File as file;
etc.........

Пример использования:

$file = new file('path/to/file.txt');
$file->create();

or

$obj = arr::toObject(['key1'=>'value1']);

возможно ли каким-либо образом создать псевдоним или константу, которая может быть глобально доступна и не отбрасываться в конце каждого файла?

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


person Dieter Gribnitz    schedule 10.11.2013    source источник
comment
Нет, нельзя (по крайней мере, не в здравом уме).   -  person PeeHaa    schedule 10.11.2013
comment
Отлично работает, если на него ссылается поддельный класс. Однако нужно быть очень осторожным с реализацией.   -  person Dieter Gribnitz    schedule 10.11.2013
comment
Использование поддельных классов - ужасное решение проблемы, имхо.   -  person PeeHaa    schedule 10.11.2013
comment
Я согласен, что это ужасное решение. Но написать 20+ символов, когда это можно сделать с 3, еще хуже. Это делает мой код раздутым и нечитаемым. Если использовать осторожно, я думаю, что это может быть очень полезно. Пока вы никогда не реализуете его внутри библиотек, а только храните его внутри своего приложения. Написание BridgeLibName\Stdlib\Arrays::inArray() против arr::inArray() является проблемой. Если корневое пространство имен по какой-либо причине изменится, это будет сложно исправить глобально. Псевдонимы в каждом файле контроллера или модели создают ту же проблему.   -  person Dieter Gribnitz    schedule 10.11.2013
comment
Если у вас есть лучшее решение, я готов отказаться от поста и использовать его.   -  person Dieter Gribnitz    schedule 10.11.2013
comment
Если это то, как вы думаете об этом, пожалуйста, продолжайте. У меня просто сильное и другое мнение о вашем решении. И нет, у меня нет лучшего решения, потому что я не вижу проблемы.   -  person PeeHaa    schedule 10.11.2013
comment
Спасибо за ваше время. Я в значительной степени согласен с вашей точкой зрения и съеживаюсь от того, что сам использую этот метод, но, похоже, он полностью решает мою проблему, и это единственное, что работает. Поскольку мои библиотеки правильно используют пространства имен, я думаю, что это должно быть реализовано без каких-либо проблем с производительностью или создания конфликтов.   -  person Dieter Gribnitz    schedule 10.11.2013
comment
Если что-то работает для вас так, как вам нравится, используйте это. Не позволяйте какому-то случайному человеку в интарнете говорить вам обратное. Если вы потерпите неудачу позже в процессе или передумаете позже, это прогресс в любом случае.   -  person PeeHaa    schedule 10.11.2013


Ответы (1)


Когда я писал вопрос, я думал о решении.

Вы можете подделать его, создав классы, которые расширяют классы пространства имен.

пример:

class arr extends BridgeLibName\Stdlib\Arrays{

}

Следует помнить одну важную вещь:

Если вы собираетесь расширять классы, необходимо будет загрузить класс с пространством имен.

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

Поскольку я использую его только для соединения с другими классами, в моих файлах моста очень мало логики.

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

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


Хорошая вещь, которую я заметил, заключается в том, что хорошие IDE, такие как netbeans, также могут выполнять автозавершение с помощью этого метода.


Если есть лучший способ сделать это, пожалуйста, дайте мне знать.


Просто подумал о поправке к этому методу, чтобы решить проблему с ненужным созданием экземпляров класса.

Базовая библиотека может работать с обычным загрузчиком psr-0.

Чтобы автоматически загружать псевдонимы, я создал дополнительный каталог с именем include рядом с моим классом с пространством имен.

в композиторе вы описываете это так:

"autoload": {
    "psr-0": {
        "BridgeLibName\\": "."
    },
    "classmap": ["include/"]
}

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

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

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

person Dieter Gribnitz    schedule 10.11.2013
comment
Я просто подумал о чем-то. Метод, который я описал, на самом деле может быть очень полезен, если вам нужно обеспечить устаревшую поддержку библиотеки. Расширение классов с пространством имен позволит более старым системам использовать классы, как если бы они были обычными классами. Для новых проектов это можно легко отключить, удалив объявление classmap в composer. - person Dieter Gribnitz; 11.11.2013