LINUX.ORG.RU

PHP vs Hashtable


0

0

Почему в PHP не работает такой код?:

function test(){
return array(1,2,3);
}

print test()[1];

Ругается на: Parse error: syntax error, unexpected '['

Хотя вроде ничего необычного. На php давно не писал, но на ruby и python аналогичный код работает...

>>> def x():
... return [1,3,4]
...
>>> x()[1]
3

irb(main):001:0> def x
irb(main):002:1> [1,2,3]
irb(main):003:1> end
=> nil
irb(main):004:0> x()[1]
=> 2

anonymous

Хм, ты ещё спроси "почему в ПХП нет замыканий и этой, как её, хвостовой реккурсии" :-D

r_asian ★☆☆
()
Ответ на: комментарий от r_asian

>Хм, ты ещё спроси "почему в ПХП нет замыканий

Нету??? Почему? Исследуя эту проблему я наткнулся на то что в перле так тоже нельзя, но замыкания в перле есть.. Учитывая то что пхп это клон перла не удивительно первое, а второе вот зачем убрали? Получается пхп это кастрированный перл, без различия скалярного и векторного контекста переменных да еще и без замыканий?

>Вот так будет работать

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

>print ( test() )[1];

Не работает. Или у меня PHP неправильный?

Пока единственный выход что я вижу:

function listn($arr,$ind){
return $arr[$ind];
}

Но это извращенство, и везде эту функцию объявлять... Так вообще бы уж отказались от квадратных скобок, раз не дают их нормально использовать.

anonymous
()
Ответ на: комментарий от anonymous

>Не работает. Или у меня PHP неправильный?

Нет, не работает. Один из реальных недостатков PHP-синтаксиса :) К счастью, извлекать конкретные элементы массива из функции налету приходится очень редко. В частных случаях можно (ибо это бывает надо чаще всего - получить, там, аргументы getimagesize и т.п.) обходиться так:

function f() { return array(1,2,3); }

list($x, $y) = f();

echo $y;

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Почему не надо вводить новые переменные (на этот раз уже две!) и использовать два выражения я написал выше. Насчет конкатенации - если видели такую убогую быдлоcms как netcat (да, называется также как и сетевая утилита, но те кто писал эту cms вряд ли способны знать что такое имя уже используется), то все поймете.

anonymous
()
Ответ на: комментарий от Anoxemian

>Гггг. Мегаязык. Интересно, что покажет вот это:

Наверное будет работать, если listn работает. Но какой же это изврат.. Еще слово array надо 2 раза писать, вот в руби не надо писать что array если итак понятно что там array - x().slice(1,1).pop

anonymous
()
Ответ на: комментарий от roller

>Если не жалко использовать лишнюю переменную.

Жалко. А еще - если мне надо будет 10-ый элемент массива, или вообще из хештаблицы по ключу. Например функция возвращает координаты в виде (x => 10, y => 15)

anonymous
()
Ответ на: комментарий от anonymous

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

Ну, против ваших религиозных верований я ничего против не имею :-)

r_asian ★☆☆
()
Ответ на: комментарий от r_asian

>Ну, против ваших религиозных верований я ничего против не имею :-)

Почему во всех языках так можно а в PHP нельзя? Это же баг в интерпритаторе.

anonymous
()
Ответ на: комментарий от anonymous

>Почему во всех языках так можно а в PHP нельзя?

Просьба список "всех" языков в студию :) Я бы сказал, что языков, в которых работает запрашиваемая тобой конструкция - меньшинство :D

...

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

...

А уж жалеть завести лишнюю переменную - это ты зря. Лишние переменные нередко (правда, не в этом случае) могут дать приличную экономию в производительности, а если привыкнешь жмотничать на них - то автоматом будешь упускать.

Если значение функции используется более одного раза - в переменную её.

Если значение хэша используется более одного раза - в переменную его.

Если некое сложное выражение используется более одного раза - в переменную его.

И т.д. и т.п.

KRoN73 ★★★★★
()
Ответ на: комментарий от anonymous

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

r_asian ★☆☆
()
Ответ на: комментарий от KRoN73

Мне нужна функция для получения полной строки из базы данных, которая вернет ее в нормальном для использования виде. Раньше возвращался объект, по mysql_fetch_object, и работало что-то вроде f()->Name (имя пользователя нужно только в одном месте для конкретного пользователя). В php4 который стоит на хостинге такой функции нет, но есть fetch_array, но простая замена ->Name на [Name] не работает, хотя она вполне логична.

>Если некое сложное выражение используется более одного раза - в переменную его.

не, лучше так - ( function(x){ действия с результатом выражения } )(сложное выражение); - Никаких лишних переменных в области видимости функции.

anonymous
()
Ответ на: комментарий от anonymous

>Раньше возвращался объект, по mysql_fetch_object

Работой с БД должен заниматься драйвер БД. Работой с драйвером БД должен заниматься ORM. Прописываешь в свойствах класса геттер, сеттер, и БД/таблицу/поле. Всё, при создании экземпляра класса он вытянет сам всё, что нужно. Не помню уже, когда в последний раз доставал из БД _объекты_ :)

>и работало что-то вроде f()->Name

Ну, вот реальный пример:

в controller:
$user = class_load('my_system_user', $_GET['user_id']);
...
во view:
Имя: {$user->full_name()}

(кстати, у тебя, часом, не в PHP-код засунут HTML? ;))

>В php4 который стоит на хостинге

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

>не, лучше так

Угу. А потом люди жалуются на тормоза PHP :) Каждый раз, когда function(x) вызываться будет, заново считать сложное выражение будешь? Ну-ну... :D

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

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

Это я знаю. Просто работа такая.. быдлокодер. В нашем городе две альтернативы - или быдло-PHP-кодер или дотнетчик. Не все же в москве живут..

Про MVC знаю, но оно в нашем городе не востребовано - гораздо востребование работа с быдло-CMS где ни о каком MVC и речи нет, а логика засунута в html код. Пример было-CMS - http://www.netcat.ru/. Там все шаблоны рендерятся через eval("echo $template");

>Каждый раз, когда function(x) вызываться будет, заново считать сложное выражение будешь? Ну-ну... :D

У гугла такое везде. Заново считаться не будет, видимо вы не осилили о чем речь:

(finction(x){ alert("Ответ: "+x); sendAnswer(x) } )(Math.sin(a*b*c*d)/Math.cos(z,x,c,v,b))

Результат считается 1 раз а используется 2 раза.

anonymous
()

Потому что похапе сделан очень интуитивно-понятным.

Miguel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.