2012-01-18 2 views
0

У меня есть класс, который действует как обертка для Smarty, но хочет использовать его статически в моем приложении.Может ли статический класс расширить нестатический класс и получить доступ к его методам?

Моя установка выглядит примерно так:

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. 
    } 
} 

Как я могу обойти это?

+2

Статический метод можно вызывать только статические методы. Там не обойти это. Когда вы переходите к 'setSettings', что вы ожидаете от' $ this'? Нет связанного объекта. –

+2

Почему вы хотите, чтобы это называлось статически? Вместо этого вы можете создать объект Singley Smarty. –

+0

Eli, не могли бы вы взглянуть: http://stackoverflow.com/questions/12436203/assigning-defaults-for-smarty-using-object-oriented-style –

ответ

0

Вместо того, чтобы попытаться обернуть его назвать все статически, создать одноэлементный экземпляр и вызвать Template::getInstance() для его получения, а не 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

будет ли эта переменная $ smarty быть доступной в других классах статически? – Eli

+0

@ s2xi В других классах вы получите его как '$ smarty = Template :: getInstance()', и у вас будет тот же объект, который является статическим свойством 'Template'. Так что да, это тот же статический объект, где вы его извлекаете, но вы должны называть 'getInstance()', а не просто использовать одну и ту же переменную '$ smarty'. –

+0

@ s2xi Где бы вы ни называли '$ smarty = Template :: getInstance()' вы получите тот же статический экземпляр ... –

Смежные вопросы