2017-06-02 14 views
0

Ich versuche initialize() Methode für jede Klasse auszuführen, die von einer Basisklasse erweitert, unter Verwendung late static bindings:für jedes Kind Klasse

class BaseClass 
{ 
    protected static $initialized = false; 

    public static function find() 
    { 
     static::initialize(); 
     //TODO search entries and return as instances... 
    } 

    protected static function initialize() 
    { 
     if (static::$initialized) 
      return; 

     echo 'Initializing ', static::class, '<br/>'; 
     //do important stuff 
     static::$initialized = true; 
    } 
} 

class Child1 extends BaseClass {} 
class Child2 extends BaseClass {} 

$initialized Eigenschaft wird über die Verlängerung Klassen geteilt.

Child1::find(); //Outputs 'Initializing Child1', as expected 
Child2::find(); //Doesn't execute 'initialize()' because 
       //$initialized property was set to true by Child1 
       //Expected: 'Initializing Child2' 

Gibt es einen einfachen Weg, um es zu erreichen?

+0

Änderung '$ initialized' auf ein Array, in dem Sie initialisierten Klassen hinzufügen und überprüfen Sie die Existenz von die (Child-) Klasse mit 'in_array()' – dognose

Antwort

0

Sie können $ auf ein Array initialisiert ändern (wie in Kommentar vorgeschlagen) mit dem Klassennamen als Schlüssel:

class BaseClass 
{ 
    protected static $initialized = []; 

    public static function find() 
    { 
     return static::initialize(); 
    } 

    protected static function initialize() 
    { 
     $class_name = static::class; 
     if (!empty(static::$initialized[$class_name])) { 
      return static::$initialized[$class_name]; 
     } 

     echo 'Initializing ', $class_name, '<br/>'; 
     //do important stuff 
     static::$initialized[$class_name] = new static(); 
     // do another important stuff and return instance 
     return static::$initialized[$class_name]; 
    } 
} 

class Child1 extends BaseClass {} 
class Child2 extends BaseClass {} 
Verwandte Themen