Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

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) 2012

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

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

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

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

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

SunChaser (sunchaser.info) 2012

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

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

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

jimidini (jimidini.ya.ru) 2012

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

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

SunChaser (sunchaser.info) 2012

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

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

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

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

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

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

или

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

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

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

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

SunChaser (sunchaser.info) 2012

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

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