Пространства имен в 5.3 - доступны снапшоты

Major

Новичок
fixxxer

ты, по моему,не понял сути проблемы. Причем тут глобальные переменные?
 

fixxxer

К.О.
Партнер клуба
нет глобальных переменных - нет проблемы, что я не понял то?
 

Major

Новичок
fixxxer

А где здесь глобальные переменные?

<?
namespace test;

$var = 1; // Она будет видна без обращения через test:: и не будет доступна через test::$var

?>
Тоесть, да, сейчас они глобальные. Но по идеологии неймспейсов $var не будет глобальным, а будет упрятан в пространство test. И обращение должно быть через test:: $var. Эта переменная глобальная, относительно пространства test, но за пределами, она не будет уже никак глобальной. Точнее была бы, так как сейчас этого как раз -таки нет.

Не добавили пока что поддержку переменных в неймспейсах в доступных снапшотах.
 

phprus

Moderator
Команда форума
fixxxer
с $GLOBALS что делать?
А ничего не надо делать. Переменная находящая с каком-либо пространстве имен не является глобальной по определению(так как она принадлежит не к глобальной области видимости а к вполне определенному пространству имен), а все переменные определенные вне какого-либо пространства имен являются глобальными и должны попасть в массив $GLOBALS.
 

Major

Новичок
Вообще же есть глобальное пространство имен. Я считаю что $GLOBALS - это вообще анахронизм. Сейчас уже можно обращаться к функциям, находящихся в глобальном пространстве через пустой NS:

PHP:
<? // inc.php
 function foo(){ echo 'GLOBAL'; };
?>
<? // NS.php
namespace test;

function foo(){ echo 'LOCAL'; };

foo(); // LOCAL
::foo(); // GLOBAL

?>
<?
include 'inc.php';
include 'NS.php';

foo(); //GLOBAL
test::foo(); //LOCAL

?>
Так почему бы не упразднить $GLOBALS и не использовать вместо него глобальный неймспейс для переменных?

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

phprus

Moderator
Команда форума
Major
Если сразу убрать $GLOBALS, то очень сильно нарушится обратная совместимость версий, что не есть хороше в данном случае, а вот если запихнуть в этот массив все из глобального пространства имен, то никакого противоречия не будет и таких больших проблем с обратной совместимостью тоже не будет.

P.S> Интересно, а что об этом думают те, кто более серьезно занимается разработкой самого PHP?
 

tf

крылья рулят
PHP:
<?
#start include 'inc.php';
function foo(){ echo 'GLOBAL'; };
#end include 'inc.php'; 

#start include 'NS.php';
namespace test;

function foo(){ echo 'LOCAL'; };

foo(); // LOCAL
::foo(); // GLOBAL
#end include 'NS.php';


foo(); //GLOBAL
test::foo(); //LOCAL

?>
у меня вопрос - точно в последнем у меня будет сначало //GLOBAL а потом //LOCAL или всеже наоборот?
 

phprus

Moderator
Команда форума
tf
у меня вопрос - точно в последнем у меня будет сначало //GLOBAL а потом //LOCAL или всеже наоборот?
По идее должно быть сначало //GLOBAL а потом //LOCAL, НО так как у меня сейчас нету установленного php 5.3, то проверить я это не могу.
 

tf

крылья рулят
phprus, по идеи конца namespace test я найти не могу нигде по ссылкам и логически у меня будет // LOCAL и // LOCAL
такая вот проблемка вырисовывается
 

phprus

Moderator
Команда форума
tf
по идеи конца namespace test я найти не могу
ИМХО наиболее логичным было-бы завершать пространство имен концом файла, по этому я и выдвинул такое предположение.

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

Major

Новичок
Пространство имен определяется только в отдельном файле, перед директивой namespace нельзя ничего писать. Конец пространства определяется концом файла. Тоесть, отдельный файл, с директивой namespace - это и есть контейнер для определенного NS.
 

Pigmeich

Новичок
Wicked
+1

Major
Интерфейсы нужны для приведение к ним производных объектов.

А зачем нужно наследование я уже писал - для реюза кода и generic методов вроде фабрики.
 

fixxxer

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

tf

крылья рулят
fixxxer, у меня автокомплит используемых файлов
было бы неплохо если бы я мог сказать end namespace test;
 

Major

Новичок
tf

а что я могу поделать? =) Я констатирую факт. Я, к сожалению, не могу влиять на разработку NS.
 

fixxxer

К.О.
Партнер клуба
авто что не понял

-~{}~ 10.11.07 21:20:

точнее не понял зачем :)
 

phprus

Moderator
Команда форума
fixxxer
лично меня устраивает все, как есть, я не использую глобальные переменные. ни один современный фреймворк их тоже не использует. а если ваши скрипты выглядят как простыня, то вам неймспейсы мало помогут.
Переменная локализованная в пространстве имен не является глобальной. Да и обоснованное использование для них найти можно (пример стандартные потоки ввода/вывода в С++ std::cin; std::cout) В php, так можно обращаться например к данным из конфигурационных файлов, так как эти структуры должны создаваться строго один раз и меняться по ходу выполнения не должны.

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