Ben Singleton tasarım kullanarak, ancak sınıf adı olarak bir değişken kullanarak bir nesnenin statik bir işlevi çağırmak gerekir.
En iyi yolu, $class::getInstance();
, PHP 5.3 'te yalnızca, ve ben buldum başka bir şekilde, maksimum yürütme zamanında call_user_func(array($class, 'getInstance'));
, sonuçlar çiğnenmektedir. Herkes bu neden oluyor biliyor, ya da bu geçici bir çözüm / çalışmak için bir yol mu?
Ben bu şeyler yapılması için en iyi yol olmadığını biliyorum, ve Singleton tasarım deseni benim ilk tercihi olmaz, ama ne yazık ki benim kadar değil.
Teşekkür peşin katkıda :) herkese
Ben dahil kod kalanını şunlardır:
abstract class Library
{
protected function __construct(){}
final private function __clone(){}
final public static function &getInstance()
{
static $libs = array();
$lib = get_called_class();
if(!isset($libs[$lib])) $libs[$lib] = new $lib();
return $libs[$lib];
}
}
public function &loadLibrary($lib)
{
// Filter $lib, and load the library class file...
// Following only works in PHP 5.3
// return $lib::getInstance();
// Following results in maximum execution time being breached.
return call_user_func(array($lib, 'getInstance'));
}
}
$someLibrary =& loadLibrary('someLibrary');
someLibrary.php:
class someLibrary extends Library
{
protected function __construct(){}
// Code...
}
O get_called_class()
sadece PHP 5.3 olduğunu ve bu nedenle ben bunu kullanarak olmalıdır söyleyerek bir noktaya değindin, ama genellikle yaptığı gibi ne yazık ki, ben sadece {[dan (Chris Webb sayesinde yolumu şeyler yuvarlak hile Soulmerge (1)]} kodu -! kendi herhangi bir) olmak için çok karmaşık.
if(!function_exists('get_called_class'))
{
class classTools
{
static $i = 0;
static $fl = null;
static function get_called_class()
{
$bt = debug_backtrace();
if(self::$fl == $bt[2]['file'].$bt[2]['line']) self::$i++;
else {
self::$i = 0;
self::$fl = $bt[2]['file'].$bt[2]['line'];}
$lines = file($bt[2]['file']);
preg_match_all('/([a-zA-Z0-9\_]+)::'.$bt[2]['function'].'/', $lines[$bt[2]['line']-1], $matches);
return $matches[1][self::$i];
}
}
function get_called_class()
{
return classTools::get_called_class();
}
}
Yerde bir döngü olmalı gibi, yine bütün kod üzerinde gitmek zorundadır. Silbaştan gitmek: (