Linux за българи: Форуми

Програмиране => Web development => Темата е започната от: Naka в Jun 21, 2019, 12:16



Титла: PHP каква е тази конструкция $w['parent']()[0]
Публикувано от: Naka в Jun 21, 2019, 12:16
PHP. Kаква е тази конструкция при масивите?

$w['parent']()[0]

Т.е. какво означават тези обикновенните скоби () в средата?

този израз дава синтактична грешка в php 5.3.x но очевидно работи при php 5.4
Искам да го адаптирам към php 5.3 но не знам каkво означава. За първи път виждам такова нещо. В документацията също нищо не намирам.
------

още една подобна конструкция:
Код:
$w['stack']();


Титла: Re: PHP каква е тази конструкция $w['parent']()[0]
Публикувано от: go_fire в Jun 21, 2019, 12:26
Ако имам правилни спомени от php, това е „променлива променлива“. Не заеквам, казвам Дюран Дюран два пъти да го запомните.

С две думи (ако не греша), този израз значи, че името на масива се конструира в движение и се взема първия му елемент.


Титла: Re: PHP каква е тази конструкция $w['parent']()[0]
Публикувано от: Naka в Jun 21, 2019, 12:29
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 и си заслужи бирата.


Титла: Re: PHP каква е тази конструкция $w['parent']()[0]
Публикувано от: Yasen6275 в Jun 21, 2019, 12:47
Naka нали си  наясно че поддръжката на 7.1 е само за security до началото на декември,  а на 7.2 до края на ноември догодина? Подчератавам 7 (седем) 1 и 2.


Титла: Re: PHP каква е тази конструкция $w['parent']()[0]
Публикувано от: makeme в Jun 21, 2019, 12:56
Naka нали си  наясно че поддръжката на 7.1 е само за security до началото на декември,  а на 7.2 до края на ноември догодина? Подчератавам 7 (седем) 1 и 2.
https://www.cloudlinux.com/hardenedphp
 ;)


Титла: Re: PHP каква е тази конструкция $w['parent']()[0]
Публикувано от: Naka в Jun 21, 2019, 13:05
Naka нали си  наясно че поддръжката на 7.1 е само за security до началото на декември,  а на 7.2 до края на ноември догодина? Подчератавам 7 (седем) 1 и 2.

Много им здраве. Като му дойде времето ще се мигрира.
Ти кажи нещо по въпроса ако знаеш.


Титла: Re: PHP каква е тази конструкция $w['parent']()[0]
Публикувано от: go_fire в Jun 21, 2019, 13:19
Добре леко пообърках терминологията. Това е наследство от perl, дето такива магии са си част от живота.

Мейк, мисля, че точно ти беше дал една връзка, дето Мариян обясняваше, че за свои клиенти поддържат все още php 4 и скоро няма да спрат, нищо, че в официалните им ценови оферти за домуване не присъства.

Нищо не умира напълно в паяжината. Има толкова много живи, стари системи, че не е за вярване. И това едва ли ще се промени, колкото и от 1984-та да бутат. Старите неща са прости, новите са сложни. Старите искат малко ресурс, новите са лами. Старите може да се поддържат с малки екипи, новите не могат. И така нататък. Не са за всеки.


Титла: Re: PHP каква е тази конструкция $w['parent']()[0]
Публикувано от: 4096bits в Jun 21, 2019, 14:26
И старото почти не можеш да го хакнеш, защото не си го и виждал дори.


Титла: Re: PHP каква е тази конструкция $w['parent']()[0]
Публикувано от: go_fire в Jun 21, 2019, 15:01
И старото почти не можеш да го хакнеш, защото не си го и виждал дори.

За съжаление последното не е вярно. Старите неща са доста по-кракваеми. С времето се пише все по-сигурно. Колкото по-назад се връщаме, толкова по-беззащитни са били нещата. Забележи, че всички течове на информация са свързани със стари системи. И да има някакви изключения, са малко.


Титла: Re: PHP каква е тази конструкция $w['parent']()[0]
Публикувано от: 4096bits в Jun 21, 2019, 16:37
Това е така, но колко от съвременните хакерчета са изучавали и са се ръчкали със стари системи?


Титла: Re: PHP каква е тази конструкция $w['parent']()[0]
Публикувано от: Naka в Jun 22, 2019, 11:13
PHP го наблюдавам от много отдавана. И мисля, че всички промени дето ги правят са за хубаво. За разлика от съвременните програми дето развалят всичко - тип systemД.
Промените в PHP-то са много обмислени, все са козметични или оправяне на някои функции.

Обаче не трябва да се бърка приложни програми с език за програмиране. Ако при програмите тенденцията при новите версии е за разваляне и тромавост, то езика за програмиране трябва да е константен. Все пак е език.

Дали програмата има секюрити дупки зависи не толкова от езика, колкото от програмиста. Може на PHP4 да направиш сигурен код. А може и на php7 всичко да усереш.



Титла: Re: PHP каква е тази конструкция $w['parent']()[0]
Публикувано от: go_fire в Jun 22, 2019, 11:46
Да де, ама га пишехме на php 3 и 4, езика отговаряше напълно на името си: personal home page. Беше далеч преди да започне да конкурира жабата. И тогава правехме неща от сорта да създаваме променлива от параметър получен по get-ова заявка. Например първите защити срещу инжекции почнахме да ги правим едва при пет. А за разните XSS и подобни почти не бяхме чували за тях.


Титла: Re: PHP каква е тази конструкция $w['parent']()[0]
Публикувано от: Naka в Jun 22, 2019, 12:25
Има едно изключение при което php4-5 е било по сигурно от php5.4 -php7  >:D

имаше едно Magic Quotes. https://www.php.net/manual/en/security.magicquotes.php беше по default и автоматично ескейпваше всички кавички "" ''  с \ в променливите които идват от GET/POST ..Ако такава променлива (автоматично ескейпната) я включиш в mysql завяка - това автоматично предпазва от mysql инжекция.

Т.е за начинащият кодер, който понятие си няма от mysql инжекция, кодът е бил сигурен.

Сега това е махнато..........И хубаво че е махнато, щото не е хубаво php-то да ти прави нещо автоматично зад гърба ти. Обаче начинещ кодер на php7, който понятие си няма за  mysql инжекция, никога няма да се сети да ескейпне променивите преди да ги включи в заявка. Т.е парадоксално но за такъв кодер php7 е по несигурно.



Титла: Re: PHP каква е тази конструкция $w['parent']()[0]
Публикувано от: go_fire в Jun 22, 2019, 13:10
Това си спомням, че пълни базата с наклонени черти. Още щом разбрах за съществуването му, реших да не го ползвам. Не помня и не съм сигурен, но ми се струва лесно заобиколимо, като сам сложиш наклонени черти. Така взаимно се изолират и обезсилват.


Титла: Re: PHP каква е тази конструкция $w['parent']()[0]
Публикувано от: Naka в Jun 22, 2019, 13:32
не не. Не пълни базата с черти, защото mysql-a un-ескипва всичко.
А пък и не може потребителя да го заобиколи просто като добави  черти, защото самата добавена черта / също автоматично се ескейпва //.

Както и да е. сега има addslashes(), mysql_escape_string().. mysql_real_escape_string()
ама последните две гледам вече са ги забранили в php7. Като му дойде времето тогава ще му мислим. ::)


Титла: Re: PHP каква е тази конструкция $w['parent']()[0]
Публикувано от: go_fire в Jun 22, 2019, 13:41
Това addslalshes го помня. Ама нямаше ли някаква подобрена функция още тогава? Нещо ми се мъти, че отначало я ползвах, ама после я замених с друго.

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


Титла: Re: PHP каква е тази конструкция $w['parent']()[0]
Публикувано от: PaperNick в 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


Титла: Re: PHP каква е тази конструкция $w['parent']()[0]
Публикувано от: Naka в 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 да го пробвам.


Титла: Re: PHP каква е тази конструкция $w['parent']()[0]
Публикувано от: go_fire в Jun 27, 2019, 13:07
Това ми бърка в мозъка а и нямам php7 да го пробвам.

https://www.turnkeylinux.org/lamp


Титла: Re: PHP каква е тази конструкция $w['parent']()[0]
Публикувано от: PaperNick в 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'], ще тествам и ще пиша.


Титла: Re: PHP каква е тази конструкция $w['parent']()[0]
Публикувано от: PaperNick в Jun 27, 2019, 16:49
Между другото, във втория линк който пусна за Uniform variable syntax пише, че добавяйки изрично скобички за приоритет си гарантираш еднакво поведение в PHP 5 и 7.
https://wiki.php.net/rfc/uniform_variable_syntax#semantic_differences_in_existing_syntax


Титла: Re: PHP каква е тази конструкция $w['parent']()[0]
Публикувано от: PaperNick в 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'];