Вызов static :: <function>, но функция не существует, но она работает (в частности, Laravel 5 Eloquent, но это не имеет значения)

1

Некоторое время я задавался вопросом, почему это работает. Я некоторое время работаю с Laravel 5.1, и теперь я хочу создать свою собственную структуру (только для обучения). На данный момент я подключаюсь к моделям и соединениям с базой данных, а затем появляется этот файл. Это расширение моделей, таких как модели состояния и пользователя.

https://github.com/illuminate/database/blob/master/Eloquent/Model.php

Это абстрактный класс модели, который не так уж плох. При настройке проекта Laravel 5.1 будет существовать класс User, который расширяет его, это возможно выполнить

User::where('username', 'Rasmus');

Пользователь - это модель пользователя, которая расширяет абстрактный класс модели

"имя пользователя" относится к столбцу базы данных

"Расмус" - это то, что он ищет в этой колонке, это мое имя...

Интересная часть и главное в этом вопросе заключается в том, что в классе модели нет класса "where", ни в классе "Пользователь". Класс Model НЕ наследует ничего. Может ли кто-нибудь объяснить мне, почему это работает (вызов User :: where), когда метод не существует.

Полезно знать, что static::where(...); называется несколько раз в абстрактном классе модели.

С уважением, Расмус Розенгрен

Соучредитель PHP-ученика

  • 0
    Похоже, что эта структура использует морфинг объектов и черты. Метод определен в классе Eloquent\Builder . Это элегантно, но крайне медленно, поскольку полагается на рефлексию.
  • 1
    @arkascha Это не зависит от отражения. Смотрите __call() в Model .
Теги:

2 ответа

1
Лучший ответ

__call() Model __call() передает ее в экземпляр QueryBuilder (с несколькими шагами между ними, но это основной результат).

public function __call($method, $parameters)
{
    ...

    $query = $this->newQuery();
    return call_user_func_array([$query, $method], $parameters);
}

__call() - волшебный метод, который позволяет приложению иметь дело с отсутствующим/недоступным именем метода. В этом случае он позволяет использовать различные методы where() (в том числе возможность делать такие вещи, как определенно неопределенные функции, такие как whereUsername('Rasmus')).

  • 0
    Спасибо, не видел этого, если вызываемый метод (vie the magic method __call) - это что-то еще, что увеличивает или уменьшает его переключение на построитель запросов. Спасибо! Мне потребовались бы годы, чтобы понять это ... Я искал в магическом методе __callStatic :)
0

Я не программирую эксперт, и я ожидаю лучшего ответа на это. Однако вас может заинтересовать QueryBuilder в строке 447. В то время как на Model.php вы можете увидеть, что он использует QueryBuilder в строке 27.

Как я помню, Laravel использует черту для обработки нескольких повторных использования кода. Это довольно продвинутая тема - это довольно интересно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню