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

go_fire

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

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

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

***

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

***

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

PaperNick

  • Напреднали
  • *****
  • Публикации: 291
  • Window Manager: Xfce
    • Профил
Re: PHP каква е тази конструкция $w['parent']()[0]
« Отговор #16 -: Jun 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
Активен

Practice

Naka

  • Напреднали
  • *****
  • Публикации: 3395
    • Профил
Re: PHP каква е тази конструкция $w['parent']()[0]
« Отговор #17 -: Jun 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 да го пробвам.
« Последна редакция: Jun 27, 2019, 12:38 от Naka »
Активен

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

go_fire

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 8780
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
Re: PHP каква е тази конструкция $w['parent']()[0]
« Отговор #18 -: Jun 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

  • Напреднали
  • *****
  • Публикации: 291
  • Window Manager: Xfce
    • Профил
Re: PHP каква е тази конструкция $w['parent']()[0]
« Отговор #19 -: Jun 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'], ще тествам и ще пиша.
« Последна редакция: Jun 27, 2019, 16:12 от PaperNick »
Активен

Practice

PaperNick

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

Practice

PaperNick

  • Напреднали
  • *****
  • Публикации: 291
  • Window Manager: Xfce
    • Профил
Re: PHP каква е тази конструкция $w['parent']()[0]
« Отговор #21 -: Jul 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'];
Активен

Practice

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