Псевдоними за глобално пространство на 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
Използването на фалшиви класове е ужасно решение на непроблемен imho.   -  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 loader.

За да има автоматично зареждане на псевдонимите, създадох допълнителен директория с име "включва" до моя клас с пространство от имена.

в composer го описвате така:

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

Сега вашите библиотеки ще се зареждат според очакванията от правилното пространство на имената и вашите класове на псевдоними ще се зареждат автоматично според нуждите.

Класовете, поставени в директорията за включване, вече могат да разширяват класовете с пространство от имена (както е показано по-горе) и вече няма да се зареждат, преди да бъдат използвани.

Сега имате глобални псевдоними, без да се налага да жертвате производителността чрез зареждане на неизползвани класове.

person Dieter Gribnitz    schedule 10.11.2013
comment
Просто се сетих за нещо. Методът, както описах, всъщност може да бъде много полезен, ако трябва да предоставите наследена поддръжка за библиотека. Разширяването на класове с пространство от имена ще позволи на по-старите системи да използват класове, сякаш са нормални класове. За нови проекти това може лесно да се изключи чрез премахване на декларацията на classmap в composer. - person Dieter Gribnitz; 11.11.2013