PHP: Singleton Nesne statik işlev çağrısı için değişken adı kullanın

2 Cevap php

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: (

2 Cevap

Bunu sonsuz bir döngü içine alır ne olduğunu belirleyerek başlamalıdır. Lütfen yapıcı (someLibrary::__construct()), doğrudan / dolaylı olarak, örneğin, Library::getInstance() çağıran herhangi bir kod var mı?

EDIT get_called_class() PHP 5.3 tanıtıldı, bu nedenle kod aslında çalışır eğer, zaten 5.3 çalıştırıyorsanız

Eğer eval() ile bu çözmek için deneyebilirsiniz.

Size bir fikir edinmek için:

$theVar = "relvantClassName";
$someObject = eval($theVar::getInstance());
$result = $someObject->performAction();