Как отследить вызов метода объекта PHP? Есть магический метод __call который вызывается если метода нету (для статических __callStatic). А как правильно сделать примерно такую штуку: если я пытаюсь вызвать любой метод объекта, то сначала запустить команду createInstance() - создать синглтон, а уже потом выполнить саму команду. Или это много думаю, все проще? Неужели единственный способ - это в каждое объявление функции прописывать static::createInstance() ?
Для реализации задачи вы можете использовать магический метод __call вместе с проверкой на наличие экземпляра объекта. Ниже приведен пример, как это можно сделать:
class MyClass { private static $instance; public static function createInstance() { if (!self::$instance) { self::$instance = new MyClass(); } } public function __call($name, $arguments) { self::createInstance(); if (method_exists($this, $name)) { return call_user_func_array([$this, $name], $arguments); } else { throw new Exception("Method {$name} does not exist"); } } public function myMethod() { echo "Method has been called"; } } $obj = new MyClass(); $obj->myMethod(); // Результат: "Method has been called"
Таким образом, при вызове любого метода объекта MyClass будет сначала создаваться инстанс с помощью метода createInstance(), а затем вызываться необходимый метод. Таким образом, вам не нужно будет каждый раз вызывать createInstance() в отдельных методах.
Для реализации задачи вы можете использовать магический метод __call вместе с проверкой на наличие экземпляра объекта. Ниже приведен пример, как это можно сделать:
class MyClass {private static $instance;
public static function createInstance() {
if (!self::$instance) {
self::$instance = new MyClass();
}
}
public function __call($name, $arguments) {
self::createInstance();
if (method_exists($this, $name)) {
return call_user_func_array([$this, $name], $arguments);
} else {
throw new Exception("Method {$name} does not exist");
}
}
public function myMethod() {
echo "Method has been called";
}
}
$obj = new MyClass();
$obj->myMethod(); // Результат: "Method has been called"
Таким образом, при вызове любого метода объекта MyClass будет сначала создаваться инстанс с помощью метода createInstance(), а затем вызываться необходимый метод. Таким образом, вам не нужно будет каждый раз вызывать createInstance() в отдельных методах.