Почему Laravel создает экземпляр класса для получения свойства вместо того, чтобы устанавливать это свойство как статическое? - PullRequest
0 голосов
/ 30 октября 2019

Eloquent \ Model класс имеет защищенное свойство с именем таблица . Чтобы получить значение этого свойства, Laravel создает новый экземпляр родительского класса, а затем получает значение:

(new static)->table

Почему бы просто не установить свойство как статическое? А потом:

MyModel::$table

или

static::$table

1 Ответ

1 голос
/ 30 октября 2019

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

class Base
{
    public static $table;
}

class Derived1 extends Base { }
class Derived2 extends Base { }

Base::$table = "Table";

echo Derived1::$table;
echo Derived2::$table;

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

Кроме того, new static () создаст экземпляр класса, для которого был вызван метод.

class Base
{
    public $table;

    public static function create($table)
    {
        // Create instace of derived class
        $instance = new static();
        $instance->table = $table;
        return $instance;
    }
}

class Derived1 extends Base { }
class Derived2 extends Base { }

print_r(Derived1::create("Table1"));  
print_r(Derived2::create("Table2"));

В этом случае каждый экземпляр будет иметь собственное свойство таблицы иДаже фабричный метод, который был в экземпляре базового класса, будет иметь тип, который был вызван.

Обновление Если вы хотите использовать статическую переменную в базовом классе и при этом иметь разные значения,вы бы использовали карту, где имя класса является ключом.

class Base
{
    private static $table;

    public static function create($table)
    {
        $instance = new static();
        self::$table[get_class($instance)] = $table;
        return $instance;
    }

    public function getTableName()
    {
        return self::$table[get_class($this)];
    }
}

class Derived1 extends Base { }
class Derived2 extends Base { }

$d1 = Derived1::create("Table1");
$d2 = Derived2::create("Table2");

echo $d1->getTableName(); //prints Table1
echo $d2->getTableName(); //prints Table2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...