В Laravel 5, что это делает: $ this -> {$ var}

У меня есть следующий код в конечной точке api, который проверяет, нет ли отношений в удаляемой модели (и возвращает true, чтобы показать, что она используется):

КОНТРОЛЛЕР

public function destroy(Group $group)
    {
        if ($group->inUse()) {
            return response(
                ['message' => 'This group cannot be deleted because it has either associated 
                catalogue items, users or organisations'],
                409
            );
        }

        $group->delete();
    }

МОДЕЛЬ

public function inUse()
{
    $models = [
        'categories',
        'items',
        'organisations',
    ];

    foreach ($models as $model) {
        if (count($this->{$model}) > 0 ){
            return true;
        }
    }

    return false;
}

В строке, которую я не совсем понимаю, мы проверяем количество отношений для каждой модели: count($this->{$model})

Я читал на php.net, что $ this -> {$ var} является переменной переменной, но здесь этого не может быть, первое прохождение цикла вернет неопределенную переменную $ Categories:

if ($this->$categories) {
    //
}

Это особенность Laravel или особый синтаксис? Я быстро поискал, но ничего не нашел.

Заранее спасибо.

где ты нашел этот код?

Akbar Mirsiddikov 19.11.2018 15:10

Об этом можно прочитать здесь: Сложный (фигурный) синтаксис

Remul 19.11.2018 15:18

@Remul Это строковая интерполяция, и я считаю, что это немного другое.

Leon Segal 19.11.2018 15:34

@DejavuGuy это было в кодовой базе, над которой я работаю - я продезинфицировал / изменил ее, чтобы скрыть важную для бизнеса информацию.

Leon Segal 19.11.2018 15:35

Я согласен, что это не совсем то, что вы ищете, но это единственное упоминание о доступе к свойствам объекта с помощью фигурных скобок на сайте php.net, которое я смог найти. Вы можете узнать больше об этом отвечать.

Remul 19.11.2018 15:56

@Remul, да, моя беда, я тут совсем запутался, ты был прав насчет скобок!

Leon Segal 19.11.2018 22:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
6
1 125
3

Ответы 3

Его синтаксис php, фигурные скобки, используемые для динамического вызова свойств объекта, в вашем случае это будет переведено как:

if (count($this->categories) > 0 ), if (count($this->items) > 0 ) ...

Я прочитал $ this -> {$ var} как $ this -> $ {$ var} - вот что меня сбивало с толку!

Leon Segal 19.11.2018 15:42

Вы вызываете свойство в данной модели - по внешнему виду, представленному отношением, когда вы проверяете количество записей.

Я считаю, что ваша переменная $models содержит имена отношений https://laravel.com/docs/5.7/eloquent-relationships

Проверка на наличие count предполагает, что они возвращают экземпляр Collection, и вы, вероятно, могли бы просто использовать $this->{$model}->count() или $this->{$model}->isEmpty().

Фигурные скобки в вашем примере необязательны, и обе они эквивалентны:

$this->{$model}
$this->$model

То же, что и фигурные скобки со строками:

"Some text {$array[0]}"

Это не переменные переменные - как указано в документации.

A variable variable takes the value of a variable and treats that as the name of a variable.

http://php.net/manual/en/language.variables.variable.php

Я думал, что фигурные скобки в $ this -> {$ var} означают переменную переменную - secure.php.net/manual/en/language.variables.variable.php. Я ожидал, что это вернет неопределенную ошибку переменной.

Leon Segal 19.11.2018 15:32

Они были бы, если бы вы включили $ перед скобками и использовали его как ссылку на переменную, то есть ${$var}, но вы имеете в виду внутреннее свойство данного объекта, $this->{$var} эквивалентно $this->$var - просто небольшой синтаксический сахар с скобками в Это дело.

Sebastian Sulinski 19.11.2018 15:33

Спасибо - я думаю, это то, из-за чего я спотыкаюсь!

Leon Segal 19.11.2018 15:38

Как вы можете видеть здесь, во-первых, он определяет массив, в котором перечислены отношения для проверки:

$models = [
    'categories',
    'items',
    'organisations',
];

Затем он зацикливает этот массив, чтобы проверить, что хотя бы одно из этих отношений имеет элементы:

foreach ($models as $model) {
    if (count($this->{$model}) > 0 ){
        return true;
    }
}

Итак, если мы возьмем первый элемент массива:

echo $models[0] // 'categories'

в проверке:

foreach ($models as $model) {
    // in this case, $model is 'categories'
    // now it check if the relationship has elements:
    // the following is equivalent to: if (count($this->{$model} > 0) {
    if (count($this->categories) > 0 ){
        return true;
    }
}
...

Другие вопросы по теме