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

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

Бред какой-то, писать препроцессор с мануалом на 2 страницы ради одной плюшки.
function array_get($array, $key) {
  return $array[$key];
}
array_get(array('a' => 1, 'b' => 2), 'a')

Так не катит, что-ли?
Соглашусь, но работа это, скорее, ради концепции, а не ради эффективности :)
А вот так не судьба?

$arr = array( 'a'=>'aaa', 'b', 'c' );

class t {

protected $fields;

function __construct( $array ) { $this->fields = $array; return $this; }

function __get( $key ) { return isset( $this->fields[ $key ] ) ? $this->fields[ $key ] : false; }

}

function p( $fields ) { return new t( $fields ); }

var_export( p( $arr )->a );


Тоже безумный код, но все лучше, чем препарсер для парсера городить. Возвращайте потомка stdClass, а не вектора.
какое странное рассуждение

бред какой-то, писать целых 20 классов вместо mysql_connect() и mysql_select_db() ;)

у препроцессора могут появиться новые фичи, ничего плохого он не делает и тормозить не заставляет, почему бы и не сделать?

а документация там проще, чем у хабрахабра
у препроцессора могут появиться новые фичи
Могут, или появятся? В данном топике говориться лишь об одной, реализуемой другими средствами намного проще.
Какими же? Расскажите, может я туплю. Или вы предлагаете использовать костыли по всей программе?

Я сейчас думаю о реализации свойств с сеттерами и геттерами. Это просто сделать без токенайзера наследованием от класса с __get и __set, но PHP не поддерживает множественное наследование, что делает такое решение ограниченным.
По крайней мере, можно было бы создавать автоматические методы вида getName() и т.п.

Тем более, насколько я помню, запаршенный скрипт, который создает нормальные сеттеры и геттеры свойствам, будет быстрее скрипта с «магическими» функциями. Даже если я и ошибаюсь, и PHP творит «магию» быстро, медленнее мои геттеры-сеттыры точно не будут, зато у них прибавит в универсальности.

И я не понимаю, почему вы ругаетесь :) Чего плохого в моем решении?
Смотрю на название блога — «Ненормальное программирование».

Да… статья на 100% соответствует тематике :)
ну вот :( я думал, я так, пошутил

не вижу ничего ненормального в желании бесплатно улучшить синтаксис неплохого языка :)
Есть некоторая разница: улучшение синтаксиса языка != написание надстроек.
Возможно решение и неплохое, но от прочтении статьи осталось неприятное ощущение. ИМХО 90% статьи — вот какой я, не минусуйте меня.
Плюс добила фраза(или я юмора не понял):
Делал я это, разумеется, от скуки и никакой поддержки или обоснования необходимости существования не обещаю.
Если сам автор не видит необходимости существования то к чему столько воды.
к сожалению php это over 90% надстроек и велосипедов. И да, я на нем пишу.
Не думаю, что есть такая уж необходимость в таком улучшении. В конце концов, если функция возвращает больше данных, чем надо Вам — может стоит задуматься о добавлении новой или изменении используемой?
Ну, скажем, у Zend_Framework многие функции возвращают массивы, особенно те, что с бд работают. Да и нативные php-функции тоже не всегда ограничиваются одним значениям. Не писать же обертки.

В конце концов, такая функциональность очевидна и удобна. Она есть где угодно, кроме PHP :)
>> Не писать же обертки.
А Вы чем тогда занимаетесь? Одна большая глобальная обертка :)

Возможно, если бы я с ZF работал, такая необходимость бы возникала… В конце концов, стремление к «не стоит прогибаться под изменчивый мир» само по себе похвально ;)
Эта одна большая прозрачная обертка под кучу применений и на все времена :)
Да ну нафиг… Прозрачно — это когда пользователь не начинает ковыряться в мануалах и исходниках, увидев непонятную запись superFunction($foo, $bar)[2]. Особенно, если после подключения начнутся глюки, связанные с новыми внезапно обнаружившимися «фичами», которые автор еще не обнаруживал.

Куча применений — сомневаюсь. Повторюсь, часто ли приходится запрашивать целый массив значений, чтобы потом использовать только одно из них? Может, что-то не так спроектировано?
У вас пользователи читают код? ;))

Чтобы разрешить эту конструкцию в вашем приложении, сколько бы народу над ним не работало, надо ее установить, а потом сказать: «Чуваки! Конструкция новая!». Всё. Им не надо будет думать, как она работает.

Если вы хотите использовать ее в своем собственном фреймворке, который должны получать сторонние, независимые от вас программисты, тогда придется в справке к нему написать, что, мол, не забудьте про папочку для моего кеша. Или «компилировать» его, т.е. распаршивать специально перед передачей в нативный php-синтаксис. Во обоих случаях ничего сложного, а во втором это еще и никак не коснется конечных юзеров. Код просто превратится в тот, который предлагает homm.

И да, такое бывает. Проектирую в таких случаях не я, а сторонние разработчики, из-за любви к массивам которых аккуратная цепочка методов превращается в три, а то и больше строк
Для избавления от «трех и больше строк» вполне подойдет arr_get(), предложенная в первом комментарии.

И в третий (последний) раз повторюсь — почему Вам из всего массива может понадобиться только одно значение? Неужели все остальное там настолько неинтересно?
Хорошо, подойдет. Итак, чем плохо мое решение, которое просто ставит везде arr_get() сама, позволяя мне не думать об этом, а писать куда более читабельный код:

stat('uploads')['blksize']

Понятия не имею, зачем бы мне понадобилось узнавать именно это, но по другому это можно сделать только через левую ногу

arr_get(stat('uploads'), 'blksize'), ага. Ха-ха.

Можно я не буду повторять свой ответ, когда вы зададите вопрос в четвертый раз? Потому что мне нужно конкретное значение. Одно. Так уж вышло.
напишите функцию, которая будет возвращать нужные данные в нужном объёме. а не всё подряд.
а IDE'шки будут высвечивать ошибки на каждой строке с применением такого кодинга
Да, это неприятно :(

По-моему, какие-то из них можно попросить не показывать отдельные типы ошибок
НЛО прилетело и опубликовало эту надпись здесь
подобные желания — от кривого проектирования.
функция не должна возвращать больше данных, чем требуется клиентскому коду.
myserg
простите, промахнулся
>Введи ещё в PHP поддержку функционального программирования…
А лямбда функции, это разве не из этой области =)?
НЛО прилетело и опубликовало эту надпись здесь
Такой ответ значит, что Вы просто не понимаете, что значит такая конструкция. А она, между прочим, логична и не может вызывать проблем.
подобные желания — от кривого проектирования.
функция не должна возвращать больше данных, чем требуется клиентскому коду.
Точно. Кругом кривые руки, иначе 640 килобайт памяти…
не надо мои слова перевирать.

ps: минусаторы, ну чо, давайте подискутируем на тему godlike классов/методов/функций, а? или слабо? :-)
Не надо писать холиварные посты, никто и минусовать не будет.
это не холиварные посты.
это констатация того факта, что подобные статьи рождаются от написания godlike-кода.

если вы считаете что это нормально — то лично с вами я спорить не буду, ваша точка зрения мне понятна.
Констатирую факт — вы уныло троллите.
так и запишем:
в 2009г проектирование костылей — хорошо. а указывание на то, что это принципиально неверный ход и, мягко говоря, пагубная практика — троллинг.
спасибо.
Уважаемый троль, я не собираюсь приводить аргументы того, что вы неправы. Если вы ДЕЙСТВИТЕЛЬНО хотите кому-то что-то сообщить, то это вам придется изложить аргументацию.
С уважением
Капитан Очевидность
habrahabr.ru/blogs/crazydev/73358/#comment_2109282
и давайте, как-нибудь, обращаться, чуть-чуть повежливее. я же вас не называю гоблином или гремлином?
А я называю и буду до тех пор, пока вы не изволите обосновать свою критику. Критика без аргументации — обычный троллинг.
И нет, «кривое проектирование» — недостаточная аргументация.
Вы принципиально отвергаете вторую строку коммента, на который я сослался?
Что вы. Просто вы ее не обосновали. С чего вы решили что функция возвращает больше данных?
Навскидку
function returnCoordinates() { return array($x, $y) }

А если немного подумать можно найти десятки примеров, когда возврат массива был бы удобным.
Зачем возвращать массив с 2 переменными, если вы не используете одну из них?
Потому что в одном случае может понадобиться одна, а в другом вторая. Вместо написания дополнительной логики по возврату маркера какая именно вовщращена более выгодно и читаемо вернуть массив. Это значительно упростит восприятие кода. Для этого синтаксис и улучшают.

Иначе по вашему такой тип как объекты вообще не нужен — уж там то сколько «лишних» полей.
т.е. вместо того, чтобы написать функции, которые возвращают разные данные, вы всё валите в кучу, чтобы потом с честью разобрать на клиентской стороне…

не удивляйтесь потом, что ваши интерфейсы вот так выглядят:

не видел… спасибо)
подытоживая мысль, я не против [] вообще, я против решение архитектурных проблем с помощью этой конструкции.
эта проблема, например, отлично решена в pathinfo()

ещё больше уточняя: проблемы нужно решать на локальном уровне, в каждом частном случае используя более подходящий метод: разделение методов, введение аргументов, а не выдумывая «волшебный костыль»-панацею.
Да кто сказал что она призвана решать архитектурные проблемы? Вы опять вместо того чтобы спокойно дискутировать начинаете троллить. Что вы мне эту картинку-боян запостили. Или думаете тут кто-то его не видел? Или ваши аргументы от него станут более весомыми? Или думаете я срочно признаю что вы правы?
В общем как я и говорил изначально дискутировать с вами — пустая трата времени. И не потому что вы что-то не так говорите, аргументы то увас верные, просто вы постоянно пытаетесь насрать собеседнику на голову.
при чём тут насрать? я просто призвал не делать костыли на костыли.

а картинка тут очень, имхо, уместна. она явно демонстрирует ваше:

«function returnCoordinates() { return array($x, $y) }

А если немного подумать можно найти десятки примеров, когда возврат массива был бы удобным. „

когда вместо того, чтобы написать маленькую функцию, а потом ещё одну — вы предлагаете на каждый чих в неё добавлять по элементу массива (а что, от этого ещё никто не умирал). а потом в итоге API превращается в 3 метода, которые в различных комбинациях аргументов возвращают различные комбинации результатов.

собственно я свою мысль выразил. вы тоже. предлагаю закончить спор. тем более, что автор темы здесь даже и не попытался высказаться.
Картинка демонстрирует только ваш уровень общения. И он не соответствует нормальному.
или например апи превращается в
return_x()
return_y()

вместо того чтобы сделать
my ($x, $y) = get_coordinates($object);

или если возвращать хеш — get_coordinates($object)->{x}
Заодно стоит написать разработчикам PHP что все глобальные массивы пользователь zerkms считает унылым говном и «кривым проектированием».
суперглобальные — нет.
глобальные — да.
А почему нет? Ведь это так ужасно по-вашему. «Кривое проектирование». «Лишние данные».
с каких пор средства доступа к переменным окружения стали лишними данными?
Задайте тот же вопрос относительно результатов пользовательских функций и получите ответ на тему спора.

Можете заодно поразмыслить почему функциям типа
preg_match* приходится иметь дополнительный изменяемый параметр для ВОЗВРАТА собственно найденных подстрок.
НЛО прилетело и опубликовало эту надпись здесь
потому, что это удобно

docs.python.org/library/re.html
java.sun.com/docs/books/tutorial/essential/regex/matcher.html
oreilly.com/windows/archive/csharp-regular-expressions.html


не понял. чем возвращать результат в двух(!) местах(bool + array) удобнее чем возвращать один результат (Match, Matcher, MatchObject)?
кстати поаплодируем, как вы клёво перевели тему на глобальные переменные.
> Иначе по вашему такой тип как объекты вообще не нужен — уж там то сколько «лишних» полей.

Не нужно путать теплое с мягким, в случае объекта возвращается ссылка, а не создается его копия.
В PHP4 создавалась копия, и что теперь?
Ну во-первых, теперь PHP 5.x :)
Во-вторых, funciton &GetSomeObject();
Ну да. А еще можно на java писать там вообще все класно
Где же троллинг? zakerms четко сформулировал претензию. Вы ее опровергаете, но при этом не пишете ничего осмысленного.

$filename = pathinfo($path)[1]; // ← так писать действительно плохо (опустим тот момент, что этот код не работает)
$filename = basename($path); // ← лучше писать так
Ой ну я вас прошу. Вы что группами ходите?
В пяти Ваших постах этой ветви нет ни одного аргумента, зато есть искрометная фраза «я не собираюсь приводить аргументы того, что вы неправы» :) Кто тут троллит?
Вот если бы вы не оспаривали тот факт, что чайник есть (как откровенный бред), вопросов бы не было.

Получается, спорить, что его нет — Вы готовы, а доказывать, что его нет — не собираетесь. Спор ради спора и есть троллинг.

Впрочем, выше Вы все же начали писать хоть что-то, относящееся к теме, продолжу чтение там.
Очень толсто. Тренируйтесь на ЛОР
НЛО прилетело и опубликовало эту надпись здесь
Что ж такого антипаттернового в этом, уважаемый?
НЛО прилетело и опубликовало эту надпись здесь
Интересно, почему?
Посмотрите в сторону ORM'ов, там записи БД возвращаются как? в массиве. Это лишь один из примеров.
За использование массивов вместо объектов убивать надо. Без дополнения кода в IDE писать устаешь безумно.
Посмотрите в сторону ORM'ов, там записи БД возвращаются как? в массиве.
Счас. В объектах.
А в чем, простите, принципиальное отличие? Кроме более удобной записи.
В отсутствии проблемы, решаемой в этом топике.
ну да, массив, ячейки которого — обьекты
Я конечно не знаю, что у вас за ОРМ, но когда вам нужно выбрать группу, то то, что там вернется массив вам никак не помешает. Если объект, то он и вернется без всяких массивов. А в хороших орм вместо массива еще возвращается итератор, который объект и массив.
Propel
Forth'еры с удовольствием поржали бы над вашим утверждением.
НЛО прилетело и опубликовало эту надпись здесь
С каких это пор ООП стал последней инстанцией в методиках абстрагирования и обощения?

ООП в Форте реализуется тривиально. Равно как и любая другая парадигма, вплоть до логического программирования.
НЛО прилетело и опубликовало эту надпись здесь
Не буду даже пытаться доказать обратное, равно как и пытаться объяснить, в каком месте Вы ошиблись ;-)

НЛО прилетело и опубликовало эту надпись здесь
А не проще:

$array = foo ( $param1, $param2, 2 ) #2 — номер элемента массива и непонятно для чего такие извращения?
действительно непонятно для чего такие извращения указывать номер элемента возвращаемого массива
а если я хочу вернуть весь массив? а если меня интересуют элементы 2 и 3?

не нужно мучать язык, он просто не приспособлен для этого.
решаемая автором задача бесполезная.

+2 у вашего коммента показывает что уровень быдлокодеров в этом треде зашкаливает
Нет хуже «быдлокодера», который себя считает не «быдлокодером».

А вообще вернула функция весь массив, далее разбераете так как вам необходимо:

$array = foo ( $param1, $param2 );

$array = $array #… хоть как
нормальный логичный API, класс.

а в другой функции не реализуют этот опциональный аргумент — и в итоге имеем что имеем в пхп целиком.

половина функций через подчеркивания, половина слитно, часть в виде verb+noun часть noun+verb, и как результат для использования каждой конкретной функции нужно лезть в документацию или исходный код.

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

Вызываете без третьего аргумента.
а если меня интересуют элементы 2 и 3?

Вызываете без третьего аргумента, а потом делаете array_s(p)lice, ну или что душе угодно.
НЛО прилетело и опубликовало эту надпись здесь
зачем возвращать массивы? возвращайте stdClass и можно будет делать так
superFunction($foo, $bar)->element2
Изврат же, сударь, если уж на то пошло, добавьте в php нормальный синтаксис для масивов ($array = [k1: 'v1', k2: 'v2']) и анонимных функций ($f = { |x| return x; };), возможность делать методы-обертки для нативных типов (типа «string».length() ) и вообще, сделайте мне Руби на php :)

А кеширование пропарсеныых файлов — это дублирование работы опкешера.

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

собственно, вам все выше уже сказали: PHP — не Python и не Ruby; за (относительную) скорость и простоту работы приходится расплачиваться уродливым синтаксисом. ну а вы делаете наоборот — ради малюсенького улучшения синтаксиса приносите в жертву и скорость (скармливать парсеру, причем на PHP, свой код при каждом изменении — спасибо большое), и предсказуемость. не надо этого — чем переделывать PHP, выучите лучше нормальный язык.
Ахаха, видно что стараетесь изо всех сил сделать годный наброс, жаль только что скатываетесь в УГ.
а чем вам синтаксис php плох-то?
кому-то и C++ хороший язык, знаете ли. «тебе и горький хрен — малина // а мне и бланманже — полынь».
спасибо, поржал (Ц)

парсер для парсера, написанный на парсере — как я понимаю, подобная конструкция не кажется вам чрезмерной
странно что все циклятся на этом. По-моему представленная статья больше proof of concept и прикольный эксперимент. Конечно, в реальной разработке применять его было бы просто самоубийственно.
ещё пара десятков тыщ мильонов велосипедов, когда вы пройдёте стадии неприятия, отторжения, цинизма, вы, скорее всего, начнёте воспринимать велосипедистов с ироничным удивлением: «ну надо же! велосипеды всё ещё изобретают!»

нет здесь ни эксперимента, ни прикола.
каждый пхпшник за свою карьеру должен написать дейтинг, изобрести парсер, и гордиться самописной цмской (Ц)
Не знаю, не знаю…

Для чужого когда имхо лучше написать обертки в виде наследующих классов. Для своего — лучше уж вернуть объект вместо массива.

Но вообще гонять данные туда-сюда не хорошо — где-то в архитектуре нелады.
немного холивора:)

Иногда хочется подобного, но препарсер не вариант.

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

Вообще, задача получить результат в виде массива возникает не так часто, чаще всего когда дело касается коллекции, но в этом случае как правило любая хорошо спроектированная библиотека содержит удобный интерфейс для получения элементов. Еще есть конструкци list(), которая в некоторых случаях может упростить получение элементов.

Если уж приходится часто приходится работать с разультатом в виде массива конкретной функции/метода, проще написать обертку.
Автору 10 баллов! Предлагаю написать язык программрования на php. Без этого никак, поверьте. Я ведь создаю не движок для сайта, я создаю код. На сайт мне вообще похуй, потому-что я программирую только ради кода.
Если вам лень писать лишние строки для извлечения элемента возвращаемого массива и хочется, чтобы работало так:
$secondElement = superFunction(foo, bar)[2];
, то можно попробовать применить функцию list:
list(,, $secondElement) = superFunction(foo, bar);
Я делаю так. Имхо, очень удобно и не нужно никаких препроцессоров.
конечно же, переменную стоило обозвать $thirdElement :)
кстати хороший аналог перлового
my ($foo, $bar, $elem) = superfunction();

но блин, почему ж так все через одно место.
в том же перле
my @array = (1,2,3);
my ($elem, $elem2) = @array;

т.е. работа со списками совершенно прозрачна, а тут ф-ция array() создает список, а list() — его «расчленяет»
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Добро пожаловать в 2013 год, тут у нас php 5.4 уже умеет делать такое нативно
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации