<?php class Singleton { static $instances = Array(); private function __construct() {} private function __clone() {} private function __wakeup() {} static function model(){ $class = get_called_class(); if (!isset(self::$instances[$class])) { self::$instances[$class] = new $class(); } return self::$instances[$class]; } }
class Test extends Singleton { public function say(){ return 'Hi Habr!'; } } echo Test::model()->say();
<?php if(!function_exists('get_called_class')) { function get_called_class() { $obj = false; $backtrace = debug_backtrace(); foreach($backtrace as $row){ if($row['function'] == 'call_user_func'){ $obj = explode('::', $backtrace[2]['args'][0]); $obj = $obj[0]; break; } } if(!$obj){ $backtrace = $backtrace[1]; $file = file_get_contents($backtrace["file"]); $file = explode("\n", $file); for($line = $backtrace["line"] - 1; $line > 0; $line--) { preg_match("/(?<class>\w+)::(.*)/", trim($file[$line]), $matches); if (isset($matches["class"])){ return $matches["class"]; } } throw new Exception("Could not find"); } return $obj; } } class Singleton { static $instances = Array(); private function __construct() {} private function __clone() {} private function __wakeup() {} static function model(){ $class = get_called_class(); if (!isset(self::$instances[$class])) { self::$instances[$class] = new $class(); } return self::$instances[$class]; } }
$class_name::model();
call_user_func($class_name. '::model');
Source: https://habr.com/ru/post/134221/