Как стать автором
Обновить

Комментарии 62

В PHP нельзя импортировать сразу несколько классов из-за особенности работы языка. Если Java может легко узнать какие классы находятся в пакете (namespace), то PHP так не может, там все динамически и заранее какие классы находятся в namespace'e узнать невозможно. Да и namespace в PHP это как макросы, все названия классов раскрываются на этапе трансляции в байткод, а не во время выполнения.
Это так, но в организации кода, а особенно при интеграции с другими наработками всё же серьёзно помогает. Так уж лучше такие namespace чем никаких.
В PHP нельзя импортировать сразу несколько классов из-за особенности работы языка

«из-за особенностей реализации нэймспэйсов» будет вернее. :)
В PHP ClassLoader может грузить классы откуда угодно и как угодно, заранее узнать список классов в одном namespace невозможно. Как это можно было бы реализовать? Вводить волшебный метод classloader'у, который будет возвращать список классов в пакете? Или как?
Если бы не подзаголовок «Недостатки», я бы уже подумал, что автор кроме PHP больше ничего не видел — столько радости от каждой новой возможности. А наверное просто стиль повествования такой.
Ну а в целом выглядит на подобие многих других языков, что и хорошо, на мой взгляд. Единственное — необычно выглядят бэкслеши.
Да, я старался передать авторский стиль повествования. Строго и серьезно можно прочесть на php.net, тут более вольно, и это, кому-то, возможно, поможет создать более полное представление.
Бэкслэши возникли оттого, что точка — конкатенация строк — много срача было по этому поводу в php-dev maillist. Ну и еще одна причина — php dev team не осилили написать парсер, который бы отличал вызов статик метода от неймпейса.

Вообщем, это яркий пример того, как изначальное уродство непродуманного синтаксиса («точка») порождает чудовищных монстров в будущем.
Как, простите, вызов статик методов связан с бекслешами в php?
Раньше был вариант использовать двойное двоеточие вместо обратного слэша. Потом от него отказались.
А по мне — так слеши выглядят элегантнее. Сразу видно — структура.
Не осилили? Суть в том, что у нас может быть как статическая функция в классе User, так и функция в пространстве имён User. Если будет одно и то же название — разработчику сложно будет ориентироваться (если, конечно, вообще возможно написать корректный парсер для данной ситуации, не прибегая к использованию приоритетов или фатальных ошибок на совпадение имён).

Вы точно знаете PHP и историю его создания?
Это «изначальное уродство непродуманного синтаксиса» было продуманно изначально. Да, могли использовать какой-нибудь плюсик для конкатенации строк, но тогда не работал бы подобный финт ушами: 1 + «1». Зачем нужно было автоматическое приведение типов? Автор(ы) хотел добиться поведения, подобного SQL.

И, как по мне, различный синтаксис для различных по сути вещей это хорошо, поскольку разработчику не нужно ни на мгновение задумываться, мол, что же это такое, вызов метода экземпляра или вызов функции, находящейся в пространстве имён?
>Но мне показалось интересным, то как автор преподносит namespace функционал
Это из-за отсылок к игре престолов?
Ну и да, почитайте на досуге, что такое функционал, functionality переводится не так, ровно как и function
Это жаргонизм. Меня, например, он слегка раздражает. Как минимум, потому что его обычно используют менеджеры, которые жутко любят аббревиатуры и сокращения. Раздражает примерно так же, как «прога», «комп», «прогер» и т.п. Сам всегда говорю «функциональность», но других не исправляю.
Идея с Игрой Престолов выглядит красиво и интересно, но имена классов стали не читабельны =(

Мне непонятен один момент, Вы пишите:
Представь, что у нас есть класс из пространства имен Tully\Edmure

Я думал, что «Tully\Edmure» это и есть иерархия неймспейсов (про которую вы чуть выше написали), но далее оказывается, что пространство имён называется «Tully», а имя класса в этом пространстве «Edmure».
Так оно и есть, или я что-то неправильно понял?
Я поправил, не очень правильно перевел — да, namespace — Tully, класс — Edmure.
А как понять, что имена не читабельны? Я не решился в коде использовать русскоязычные имена:
<?php

namespace Старк;

$endmar = new \Талли\Эдмар;

А то ведь кто-то подумает «Почему бы и нет».
Собственно говоря — почему бы и нет :) Интерпретатору абсолютно все равно, кириллица или латиница. Другой вопрос — а зачем? Столкнулся я раз с версткой, где CSS-классы были на русском — уж не знаю, прикол-ли верстальщика это был, или его «уникальный почерк» — но валерьянку пришлось пить литрами.
Я не отрицал, что интерпретатору ровно. Вот зачем — правильный вопрос.
Ну, и почему бы и нет?
Потому что после Васи в код полезет Джон, и сильно удивится переменным $водка, $балалайка, $матрешка.
Т.е. комментариям на русском, а самое главное, документации на продукт на русском он не удивится, а переменные — ужас-ужас? Или предполагается, что Джон по наитию должен в продукте разбираться?
как то друг уехал в вильнюс на пол года в коммандировку писать софт для банка. Там весь код был на литовском транслите. ТОесть неподготовленый человек читает его как результат работы декомпилятора. Зачем так издеваться? Мало ли кто с вашим кодом работать будет. Без документации я то обойдусь если код адекватный, но зачем усложнять чтение самого кода. Да и если опенсорс то не факто что ктото не стянет вашу либу с гитхаба.

К тому же зачем превращать в лапшу код если стандартная библиотека на англыйском и куча библиотек на нем же. Мне даже раскалдку лень будет менять
Если литовцам так удобно, что с того? При чём здесь издевательство и так далее? Документацию к коду и комментарии в коде ваш друг тоже не смог прочитать или там всё на английском?
Писать надо так. чтоб было удобно не кому-то одному, а всем. Для этого стандарты кодирования и придумывают. И если в один прекрасный момен вы станете Гуглом, а у вас во всех проектах вместо $collection->getDataProvider() чтото типа $kolekcija->gautiDuomenuTeikejas(), я вам не завидую
Сломали мне мозг, я пытался это прочитать как транслит с русского.
Да-да, у вас интерфейс на русском без возможности локализации в кодировке CP1251, вся документация, все комментарии, всё на русском и вы, хоп, впезапно стали Гуглом, но если у вас имена функций и переменных на русском, то всё в порядке.
Писать надо так. чтоб было удобно не кому-то одному, а всем.

В рыночных реалиях «всем» трансформируется во «всем работающим над проектом в обозримой перспективе» в лучшем случае. Остальным «всем» в лучшем случае приходится довольствоваться «вот станем гуглом (тут скорее фэйсбук или вконтакте должны быть) — перепишем, а сейчас времени и денег нет».
Не знаком с особенностями российского Software Development: техническая документация обычно по-русски пишется?
Простите, а на каком языке в России её писать-то?
Я просто был под впечатлением, что достаточно большая часть «пост-советского» IT работает на международных проектах (в той или иной степени). Возможно, это не касается вашей отрасли (или вообще мое впечатление ошибочно). Получается, что внутренний рынок вполне себе развит.
Большая часть постсоветского айти клепает сайтики по 1000 р штучка, где никакой Джон даже час не будет смотреть на этот код.
Это довольно печально… Тогда с появлением все более и более «дружелюбных» CMS рынок будет мельчать и выродится в поделки студентов, умещих читать мануалы к ним. Ну и дезайнеры всегда свой хлеб найдут — картинки рисовать.
Тогда-то программисты к Джону и пойдут (судя по моему плодотворному сотруднечеству с украинцами)
Тогда и будут писать по-английски :)
Получается, что внутренний рынок вполне себе развит.

На удивление да. Причём в большей части это касается именно российского рынка, а не вообще пост-советского. Думаю факторов, объясняющих это много: тут и «халявные» нефтедоллары, и сотня миллионов потенциальных пользователей, и исторически сложившаяся моноязычность в том числе среди разработчиков, дизайнеров и т. п.
Как ни странно, я заметил закономерность — если человек пишет в PHP коде комментарии по-русски, то эти комментарии такие же нечитаемые, как и его код.
Какие-то дикие суеверия, хоссподи.
Это просто традиция, священная корова — писать названия функций и переменных на английском в проекте, где:

a) нет ни одного разработчика, который не знал бы русский, зато обилите тех, кто не знает английский
б) у которого вся документация, все описания алгоритмов, все блок-схемы и выписанные сущности на русском
в) у которого только русский интерфейс и даже без возможности локализации
г) у которого ещё и кодировка CP1251
д) у которого исключительно внутренний рынок

но названия функций и переменных на английском. А то, вдруг, Джон прийдёт, ему же неудобно будет!
А вы пишете на PHP? Если да, то используете ли вы русский язык в своем коде, если доподлинно знаете, что Джон в него нос не сунет?
Если для себя — иногда пишу. Если не для себя — нет. Все вокруг слишком уверены, что Джон нос сунет.
Ок, спасибо, я понял вашу позицию.

Для себя я решил, что стоит придерживаться некоего принятого стиля написания кода, близкого к стандартам, чтобы облегчить себе, в первую очередь, участь, а также не шокировать окружающих.
Писать имена функций и переменных на смешном корявом английском — это стандарт?
Вы подумали я троллю? Защитный рефлекс, срабатывающий, когда трогают Священную Корову Английских Имён?
В целом, плохо, если человек-программист ещё и человек-корявый-английский. Большинство адекватной и свежей документации пишется на английском, большинство решений проблем описано на английском. Я вообще мало доверяю программистам, не знающим английский (при этом разговорный не обязателен).

При программировании на PHP мне, по сути, достаточно двух ресурсов:
1. php.net, на котором все обсуждения специфики работы функций/пакетов/классов на английском
2. stackoverflow.com вообще всё на английском

И мне не совсем (совсем не) понятно, с каким ресурсами работают программисты, не знающие языка.
Вы знаете, умения нормально читать на английском и плохо на нём писать нормально сочетаются.

Кстати, я, вот, начинал программировать не зная английского языка и даже без интернета, ничего, выжил как-то. Своей головой до всего доходил.
Одна из причин, кроме Джона — английский как правило короче, а разработчики люди ленивые :) Плюс для некоторых общепринятых сущностей типа паттернов не существует адекватных однозначных переводов на русский.
Я заметил, что те, кто пишут комментарии/документацию на русском, кодят и документируют примерно так:
    /**
     * Функция получает информацию о валютном аккаунте этого кошелька.
     * Данные затем сохраняются в поле $accountData.
     * Операция также считается успешной, если данные найдены в поле
     * Пустой $currencyName означает запрос на все аккаунты кошелька
     * $accountData, хоть запроса при этом и не выполняется.
     * @param string $currencyName
     * @return boolean $success
     */
    public function getAccountData($currencyName = "")

    /**
     * Функция готовит данные для отображения кошелька. Возвращается айди и вся
     * информация по аккаунтам. Можно передать массив с нужными типами
     * аккаунтов. Если этого не сделано, запрашиваются данные по всем.
     */
    public function getDisplayData(...)


Если у таких людей отобрать русский язык, они автоматически постепенно учатся кодить так, чтобы их код говорил за себя. Хоть и не всегда.
Глобальное пространство имен

Если уж приводить примеры по пространствам имён, правильнее было бы приводить пример (моё имхо):

<?php

// app/routes.php

namespace
{
    class Eddard
    {
    }
}

Может это всем очевидно, но мне по чистой случайности удалось узнать именно о таком указании глобального пространства. Буду рад, если кому не придётся набивать шишки, попытками написать "namespace \;", "namespace global;" и проч.
А для чего такое может пригодиться?
Например когда вставляешь код из разных файлов в один для постинга в пастбине =) В общем специфические задачи, когда требуется уйти от стандарта — один класс в одном файле.
Хотел бы уточнить, что мы можем брать часть пространства имён и без присвоения псевдонима:
use Dayle\Blog;
$post = new Blog\Content\Post;
$page = new Blog\Content\Page;
$tag  = new Blog\Tag;

И если нет конфликтов, то я предпочитаю именно этот вариант, просто потому что он проще.
Не, я может быть не в тему, но к чему тут тег winter is coming?
Девиз дома Старков, его глава, которого в сериале играет Шон Бин, представлен на КДПВ. По такому тегу, предположительно, можно найти статьи, связанные с «Песней льда и пламени» на хабре. Just for lulz, в общем.
В каком сериале? :) Немного раздражает когда авторы и/или переводчики предполагают знание не только английского языка, но и какого-то культурного контекста.
Сериал — «Игра престолов» («Game of thrones»), изначально по циклу «Песнь льда и пламени» (рекомендую).
Я ни одной серии этого сериала не посмотрел, но уже после пары неймспейсов понял, «об чём речь». Хотя сначала я было обрадовался, что кто-то использует имена мифических исландских (например) персонажей. Ан нет, всё то же, что и вчера, и позавчера.
Такой тонкий юмор автора (переводчика?) наверное: у покемонов по прозвищу «Слоупок» зима тоже только начинается. Ну и пространства имен в PHP тоже, того этого… не первый год.
Пойти написать пост про то, как правильно кодировать и проверять пароли с помощью библиотеки crypt, что ли.
Вот это предложение слегка нечитабельно: «Представь, что у нас есть класс из другого пространства имен под, названный Tully\Edmure.»

А вообще, спасибо за статью.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории