__construct() {
$this->model = Model::all();
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
}
}
class SubSubClassOne extends SubClass {
function __construct() {
parent::__construct();
}
}
class SubSubClassTwo extends SubClass {
function __construct() {
parent::__construct();
}
}
new SubSubClassOne();
new SubSubClassTwo();
Как сделать так чтобы вызов Model::all() - был один раз?
Singleton
через серивс контейнер
делаешь static поле, записываешь результат команды туда
В случае с Ларой, есть два основных варианта: Вариант 1: создаёшь фасад: use Illuminate\Support\Facades\Facade; use App\SomePath\SubSubClassOne as One; /** * @method static \Illuminate\Support\Collection all() */ class SubSubClassOne extends Facade { protected static function getFacadeAccessor() { return One::class; } } После этого обращаешься не к классу, а к фасаду: return SubSubClassOne::all(); Минус этого метода: фасад нужно создавать на каждый класс, и поэтому: Вариант 2: юзать singleton: return app(SubSubClassOne::class)->all(); return app(SubSubClassTwo::class)->all(); Минус этого метода: класс инициализируется 1 раз и если он внутри хранит состояние, то до тех пор, пока пых не "умрёт", он будет его хранить. Если внутри класса юзаешь статические атрибуты, то они и после смерти будут работать, если в пыхе подключен модуль opcache (вообще, должен быть включен). Ну и в Laravel Octane тоже будет жить. Так что учитывай этот момент. Ну а если класс ничего не хранит внутри и лишь является посредником, то проблем нет.
Вроде как второй вариант, и подходит пошел тестировать, спасибо за описание минусов.
единственно что не понятно нужно ли вызывать в данном случае parent::construct() ?
Если классы выглядят прямо как сейчас, то вообще не нужно. Конструкты вызываются лишь когда в них что-то передают или они сами что-то делают. То есть, твой текущий код можно упростить до: class BaseClass { function __construct() { $this->model = Model::all(); } } class SubClass extends BaseClass { } class SubSubClassOne extends SubClass { } class SubSubClassTwo extends SubClass { } new SubSubClassOne(); new SubSubClassTwo();
Обсуждают сегодня