Как работает конструкция (в описании) в php?

170
13 августа 2018, 02:20
$funk = array(new ORMe(), 'Read'); // Создали массив
$funk(Review::TABLE, $id) // ВОТ ЭТО НЕПОНЯТНО $переменная(параметры метода Read)

В классе ORMe есть метод Read:

public function Read($table, $id = null, $page = null, $limit = null)
{
    $newId = $id ? $id : null;
    $test = array(new Crud(), 'Read');
    return $test($table, $this->getColumns($table), $newId, $page, $limit);
}

Каким образом "непонятная" конструкция его вызвала?
Я имею в виду, что мы создали массив $func с двумя элементами в первом хранится объект ORMe, а во-втором просто строка с названием метода класса ORMe, как это работает?
Подскажите пожалуйста. В самом методе Read используется такой же трюк с классом Crud и его методом Read.

Answer 1

Это способ свернуть функцию вызова: массив с классом в нулевой позиции и названием метода в первой.

Т. е. $a = [new Crud(), 'Read']; $a(); то же, что и (new Crud())->Read().
Зачем - передать функцию куда-то, например, без лишних затрат.

Answer 2

На ваш вопрос отвечает документация:

http://php.net/manual/ru/functions.variable-functions.php

С версии PHP 5.4.0, можно вызывать callable-функцию, помещенную в переменную.

Пример #4 Сallable-фукнции

<?php
class Foo
{
    static function bar()
    {
        echo "bar\n";
    }
    function baz()
    {
        echo "baz\n";
    }
}
$func = array("Foo", "bar");
$func(); // выведет "bar"
$func = array(new Foo, "baz");
$func(); // выведет "baz"
$func = "Foo::bar";
$func(); // выведет "bar" в PHP 7.0.0 и выше; в предыдущих версиях это приведет к фатальной ошибке
?>

По факту, в такой конструкции вы первым элементом передаете класс, а последующими: методы либо переменные.

READ ALSO
Объединение ключей массива по группам

Объединение ключей массива по группам

Имеется массив полей формы, где каждое поле представлено в виде уникального подмассива:

186
PHP сбрасывается число в кэше

PHP сбрасывается число в кэше

Сделал элементарный подсчёт просмотров страниц:

192
CMake не видит компилятора

CMake не видит компилятора

Поставил CMake (без CLang), добавил в переменную path путь к cmake-39

203
Ошибка при компиляции на XCode

Ошибка при компиляции на XCode

Уже несколько дней не могу разобраться с проблемой, вот код:

159