2011-10-27 75 views
1

正在爲PHP編寫一小組框架結構(不要與MVC樣式框架混淆),我想驗證我的方法,因爲它看起來很「笨拙」:面向PHP的「框架」OOP工作流程

所有請求都通過重定向指令(apache htaccess)傳遞給引導程序。
引導程序需要所有必需的文件。
然後根據路由調用用戶類(這很好,這裏不包括)
每個用戶模塊擴展核心模塊,然後實例化支持類,如DB和CACHE,從而繼承實例,我不必關心打開/管理連接,或者如果我在這些類中實例化其他類 - 我不必將我的數據庫/緩存作爲參數傳遞。另外,如果我在相同的請求中有大量用戶類方法調用的大量請求 - 我認爲它只會使用core.module的一個實例 - 這應該是件好事。對?對?

但是,配置傳遞似乎是iffy:我恨激情的GLOBALS - 但我不能做一個靜態配置類,因爲我不能把數組(無PHP中的靜態數組)。此外,這打破了所有的IDE intellisenses和開發者都在我:(

是否整個方法意義瘋了嗎?我應該去RTM更多?

謝謝您的誠實的意見,僞碼附後。

//my_config_prod.php 
<?php 
     $CONFIG = array('db' => array(..multi-level array here..), 'cache' => array(...)); 
?> 

//bootstraper.php 
<?php 
     require '../config/my_config_prod.php'; 
     require '../core/core.mysql.php'; 
     require '../core/core.cache.php'; 
     require '../core/core.module.php'; 
     require '../class/class.user.php'; 

     //initialize things: 
     $GLOBALS['DB'] = new CoreMysql($CONFIG['db']); 
     $GLOBALS['CACHE'] = new CoreCache($CONFIG['cache']); 

     //run, this is simplified - route handler is installed here that will 
     //call appropriate module based on the incoming request 

     $user = new User(); 
     $info = $user->load_user(1); 
?> 

//core.module.php 
<?php 
     public function __construct() { 
      global $CACHE; 
      $this->cache = $CACHE; 

      global $DB; 
      $this->db = $DB; 
     } 
?> 

//class.user.php 
<?php 
     class User extends CoreModule{ 

      public function __construct() { 
      parent::__construct(); 
      } 

      public function load_user($id) { 
      return $this->db->get_user($id) 
      } 
     } 
    ?> 
+0

它使用全局變量,所以我想你應該刪除OOP標記。 – Gordon

+0

什麼是__constructor()? –

+0

對不起,用正確的語法更新。它只是構造調用父類的構造函數的用戶類。 –

回答

0

你的全局是一種註冊表模式的。你可以將配置存儲在對象而不是數組中,這將是一個更好的方法。

爲了最好的參考,請看看Zend Framework 2的配置,引導程序和應用程序資源。

0

您可以使用PHPDoc的在許多IDE手動添加智能感知。您可以選擇使用DIC和/或類自動加載磁帶機共享資源考慮的?你不應該包括一切的每一頁請求。

http://php.net/manual/en/language.oop5.autoload.php

http://manual.phpdoc.org/HTMLframesConverter/default/phpDocumentor/tutorial_tags.method.pkg.html

+0

我遠離自動加載的主要原因是因爲APC(或任何操作碼緩存)不適用於spl-autoload或任何條件加載。根據我的經驗,op-cached「everything」的好處大於自動加載流程,僅僅因爲在我的情況下,幾乎所有的模塊都會被加載。 –

+0

@Terry Felkrow http://stackoverflow.com/questions/1941541/php5-frameworks-autoloading-and-opcode-caching - 自動加載不會阻止編譯時綁定。在條件內創建的對象,或根據條件創建不同定義時,會導致編譯時綁定問題。 – dqhendricks

+0

@Terry Felkrow澄清自動加載不會阻止包含類的腳本進行緩存。然而,在許多情況下,實際的對象實例可能不會被緩存,但是這在幾乎所有的應用程序中都有一定程度的預期,並且與自動加載沒有多大關係。這至少是我對這個問題的理解。 – dqhendricks