Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Обращение к элементам массивов, возвращаемых функцией (Валенок)
Author Message
Валенок
Участник форума



Joined: 06 Apr 2006
Posts: 520
Карма: -3
   поощрить/наказать


PostPosted: Mon Oct 26, 2009 8:23 am (написано за 10 минут 35 секунд)
   Post subject: Обращение к элементам массивов, возвращаемых функцией
Reply with quote

Здравствуйте!

Написал вот библиотеку, позволяющую такие конструкции:
Code (php): скопировать код в буфер обмена
superFunction($foo, $bar)[2];
Работает кешируя, а потому быстро, не знаю уж, насколько хорошо :) Требует PHP 5.3.
Страничка на гугл-коде code.google.com/p/php-preparser/ , описание на Хабре habrahabr.ru/blogs/crazydev/73358/ .

Для использования надо инклудить фаилы через библиотеку Preparser, например, так:
Code (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();
В заинклуженных фаилах глобальные переменные будут доступны лишь через global. Локальных переменных видно не будет, но будет доступен $this, если инклужено из класса (сделал для совместимости с Zend_View).

Код, конечно, ужасноват, но глобальное пространство имен не засоряет и так далее :) Я старался.

Работает через токенайзер, встроенный в PHP. Меняет вызовы include()-подобных функций на свои, а конструкции function()[] или ->method()[] и тп на вызов функции-помощника, вот такой вот банальной
Code (php): скопировать код в буфер обмена
namespace Preparser;
function getValue($tmp, $id) { return $tmp[$id]; }
Сначала, кстати, пытался сделать замену на что-то такое
Code (php): скопировать код в буфер обмена
( сall_user_func(function()use($var1, $var2){ $t = func(); return $t['key']; } )
где $var1 и $var2 парсятся из аргументов, но вовремя передумал.

Поддерживает всевозможные вложенные конструкции
Code (php): скопировать код в буфер обмена
function ret_anything($lol) {
    return $lol;
}
assert (www.php.net/assert)( array (www.php.net/array)('a' => 1, 'b' => 2)['a'] == 1 );
assert (www.php.net/assert)( ret_anything(array (www.php.net/array)(1, 2, 3))[1] == 2 );
assert (www.php.net/assert)( array (www.php.net/array)(1, 2, 3)[ ret_anything(2) ] == 3 );
assert (www.php.net/assert)( array (www.php.net/array)(1, 2, array (www.php.net/array)(1, 2, 3)[1])[1] == 2 );
assert (www.php.net/assert)( ret_anything(   array (www.php.net/array)(1, 2, ret_anything(array (www.php.net/array)(1, 2, 3))[2] ) )[1] == 2 );
assert (www.php.net/assert)( array (www.php.net/array)(1, 2, 3)[ret_anything(array (www.php.net/array)(1, 2, 3)[0])] == 2 );
assert (www.php.net/assert)( ret_anything( array (www.php.net/array)(1,   2, ret_anything(4), ret_anything(array (www.php.net/array)(1, 2, 3))[1])[ ret_anything(array (www.php.net/array)(1, 2, 3))[ret_anything(array (www.php.net/array)(1, 2, 3))[1]] ]) == 2 );
Кеширует все парсенные фаилы. Если дата модификации фаила оказалась больше даты модификации кеша этого фаила, то фаил перекешируется. Это чтобы сделать отладку как можно более прозрачной.

По-моему, всё что стоило сказать - сказал. Там есть HOWTOS.txt, в котором обьясняется, например, как запретить Препарсеру инклудить какой-то фаил через себя. Очень рекомендую к прочтению, корявый английский - самый шик.


Preparser-0.1.tar
 Description:

Download
 Filename:  Preparser-0.1.tar
 Filesize:  35 KB
 Downloaded:  563 Time(s)

Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Mon Oct 26, 2009 2:14 pm (спустя 5 часов 50 минут; написано за 21 секунду)
   Post subject:
Reply with quote

Валенок
Вот скажите, зачем ему PHP 5.3? Почему, действительно, не сделали его зависимым от PHP6?
Back to top
View user's profile Send private message Send e-mail
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Mon Oct 26, 2009 2:49 pm (спустя 35 минут; написано за 14 секунд)
   Post subject:
Reply with quote

Юрий Насретдинов wrote:
Вот скажите, зачем ему PHP 5.3?
Юр, у него нэймспейсы там.
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Mon Oct 26, 2009 4:30 pm (спустя 1 час 40 минут; написано за )
   Post subject:
Reply with quote

Я имел ввиду, что для общедоступных библиотек можно бы и не использовать только что вышедшую версию PHP.
Back to top
View user's profile Send private message Send e-mail
Валенок
Участник форума



Joined: 06 Apr 2006
Posts: 520
Карма: -3
   поощрить/наказать


PostPosted: Mon Oct 26, 2009 6:00 pm (спустя 1 час 30 минут; написано за 4 минуты 14 секунд)
   Post subject:
Reply with quote

Александр Михалицын
Там еще два замыкания.

Юрий Насретдинов
Да, пожалуй стоило бы сделать менее жесткими требования. Просто первое пришедшее в голову решение не особенно подходило для php 5.х.



Другой вопрос, стоит ли сейчас переделывать? Судя по тому, что мне отвечали на Хабре, эта штука - абсолютное зло.

Если она действительно никому не нужна, я допишу то, что нужно лично мне, а показывать людям и делать связанные с этим телодвижения не буду, так мне и всем остальным будет проще
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Mon Oct 26, 2009 6:11 pm (спустя 10 минут; написано за )
   Post subject:
Reply with quote

Если такая штука сделана достаточно корректно и удобно, то это совсем не зло, ИМХО.
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Tue Oct 27, 2009 12:46 am (спустя 6 часов 35 минут; написано за 37 секунд)
   Post subject:
Reply with quote

Итераторы - они ж вроде < 5.3 ?
Back to top
View user's profile Send private message
Валенок
Участник форума



Joined: 06 Apr 2006
Posts: 520
Карма: -3
   поощрить/наказать


PostPosted: Tue Oct 27, 2009 12:51 am (спустя 4 минуты; написано за 26 секунд)
   Post subject:
Reply with quote

Maus, По-моему, я не использую итераторы, или я не знаю, чего использую
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Wed Oct 28, 2009 7:54 am (спустя 1 день 7 часов 2 минуты; написано за 53 секунды)
   Post subject:
Reply with quote

Валенок
я к тому, что особых проблем с реализацией под более раннюю версию PHP не должно быть?
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Mon Nov 02, 2009 11:02 am (спустя 4 дня 3 часа 8 минут; написано за 2 минуты 13 секунд)
   Post subject:
Reply with quote

Code (php): скопировать код в буфер обмена
// 1
$y = func(...)[1];

// 2
$x = func(...);
$y = $x[1];
Конечно же, первый вариант гораздо короче второго. Но стоит ли игра свеч?

В оффтопик.
Почитал Вас на хабре. Ну и жаргончик у Вас, специфический.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML