• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Eigenschaften in erweiterter static Klasse überschreiben

Gilles

Blogger
Hallihallo.
Habe neulich zum ersten mal ausprobiert Eigenschaften einer erweierten Klasse zu überschrieben, jedoch wird nichts überschrieben. Damit ich euch das vorstellen könnt mal ein beispiel:

PHP:
class Logger {
  private static $logName = "log";
  
  public static function saylog() {
    echo "Log-Pfad ist ".self::$logName;
  }
  
}
PHP:
class Logger2 extends Logger {
  private static $logName = "log2";
}
Wenn ich jetzt Log2::saylog() aufruf dann sagt er mir trotzdem log anstatt log2. Kann mir da einer erklären wieso das so ist und ob mein Vorhaben möglich ist? Danke schon einmal
 
Ich kann kein PHP, aber normalerweise heißt private das der Wert nur in der Klasse sichtbar ist. Du möchtest glaube ich eher eine protected Variabel benutze.
 
Vielen Dank für den Versuch :) Leider funktioniert das auch nicht.

Ich probier nochmal genau zu erklären worum es geht.
Ich habe eine Klasse mit statischen Methoden, die zum Beispiel so aussieht.

PHP:
<?php
class Logger {

  protected static $logName;
  
  private function __construct() {}
    
    public static function getLog() {
      echo self::$logName;
    }
    
}
?>

Logger wird nie alleine benutzt, sondern immer erweitert.
Nehmen wir mal an wir wollen einen logger für die Klasse User

PHP:
<?php

class UserLogger extends Logger {
        protected static $logName = "user";
            
 }

?>

Ich hatte nun erhofft mit Userlogger::getLog() als Ausgabe "user" zu sehen. kann mir jemand sagen, ob das mit statischen Klassen nicht möglich ist oder mir sagen, wie ich es richtig umsetzen könnte?
Als Hinweis. Würde ich in Logger die logName Variable setzen, würde er mir diesen Wert anzeigen. Heisst also ich kann die variable weder im private, protected noch im public "Modus" überschreiben. Hoffe ihr kennt daeine Abhilfe ^^
 
Wie gesagt ich kann kein PHP, aber du muss natürlich auch die Variabel ansprechen die du meinst. In etwa so:

$Logger::logName = "user";
 
Ich glaube nicht, dass sich da in PHP < 5.3 was machen lässt, da kein Late Static Binding unterstützt wird.

Du könntest das Singleton-Pattern erst auf Ebene der abgeleiteten Klasse implementieren:

PHP:
abstract class Logger
{
    protected $_logName;

    public function getLog()
    {
        echo $this->_logName;
    }
}

class UserLogger extends Logger
{
    protected $_logName = "user";

    private static $_instance;

    private function __construct() {}

    public static function getInstance()
    {
        if (!self::$_instance) {
            self::$_instance = new UserLogger();
        }

        return self::$_instance;
    }
}

UserLogger::getInstance()->getLog();

Oder vielleicht mit einer Registry an die Sache herangehen:

PHP:
abstract class Logger
{
    protected $_logName;

    public function getLog()
    {
        echo $this->_logName;
    }
}

class UserLogger extends Logger
{
    protected $_logName = "user";
}

class Registry
{
    protected static $_objects;

    private function __construct() {}

    public static function add($key, $instance)
    {
        self::$_objects[$key] = $instance;
    }

    public static function get($key)
    {
        return (isset(self::$_objects[$key])) ? self::$_objects[$key] : null;
    }
}

Registry::add('UserLogger', new UserLogger());

Registry::get('UserLogger')->getLog();

Singleton/Registry-Patterns sind relativ beliebt (d. h. sie werden in "state-of-the-art" Frameworks wie Zend eingesetzt), ich persönlich bin mehr ein Freund von Dependency Injection.

Darunter verstehe ich etwa Setter/Getter-Methoden statt Singleton-Ansätzen.

PHP:
abstract class Logger
{
    protected $_logName;

    public function getLog()
    {
        echo $this->_logName;
    }
}

class UserLogger extends Logger
{
    protected $_logName = "user";
}

class MyApp
{
    protected $_logger = null;

    public function setLogger(Logger $logger)
    {
        $this->_logger = $logger;
    }
    
    public function getLogger()
    {
        return $this->_logger;
    }

    public function run()
    {
        $this->getLogger()->getLog();
    }

    public static function init()
    {
        $m = new MyApp();
        $m->setLogger(new UserLogger());
        $m->run();
    }
}

MyApp::init();
 
Zurück
Oben