2012-11-09 75 views
0

我已經創建了自己的MVC框架,並且很好奇其他框架如何將屬性從「控制器」發送到「視圖」。 Zend公司確實沿$this->view->name = 'value';我的代碼行的東西是:PHP重載,單例實例

文件:services_hosting.php

class services_hosting extends controller { 
    function __construct($sMvcName) { 
     parent::__construct($sMvcName); 

     $this->setViewSettings(); 
    } 

    public function setViewSettings() {   
     $p = new property; 
     $p->banner = '/path/to/banners/home.jpg'; 
    } 
} 

文件:Controller.php這樣

class controller { 
    public $sMvcName = "home"; 

    function __construct($sMvcName) { 
     if ($sMvcName) { 
      $this->sMvcName = $sMvcName; 
     } 

     include('path/to/views/view.phtml'); 
    } 

    public function renderContent() { 
     include('path/to/views/'.$this->sMvcName.'.phtml'); 
    } 
} 

文件:property.php

class property { 

    private $data = array(); 
    protected static $_instance = null; 

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

     return self::$_instance; 
    } 

    public function __set($name, $value) { 
     $this->data[$name] = $value; 
    } 

    public function __get($name) { 
     if (array_key_exists($name, $this->data)) { 
      return $this->data[$name]; 
     } 
    } 

    public function __isset($name) { 
     return isset($this->data[$name]); 
    } 

    public function __unset($name) { 
     unset($this->data[$name]); 
    } 

} 

在我的services_hosting.phtml「查看」文件中,我有:

<img src="<?php echo $this->p->banner ?>" /> 

這只是行不通的。我在做一些根本性的錯誤,或者我的邏輯不正確?目前我似乎正在圈圈。任何幫助將非常感激。

+0

你的前端控制器是什麼樣的?我非常喜歡symfony2用響應對象處理這個問題的方式。請參閱http://symfony.com/doc/2.0/book/http_fundamentals.html – shapeshifter

+0

重載和單例通常是一個衝突的概念。考慮放棄單身人士,看看你的問題是否消失。如果您需要該類的單個對象實例,請立即將它們存儲在全局變量或全局數組中。 – hakre

+0

@hakre最初在我的。PHTML我: '$ P =屬性::的getInstance();' 則: ' jamalali81

回答

0

我的前端控制器看起來像這

class front { 

    private $sMvcName = 'home'; 

    function __construct() { 
     $aUriParts = $this->getUriParts(); 

     if ($aUriParts[0]) { 
      $this->sMvcName = implode("_", $aUriParts); 
     } 

     $this->constructController(); 
    } 

    private function constructController() { 
     $this->view = new property(); 
     $sControllerName = $this->sMvcName; 
     new $sControllerName($this->sMvcName); 
    } 

    private function getUriParts() { 
     $sUri = $_SERVER['REQUEST_URI']; 
     $sUri = trim($sUri, "/"); 
     $sUri = str_replace("-", "_", $sUri); 
     $aUriParts = explode("/", $sUri); 
     return $aUriParts; 
    } 

} 

services_hosting.php現在看起來像這樣

class services_hosting extends controller { 

    function __construct($sMvcName) { 
     $this->setViewSettings(); 

     parent::__construct($sMvcName); 
    } 

    public function setViewSettings() { 
     $this->view->banner = '/assets/images/banners/home_02.jpg'; 
    } 

} 
0

你可以檢查它是否有效嗎?

在你Controller.php這樣您在我們的服務託管控制器

class services_hosting extends controller { 
function __construct($sMvcName) { 
    parent::__construct($sMvcName); 

$this->view->banner = '/path/to/banners/home.jpg'; 
} 

}

旗幟變量應該是在你的視圖文件訪問現在創建視圖對象

function __construct() { 
    $this->view = new property(); 
} 

現在。

<img src="<?php echo $this->banner ?>" /> 

希望這將工作...

+0

Thanks @Dinesh。我會在稍後給出一個問題,但是我需要在類的頂部聲明$ view嗎?例如'public $ view = null;' – jamalali81

+0

我不認爲它是必要的。但我認爲它的良好實踐聲明變量。在PHP中,你必須指定null .. public $ view;將工作。 – Dinesh

+0

好吧,你的建議沒有工作,但我終於修好了。在創建services_hosting對象之前,我的前端控制器中的視圖對象,然後在構造父控制器之前設置視圖設置(即controller.php)然後echo $ th .phtml中的 - > view->橫幅 – jamalali81

0
<img src="<?php echo $this->p->banner ?>" /> 

implys你在一個類的實例。你說其外部文件,所以你將有可能沿

$a = new services_hosting(); 

線的東西在這種情況下,而不是

$this->banner; 

你會

$a->banner; 
+0

.phtml文件包含在controller.php中,它是services_hosting.php的父項,它實例化類屬性'$ p = new property;' 我試過了: '$ p = property :: getInstance();' then: ' jamalali81