Скорее всего вопрос глупый и его решение либо отсутствует в принципе, либо его решение уже давно используется везде где только можно. Сам класс: Код (Text): class adapter { protected static $instance = null; private function __construct() {} private function __clone() {} private function __wakeup() {} public static function self() { return is_null(self::$instance) ? self::$instance = new self : self::$instance; } private $var; public static function put($var) { self::self()->var = $var; } public static function retrieve() { return self::self()->var; } } Использование объекта: Код (Text): adapter::self()->put('I have something to hide!!!'); echo adapter::self()->retrieve(); Упростить до: Код (Text): adapter::put('I have something to hide!!!'); echo adapter::retrieve(); Хотя бы посмотреть варианты решения.
Суть вопроса не в методах put и retrieve, а в реализации одиночки без перманентного обращения к методу получения экземпляра. Я пытался искать с использованием __callStatic, но ничего подобного не нашёл.
Ну тогда вы правильно смотрели в сторону __callStatic Код (PHP): <?php class SugarAdapter { static $obj; public function setInstance($object){ self::$obj = $object; } public function getInstance(){ if (empty(self::$obj)){ throw new Exception('Object was not instance'); } return self::$obj; } public static function __callStatic($method, $params){ return call_user_func_array(array(self::getInstance(),$method), $params); } } class A { public function foo(){ var_dump($this); } } SugarAdapter::setInstance( new A() ); SugarAdapter::foo();
Не знаю откуда код, но setInstance и getInstance наверное лучше было объявлять статичными. Отличный пример.