рдХрд╛рд░реНрдп
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдереА рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдкрд░, PHP рд╕рдВрд╕реНрдХрд░рдг 5.2 рдерд╛, рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реНрд╡рдпрдВ 5.3 рдХреЗ рдиреАрдЪреЗ рд▓рд┐рдЦреА рдЧрдИ рдереАред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣рд░ рдХреЛрдИ рдЬреЛ PHP рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╕рдВрд╕реНрдХрд░рдг 5.3 рдореЗрдВ рджреЗрд░ рд╕реЗ рд╕реНрдерд┐рд░ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рд╡рд░реНрдЧ рдирд╛рдо рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
<?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();
рд╕рдВрд╕реНрдХрд░рдг 5.3 рдореЗрдВ рдирдП
get_called_class рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╛рд░рдг рдпрд╣ рддрдХрдиреАрдХ рд╕рдВрднрд╡ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдХреЛрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ PHP рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ?
рдирд┐рд░реНрдгрдп
рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХреЛ рдмрджрд▓рдирд╛ рдпрд╛ PHP :) рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реНрдерд┐рддрд┐ рдереА рдХрд┐ рдЕрдм рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИ, рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ рдкрдбрд╝рд╛ред
<?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');
рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред