2012-01-18 6 views
0

J'ai une classe qui fonctionne comme un wrapper pour Smarty mais que je veux utiliser statiquement à travers mon application.Une classe statique peut-elle étendre une classe non statique et accéder à ses méthodes?

Ma configuration ressemble à ceci:

class Template extends Smarty { 

    public function __constructor() { 

     parent::__constructor(); 
    } 

    public function setSettings() { 

     $this-> some smarty settings here 
    } 

    public static function loadTpl($tpl) { 

     self::$tplFile = $tpl; 

     // other logic 

     self::setSettings(); // this won't get executed because it uses non static method calls. 
    } 
} 

Comment puis-je contourner cela?

+2

Une méthode statique ne peut appeler des méthodes statiques. Il n'y a pas moyen de contourner cela. Quand vous arrivez à 'setSettings', qu'est-ce que vous attendez de' $ this'? Il n'y a pas d'objet associé. –

+2

Pourquoi voulez-vous qu'il soit appelé statiquement? Au lieu de cela, vous pouvez créer un objet Smarty singleton. –

+0

Eli, pourriez-vous s'il vous plaît jeter un oeil: http://stackoverflow.com/questions/12436203/assigning-defaults-for-smarty-using-object-oriented-style –

Répondre

0

Plutôt que d'essayer de l'envelopper à appeler tous statiquement, créer une instance singleton et appeler Template::getInstance() pour le récupérer plutôt que new Smarty():

class Template extends Smarty { 
    public static $instance = NULL; 

    // Private constructor can't be called 
    private function __construct() { 
    parent::__construct(); 
    } 

    // Instead instantiate or return the existing instance 
    public static function getInstance() { 
    return self::$instance ? self::$instance : new self(); 
    } 
} 


// Instantiate as: 
$smarty = Template::getInstance(); 
+0

cette variable $ smarty sera-t-elle accessible statiquement dans les autres classes? – Eli

+0

@ s2xi À l'intérieur d'autres classes, récupérez-le sous la forme '$ smarty = Template :: getInstance()' et vous aurez le même objet, qui est une propriété statique de 'Template'. Donc oui, c'est le même objet statique partout où vous le récupérez, mais vous devez appeler 'getInstance()' plutôt que d'utiliser simplement la même variable '$ smarty'. –

+0

@ s2xi Où que vous appeliez '$ smarty = Template :: getInstance()' vous recevrez la même instance statique ... –

Questions connexes