2013-11-10 9 views
1

Вот сценарий.PHP Глобальные псевдонимы пространства имен

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

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

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

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

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(); 

или

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

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

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

+0

Нет, вы не можете (по крайней мере, не разумно). – PeeHaa

+0

Прекрасно работает, если ссылается на поддельный класс. Однако нужно быть очень осторожным с реализацией. –

+0

Использование «поддельных» классов - это ужасное решение проблемы без проблем imho. – PeeHaa

ответ

2

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

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

пример:

class arr extends BridgeLibName\Stdlib\Arrays{ 

} 

Одна важная вещь, чтобы помнить:

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

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

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

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

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


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


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

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

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

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

в композиторе вы описать следующим образом:

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

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

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

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

+1

Я просто хоть что-то. Метод, который я описал, может быть очень полезным, если вам нужно предоставить устаревшую поддержку библиотеки. Расширение классов с расширением имен позволит старым системам использовать классы, как если бы они были обычными классами. Для новых проектов это можно легко отключить, удалив декларацию classmap в композиторе. –