PHP: массивы, возвращаемые функцией

Мне нравится PHP (если вам не нравится — пожалуйста, забудьте про этот топик. Не надо холиварить) и еще мне нравится одна штука, которая прям везде есть, а в PHP отсутствует:

superFunction(foo, bar)[2];


Что делает этот код? Правильно! Возвращает третий элемент массива, который возвращает superFunction() с аргументами foo и bar.

В PHP-синтаксисе это выглядело бы так:

superFunction($foo, $bar)[2];


Вот только этот код выдает Parse Error. «И поделом!» — раздаются уж крики ненавистников синтаксического сахара. Я предлагаю им тоже отправиться подальше от этого топика, чтобы не холиварить и не доказывать, что это не нужно (посмотрите, в каком я блоге это разместил, в конце-то концов).

На сайте PHP я узнал, что такого синтаксиса разработчики позволять не планируют даже в 6 версии. Ну, блин. Я и сам — молодец! Итак, за ночь я написал небольшой класс, который, если его правильно использовать, разрешает работать с массивами по-человечески.



Работает ли это?



Да, Preparser работает. После нескольких часов отладки я смог научить его не глючить, обрабатывая одно мое «большое» приложение, использующее Zend Framework и тысячу всего подряд. Из чего делаю вывод, что глючить он по-умолчанию не станет.
Работает он быстро. Да, он парсит все подключаемые (include и т.п.) фаилы и меняет там все как хочет. Но Preparser обработанный код, разумеется, аккуратненько кеширует и подключает обычным include-ом при повторном запуске скрипта, что не отнимает лишнего процессорного времени вообще. Кстати, Preparser проверяет дату модификации фаилов, так что можно не беспокоиться об очистке кеша с каждой измененной строкой.
Уже отпарсенные фаилы выполняют конструкцию func()[] без потерь производительности. Там ничего страшного не происходит вообще :)

Работает он просто. Чтобы взять и перевести ну прям всё огромное большое приложение на Preparser, надо написать 2 или там не знаю, 3 строки. Если вы программируете, меняя глобальные переменные в include-ах, то строк придется добавить чуть больше. Но вы же взрослые люди и давно не делаете таких бяк, правда?
Кстати, глобальные переменные из include-ов меняться перестанут, но команда return $smth; останется работать.
А еще: для совместимости с Zend_View во всех фаилах, заинклуженных внутри классов, продолжает работать $this.
Итак, если вы пишете при помощи Zend Framework, то все будет хорошо. Если у вас какой-то другой цивильный фреймворк без уродливостей вроде глобальных переменных — скорее всего, всё будет хорошо (я не проверял, буду рад вашим отзывам!). Ну а если нет — не знаю, попробовать все равно стоит, благо это просто. Заодно расскажете мне, в чём я не прав :)

Ах да, Препарсеру нужен PHP ветки 5.3. :)

Чо как?



Preparser работает с фаилами, заинклуженными через него, а также с фаилами, заинклуженными теми фаилами, которые заинклужены через него. Наверное, вы не поняли предыдущую фразу. Окей.

Вариант 1: поиграться


Суть такова: чтобы в php фаиле можно было использовать конструкцию func()[2], его нужно подключить через Preparser. Т.е., создаете, скажем, index.php и hooray.php:
<? // index.php

// настраиваете include_path() или прописываете путь
require_once '/library/Preparser.php';

// не обязательно, но желательно. Не забудьте создать папку и дать права!
Preparser\setCachePath('/../data/preparserCache/');

Preparser\requirePreparsed_once('hooray.php');


Теперь в hooray.php вы можете использовать самые страшные конструкции (в /tests/dereferencing.php можете найти примеры):

<? // hooray.php

assert( array('a' => 1, 'b' => 2)['a'] == 1 );

function ret_anything($lol) {
return $lol;
}

assert( ret_anything( array(1, 2, ret_anything(4), ret_anything(array(1, 2, 3))[1])[ ret_anything(array(1, 2, 3))[ret_anything(array(1, 2, 3))[1]] ]) == 2 );



Вариант 2: перевести проект на Preparser


Вот как я изменил index.php для одного крутого сайта:
<?
// поскипаны всякие штуки с константами и set_include_path()

require_once '/Preparser.php';
Preparser\setCachePath(APPLICATION_PATH . '/../data/preparserCache/');

//было: require_once 'Zend/Application.php';
Preparser\requirePreparsed_once('Zend/Application.php');

// Create application, bootstrap, and run
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/configs/application.ini'
);

$application->bootstrap()
->run();


Добавил две строки, а потом поменял одну. Очень сложно! Потом я открыл index.php в браузере и подождал (достаточно долго, минуту почти), пока формировался кеш. После этого все работало быстро и без сучка без задоринки.

Подводные камни?



Не знаю, какие уж там подводные камни. Работать я старался аккуратно. Глобальное пространство имен не засорял. Свежезаинклуженный фаил не получит себе в подарок кучу переменных, он вообще ни одной не получит, кроме, разве что, $this. Ну можете еще подключать свои глобальные переменные директивой global.

Я думаю, вы найдете эти камни быстрее меня — буду рад вашим отзывам!

Где взять?



А, брать эту приблуду с ГуглКода. Опенсорс. Лицензия New BSD, я не вдавался в подробности, но, кажется, вы можете использовать это как хотите и свой код при этом вам открывать не обязательно :)

Там еще есть даже не начатый мануал. Я буду рад, если кто поможет мне его написать…

Как помочь?


… да, я буду рад, если кто-нибудь поможет мне написать мануалы и прочее. Я очень хреново говорю по-английски, так что мне немного стыдно за все, что я понаписал в README.txt и HOWTOS.txt. За исправление тамошних ошибок тоже буду благодарен, но одна есть просьба: не пишите о них в комментариях здесь на хабрике, чтобы не засирать эти самые комментарии временными и малоосмысленными сообщениями. У меня есть почты разные, например, preparser@va1en0k.net

Еще я буду благодарен за тестирование. Ну и — особенно — за патчи.

Фичреквесты обязательны. Думаю, еще много чему стоило бы научить парсер php.

Спасибо за внимание!

Делал я это, разумеется, от скуки и никакой поддержки или обоснования необходимости существования не обещаю 8)
+8
26 октября 2009, 08:03
12
va1en0k 44,4

комментарии (112)

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

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

$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, а не вектора.
+1
va1en0k #
какое странное рассуждение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

stat('uploads')['blksize']

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Можете заодно поразмыслить почему функциям типа
preg_match* приходится иметь дополнительный изменяемый параметр для ВОЗВРАТА собственно найденных подстрок.
0
zerkms #
0
mishinoleg #
интересно, а бОльшую глубину хабр выдержит?
0
pietrovich #
потому, что это удобно

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)?
+1
zerkms #
кстати поаплодируем, как вы клёво перевели тему на глобальные переменные.
0
aubt #
> Иначе по вашему такой тип как объекты вообще не нужен — уж там то сколько «лишних» полей.

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

$filename = pathinfo($path)[1]; // ← так писать действительно плохо (опустим тот момент, что этот код не работает)
$filename = basename($path); // ← лучше писать так
–7
smartov #
Ой ну я вас прошу. Вы что группами ходите?
0
aubt #
В пяти Ваших постах этой ветви нет ни одного аргумента, зато есть искрометная фраза «я не собираюсь приводить аргументы того, что вы неправы» :) Кто тут троллит?
–2
smartov #
Вам в топик про чайник рассела
ru.wikipedia.org/wiki/%D0%A7%D0%B0%D0%B9%D0%BD%D0%B8%D0%BA_%D0%A0%D0%B0%D1%81%D1%81%D0%B5%D0%BB%D0%B0

Я не собираюсь доказывать что чайника нет
0
aubt #
Вот если бы вы не оспаривали тот факт, что чайник есть (как откровенный бред), вопросов бы не было.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0
glorybox #
немного холивора:)

search.cpan.org/~nwclark/perl-5.8.9/pod/perlfilter.pod
0
megahertz #
Иногда хочется подобного, но препарсер не вариант.

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

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

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

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

т.е. работа со списками совершенно прозрачна, а тут ф-ция array() создает список, а list() — его «расчленяет»
НЛО прилетело и опубликовало эту надпись здесь
0
VtQveant #
почти reader macro… самозарождение лиспа неизбежно.

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