PHP 5.4

Поставил себе на ноут ПХП 5.4, смотрю как работает. Трейты, конечно, приятная штука, но гораздо важнее, что синтаксис в порядок стали приводить. К сожалению, с первой попытке порядок навести не удалось, но стало гораздо логичнее.

class B {
   function arr() {
       return [
           'i' => 0b101,
           'f' => function () {
               return ['i' => 1];
            }
       ];
   }
}

var_dump((new b)->arr()['i']); // works!
var_dump(call_user_func((new b)->arr()['f'])['i']); // still works…
var_dump((new b)->arr()['f']()); // don't :(

В примере дан класс «B», метод «arr» которого возвращает массив из двух элементов. По индексу «i» там число, по «f» — анонимная функция, которая так же возвращает массив. В новом (5.4) ПХП есть возможность получить элемент массива, возвращаемый функцией, не присваивая его переменной (и, кстати, вызвать метод объекта сразу после его создания).

Но увы, пока нельзя так же вольно обращаться с функциями, приходится их оборачивать в «call_user_func». Но я рад, что ПХП постепенно избавляется от своих болезней.

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

Поделиться
Отправить
8 комментариев
SunChaser (sunchaser.info)

С функциями пока беда и в более простых случаях — http://sunchaser.info/2012/03/22/zabavno.html

Синтаксис массивов клёвый, только его пока phpstorm не понимает

Евгений Степанищев (bolknote.ru)

Комментарий для sunchaser.info:

Это ровно тот же случай, про который я говорю, просто он у меня в составе более сложного кода :) Но ваш пример более наглядный.

SunChaser (sunchaser.info)

Комментарий для Евгения Степанищева:

почти ))
в моем варианте можно сделать затычку через __call и там вызвать call_user_func($this->$method)

но идея, да, одна — что любая ссылка на функцию должна вести себя как функция

jimidini (jimidini.ya.ru)

Комментарий для sunchaser.info:

в php пространство имён методов отделено от пространства имён свойств. ломать это врядли станут

SunChaser (sunchaser.info)

Комментарий для jimidini.ya.ru:

это необязательно ломать. например можно изменить алгоритм проверки

  1. запустить метод если есть
    вставить это -> 2. запустить свойство если есть и is_callable
  2. __call()
Евгений Степанищев (bolknote.ru)

Комментарий для jimidini.ya.ru:

Можно попробовать сделать так:

$a->method();
$a->{prop}();

или

$a->method();
($a->prop)();

Олег Горбунов

Комментарий для sunchaser.info:

phpStorm 4.0 EAP уже все из 5.4 умеет.

SunChaser (sunchaser.info)

Комментарий для Олег Горбунов:

в 116.101 был багос с массивами. сейчас посмотрю. может в 117.чётам исправили

Популярное