Автор Тема: PHP каква е тази конструкция $w['parent']()[0]  (Прочетена 1049 пъти)

go_fire

  • Участник
  • *****
  • Публикации: 5148
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
Re: PHP каква е тази конструкция $w['parent']()[0]
« Отговор #15 -: Юни 22, 2019, 13:41 »
Това addslalshes го помня. Ама нямаше ли някаква подобрена функция още тогава? Нещо ми се мъти, че отначало я ползвах, ама после я замених с друго.

Жалко, че не ми се занимава да вдигам LAMP, ама това, че се изолират чертите, съвсем не означава, че не е заобиколимо, като сложиш две черти. Така онова ще добави две черти и пак всички ще се изолират една друга. Лошото е, че истинското лечение на инжекциите се нарича „подготвени заявки“, чиято сложност граничи с безумие. Някъде там реших, че php вече не е моето нещо. Спря да бъде нещо лесно и удобно. Превърна се в жаба. Може да се ползва само с дебели слоеве абстракция.
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear

PaperNick

  • Участник
  • *****
  • Публикации: 284
  • Window Manager: Xfce
    • Профил
Re: PHP каква е тази конструкция $w['parent']()[0]
« Отговор #16 -: Юни 22, 2019, 21:24 »
Variable variable е с два долара:   $$w

----
Код:
$w['parent']()[0]

да не искаш да кажеш че това е името на функцията???
т.е. в $w['parent'] например се съдържа 'my_func'

а $w['parent']() тогава извиква  my_func()

а пък $w['parent']()[0] връща нулевият елемент от резултата на масива на функцията???  my_func()[0]   <---- това вече го разбрах че е новост в php5.4

Шантава работа..Така ли е наистина. Тук нещо понамерих:
https://www.php.net/manual/en/functions.variable-functions.php

ако наистина е така насочването беше успешно [_]3 и си заслужи бирата.

Макар, че go_fire те побутна в правилната посока и се ориентира сам, все пак да потвърдя, че поведението е такова.
Общо взето, както си установил, в PHP 5.4 вкараха "array dereferencing" на методи/функции които връщат нещо.
https://www.php.net/manual/en/migration54.new-features.php

В твоя случай това ще рече, че след извикването на динамичната функция, PHP-то ще последва референцията където се намира масива в паметта и ще достъпи първия елемент.
Преди PHP 5.4 се налагаше резултата от функцията да се присвои на променлива.

Код
GeSHi (PHP):
  1. // PHP 5.3
  2.  
  3. <?php
  4.  
  5. function test_func() {
  6.    return array('Test was called');
  7. }
  8.  
  9. $my_array = array('parent' => 'test_func');
  10. $func_result = $my_array['parent']();
  11. echo $func_result[0];

Код
GeSHi (PHP):
  1. // PHP 5.4
  2.  
  3. <?php
  4.  
  5. function test_func() {
  6.    return ['Test was called'];
  7. }
  8.  
  9. $my_array = ['parent' => 'test_func'];
  10. echo $my_array['parent']()[0];

Готиното на този синтакс е, че ти позволява да навързваш такива извиквания без да се налага да присвояваш резултата на всяка стъпка:
Код
GeSHi (PHP):
  1. $arr['parent']()[0]['child']()[1]
(не трябва да се прекалява обаче, понеже става трудно за четене и дебъгване)


И понеже предвиждам, че точно този синтакс ще ти докара ядове когато мигрираш към PHP 7+ ти пускам тази статия, която показва промените свързани с приоритета на изпълнение на подобни динамични извиквания:
https://www.atlantic.net/hipaa-compliant-cloud-storage/what-is-php7-breaking-changes-php5/
и там секцията "Uniform Variable Syntax".

Ако те мързи да кликаш, това:
Код
GeSHi (PHP):
  1. $atlantic->$dot[‘net’]()
В PHP 5 се изпълнява с този приоритет:
Код
GeSHi (PHP):
  1. $atlantic->{$dot[‘net’]}()
А в PHP 7+ с този:
Код
GeSHi (PHP):
  1. ($atlantic->$dot)[‘net’]()

Забавлявай се ;D
Активен

За да вървиш напред, понякога се налага да започнеш отначало.

Naka

  • Участник
  • *****
  • Публикации: 2630
    • Профил
Re: PHP каква е тази конструкция $w['parent']()[0]
« Отговор #17 -: Юни 27, 2019, 12:20 »
И понеже предвиждам, че точно този синтакс ще ти докара ядове когато мигрираш към PHP 7+ ти пускам тази статия, която показва промените свързани с приоритета на изпълнение на подобни динамични извиквания:

Цитат
Indirect access to variables, properties, and methods will now be evaluated strictly in left-to-right order, as opposed to the previous mix of special cases. The table below shows how the order of evaluation has changed.
Old and new evaluation of indirect expressions
https://www.php.net/manual/en/migration70.incompatible.php
https://wiki.php.net/rfc/uniform_variable_syntax
Код
GeSHi (PHP):
  1. Expression PHP 5 interpretation PHP 7 interpretation
  2. ----------------------------------------------------------------------------
  3. $$foo['bar']['baz'] ${$foo['bar']['baz']} ($$foo)['bar']['baz']
  4. $foo->$bar['baz'] $foo->{$bar['baz']} ($foo->$bar)['baz']
  5. $foo->$bar['baz']() $foo->{$bar['baz']}() ($foo->$bar)['baz']()
  6. Foo::$bar['baz']() Foo::{$bar['baz']}() (Foo::$bar)['baz']()
  7.  


Това означава ли че работещ код под PHP 5, например $$foo['bar']['baz'] точно така написан (без допълнителни скоби) може да върне съвсем друг резултат под PHP 7? Ами за останалите три примера ще връща ли различен резултат под PHP 7.

Това ми бърка в мозъка а и нямам php7 да го пробвам.
« Последна редакция: Юни 27, 2019, 12:38 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

go_fire

  • Участник
  • *****
  • Публикации: 5148
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
Re: PHP каква е тази конструкция $w['parent']()[0]
« Отговор #18 -: Юни 27, 2019, 13:07 »
Това ми бърка в мозъка а и нямам php7 да го пробвам.

https://www.turnkeylinux.org/lamp
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear

PaperNick

  • Участник
  • *****
  • Публикации: 284
  • Window Manager: Xfce
    • Профил
Re: PHP каква е тази конструкция $w['parent']()[0]
« Отговор #19 -: Юни 27, 2019, 16:09 »
Това означава ли че работещ код под PHP 5, например $$foo['bar']['baz'] точно така написан (без допълнителни скоби) може да върне съвсем друг резултат под PHP 7? Ами за останалите три примера ще връща ли различен резултат под PHP 7.
Да, много е вероятно понеже когато ставаше миграята към 7, доста хора се оплакваха, че това им е счупило проектите. И в Wordpress имаше някаква драма, ама вече не помня.

Това ми бърка в мозъка а и нямам php7 да го пробвам.
И аз нямам. Горните примери ги нацъках в един online tool. Използвах този, понеже поддържа доста версии:
http://sandbox.onlinephpfunctions.com/

Ако ми остане време и успея да измисля някакъв пример за $$foo['bar']['baz'], ще тествам и ще пиша.
« Последна редакция: Юни 27, 2019, 16:12 от PaperNick »
Активен

За да вървиш напред, понякога се налага да започнеш отначало.

PaperNick

  • Участник
  • *****
  • Публикации: 284
  • Window Manager: Xfce
    • Профил
Re: PHP каква е тази конструкция $w['parent']()[0]
« Отговор #20 -: Юни 27, 2019, 16:49 »
Между другото, във втория линк който пусна за Uniform variable syntax пише, че добавяйки изрично скобички за приоритет си гарантираш еднакво поведение в PHP 5 и 7.
https://wiki.php.net/rfc/uniform_variable_syntax#semantic_differences_in_existing_syntax
Активен

За да вървиш напред, понякога се налага да започнеш отначало.

PaperNick

  • Участник
  • *****
  • Публикации: 284
  • Window Manager: Xfce
    • Профил
Re: PHP каква е тази конструкция $w['parent']()[0]
« Отговор #21 -: Юли 01, 2019, 20:15 »
Сигурно вече си се ориентирал и си го тествал, но все пак:

Код
GeSHi (PHP):
  1. <?php
  2.  
  3. $foo = 'test';
  4. $test = ['bar' => ['baz' => 'result']];
  5.  
  6. // Interpreted as ($$foo)['bar'['baz'] in PHP 7. Prints "result".
  7. // This line throws a Warning and Notice in PHP 5
  8. echo $$foo['bar']['baz'];
  9.  
  10. echo PHP_EOL;
  11.  
  12. // Compatible in PHP 5 and 7. Prints "result".
  13. echo ${$foo}['bar']['baz'];
Активен

За да вървиш напред, понякога се налага да започнеш отначало.

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
Игнориране на Parent Directory
Настройка на програми
zeridon 1 856 Последна публикация Мар 08, 2005, 22:43
от zeridon