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

  • Автор темы Автор темы Develar
  • Дата начала Дата начала
fixxxer

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

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

<?
namespace test;

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

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

Не добавили пока что поддержку переменных в неймспейсах в доступных снапшотах.
 
fixxxer
с $GLOBALS что делать?
А ничего не надо делать. Переменная находящая с каком-либо пространстве имен не является глобальной по определению(так как она принадлежит не к глобальной области видимости а к вполне определенному пространству имен), а все переменные определенные вне какого-либо пространства имен являются глобальными и должны попасть в массив $GLOBALS.
 
Вообще же есть глобальное пространство имен. Я считаю что $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. Это мое скромное имхо.
 
Major
Если сразу убрать $GLOBALS, то очень сильно нарушится обратная совместимость версий, что не есть хороше в данном случае, а вот если запихнуть в этот массив все из глобального пространства имен, то никакого противоречия не будет и таких больших проблем с обратной совместимостью тоже не будет.

P.S> Интересно, а что об этом думают те, кто более серьезно занимается разработкой самого PHP?
 
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 или всеже наоборот?
 
tf
у меня вопрос - точно в последнем у меня будет сначало //GLOBAL а потом //LOCAL или всеже наоборот?
По идее должно быть сначало //GLOBAL а потом //LOCAL, НО так как у меня сейчас нету установленного php 5.3, то проверить я это не могу.
 
phprus, по идеи конца namespace test я найти не могу нигде по ссылкам и логически у меня будет // LOCAL и // LOCAL
такая вот проблемка вырисовывается
 
tf
по идеи конца namespace test я найти не могу
ИМХО наиболее логичным было-бы завершать пространство имен концом файла, по этому я и выдвинул такое предположение.

А так то да было бы не плохо если бы была команда указывающая на то, что необходимо завершить описание пространства имен.
 
Пространство имен определяется только в отдельном файле, перед директивой namespace нельзя ничего писать. Конец пространства определяется концом файла. Тоесть, отдельный файл, с директивой namespace - это и есть контейнер для определенного NS.
 
Wicked
+1

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

А зачем нужно наследование я уже писал - для реюза кода и generic методов вроде фабрики.
 
во напридумывали:)
лично меня устраивает все, как есть, я не использую глобальные переменные. ни один современный фреймворк их тоже не использует. а если ваши скрипты выглядят как простыня, то вам неймспейсы мало помогут.
смысл неймспейсов - элегантная замена префиксов в именах классов, и не более того.
 
fixxxer, у меня автокомплит используемых файлов
было бы неплохо если бы я мог сказать end namespace test;
 
tf

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

-~{}~ 10.11.07 21:20:

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

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