Pull to refresh

Comments 46

>… и столкнулся с проблемой отсутствия нормальной документации. Все, что удалось найти датируется примерно 2009 годом, а на дворе почти 2012

ru2.php.net/namespaceчем не угодил?
как видно из даты обновления официальной документации это 11.11.11, а статья писалась примерно 10.11.11, долго была на модерации.
11.11.11 была выложена русская документация. Причем namespace еще не переведены.
Англоязычная документация по неймспейсам доступна с выпуска php 5.3…
не буду с вами спорить, но на тот момент когда я искал информацию, первым делом я смотрел в оф доки, там информация была устаревшей.
Вы не спорите… но спорите, это как? =)
Вот ревизия файла 2008 года, когда была альфа-версия php 5.3.
Эта документация была опубликована… но вы не спорите, не спорите…
Пардон, я имею ввиду, что ничего там устаревшего нет, т.к. функционал не менялся.
Непонятно зачем вы везде пишете use A as A, оно и так будет работать. Use имеет смысл только с составными неймспейсами (use A\B\C as someNS)

> Все, что удалось найти датируется примерно 2009 годом

Видимо вы плохо искали. Документация на официальном сайте достаточно актуальна. ru.php.net/namespace — Last updated: Fri, 11 Nov 2011
А, наверно парсер съел, должно быть так: use A\A as A; — поправьте
use A\A as A

эквивалентно
use A\A


Лучше
use ParentNS\ChildNS as SomeNameNS
Зачем писать то, что есть в документации? Если б тут хотя бы какой-то финт ушами был показан. 5.3 достаточно давно вышел, чтобы изучить namespace в php.
Уже 5.4 скоро зарелизится, теперь про его финты ушами надо думать, а про 5.3 по-моему уже большинство финтов известны :)
Я тоже так думаю. Но человеку минусов не ставил. Всё-таки старался, писал.
A\subA\::say();

Вы уверены насчет последнего слеша?=)

Насчет не нашли материалов — официальная документация, хоть и на английском (пока что) хорошо освещает вопрос namespace. (мое субъективноличное мнение)

use Autoloader as Autoloader;
use A as A;
use B as B;

Зачем здесь использовать алиасы?

И насчет автозагрузки классов: тут на вкус и цвет. Но просто для общего образования можно взглянуть на " PHP Standards Recommendation #0" или PSR-0
Это набор рекомендаций.

ошибку поправил.
По приведенной вами ссылке отсутствует класс умеющий рекурсивно искать необходимые файлы
По приведенной мной ссылке находится рекомендации по организации файловой системы для автолоада и трансляции имен классов в нее.
Никакого готового класса там и не должно было быть =)
Между прочим, по ссылке дело говорится, которое позволяет классы из зенда и симфони классы дёргать.
А что помешает приведенному выше классу «дернуть» класс из зенда или симфони? укажите ему нужную корневую паку и все.
До версии 5.3 в php существовало всего два пространства — глобальное(в котором выполнялся ваш основной код) и локальное(в котором определялись переменные функций).

Мне кажется, вы путаете пространства имен и области видимости.
Расскажу, пожалуй, про константы в NS.
Если используете константу в пространстве имён то интерпретатор с начало ищет в текущем пространстве имён, если не находит то берёт из корневого пространства имён (на на самом деле там просто ссылка на коренную константу по умолчанию, никакого двойного поиска там нет). Это свойство я использую для частичного дебага (не всего кода, а из нужных пространств имён). Так, например, в коде у меня расставлены

DEBUG && Log::debug("some debug data");


благодаря этому, определяя DEBUG в нужных мне пространствах имён (дешево и сердито), я могу получить дебаг-информацию из нужных NS.
Насчет define(). там нужно указывать полное имя константы с пространством имён:
define('MyNS\DEBUG', 1);


Аналогично работают и функции, но их свойство я не особо использую.
Америку не открыли… Все это я читал в книге Мэтта Зандстры
Почти 2012 год на дворе и php 5.3 а Вы позволяете себе такое, как будто из 4-ки:
Сорри, рано.
     function sayName($name)
         ...
     static function sayOther()
         ...

Где public/protected/private?
согласен, обязательно исправлюсь, хотя даже С++ не настаивает на указании модификатора доступа public, все функции и так подразумеваются как public. В protected нет необходимости так как отсутсвует наследование.
Всё дело в том, что нестатический метод, объявленный без модификатора может быть выхван как статически, так и в контексте объекта. Это нерационально и удручает если сделано так намеренно и один метод вызывается как class::method() и $class->method().
Есть мнение, что в средних и больших проектах, которые будут жить и поддерживаться длительное время хорошей практикой считается политика «скрывать всё по-умолчанию». Т.е. по умолчанию — всё private (в очень больших — ещё и final — чтобы меньше «думать»). Если есть какие-то явные основания то protected или public. В языках, где namespace не только пространство имён но и один из инструментов для инкапсуляции — и классы по умолчанию хорошо бы делать package-private (доступные только классам из того же namespace)
package-private — в PHP можно разве? Сцылку почитать неплохо бы.

А вообще, зависит не от величины проекта использование private и других ключевых слов. Очень помогает рефакторить потом, когда проект меняется.
нет — в php пока нельзя. я говорил о других языках.

По поводу вашего утверждения: в «маленьком» проекте, где каждый из нескольких участников может полностью владеть кодом это не так важно как в большом проекте, где каждый занимается своей частью и дальше контрактов компонентов не может видеть. А т.к. поддержание любого порядка требует дополнительных ресурсов — то в маленьком проекте от некоторых практик (например нестрого соблюдать правило Деметры) можно «контролируемо» отказаться. Это может не иметь фатальных последствий, при этом немного сэкономить времени в ситуации когда это очень важно.
Ну если говорить конкретно про private/protected/public, то это в любом коде должно быть, независимо от размеров проекта. Это стиль кодирования, а не поддержание порядка и я ни за что от этого не откажусь.
ошибаетесь, товарищ! В C++ без указания доступа, всё пихается в private. А вот struct{} это то, о чём вы говорите; просто struct это алиас для class:
class 
{
public: 
//your code here
}
а ведь действительно, что-то меня переклинило…
когда же как в java будут введены пакетные области видимости? очень нехватает.
благодарю всех за комментарии и критику. В будущих статьях постараюсь учесть все, что было сказано выше. Ну а относительно того, что все это есть в документации, так много статей, которые являются просто ее переводом.
интересно как обходятся глобальные переменные типа $_SERVER в cli mode
Вопрос: допустим, у меня есть 10 файлов с различными классами и все они в одном неймспейсе (движок моего приложения):
a.php: namespace myns; class A {...}
b.php: namespace myns; class A {...}

h.php: namespace myns; class H {...}

и наконец у меня есть само приложение (index.php) в котором я хочу использовать все классы движка. Мне НЕ хочется везде писать имя неймспейса myns: new myns\A(); new myns\B(); myns\C::foo();…

Я могу в начале index.php написать 10 инструкций use myns\A, myns\B, myns\C,… и тогда использовать имена классов не добавляя к ним неймспейс — это понятно.

А могу ли я как-то загрузить ВСЕ классы сразу? Что-то вроде use myns\* существует? (звёздочку пробовал — syntax error).

В документации есть намёки на это. Такой пример:
use My\Full\NSname;
(http://www.php.net/manual/en/language.namespaces.importing.php)
«NSname» как бы намекает, что они импортировали не конкретный класс а целиком какой-то неймспейс NSName, однако у меня это никак не получается!
Автору спасибо за старательное изложение
> Рекомендуется объявлять каждое пространство имен в отдельном файле. Хотя можно и в одном, но это строго не рекомендуется!

Что-то я не понял эти взаимоисключающие параграфы.
Что тут не понятно/где здесь ВП?
Если не хочешь весёлого дебага — 1 файл, 1 неймспейс.
Если хочешь — сериализуй и пихай всё в один большой монолит.
Sign up to leave a comment.

Articles