2012-09-28 64 views
1

對於某些人來說,這個問題可能很明顯,但我剛開始用Web應用程序(特別是PHP)開始抓住多層體系結構的表面。我有一個包含多個對象的庫,它正在迅速擴展。我總是試圖從可重用性的角度思考問題,並將我的項目分解爲小的,可重用的和鬆散耦合的組件,這樣我不僅創建項目,而且還爲未來的項目創建部件。我試圖設計一種包管理系統,這樣我就可以停止在包含對象中使用絕對路徑。我想有一個文件包含我的庫中的每個類文件。隨着包含,我想添加一個「單身」模式的類,將允許我抓住庫中的每個對象的實例按需。我打算爲每個對象創建一個靜態獲取器,以返回對新實例的引用。基本上,這樣的事情...PHP OOP架構問題

include('classa.php'); 
include('classb.php'); 
include('classc.php'); 
class pacman{ 
    private static $instance_stack; 
    public static function GetPackage($strPackage){ 
     if(!self::$instance_stack){ 
      self::$instance_stack['classa']=new ClassA(); 
      self::$instance_stack['classb']=new ClassB(); 
      self::$instance_stack['classc']=new ClassC(); 
     } 
     if(array_key_exists(strtolower($strPackage),self::$instance_stack)){ 
      return self::$instance_stack[strtolower($strPackage)]; 
     } 
     else{ 
      return false; 
     } 
    } 

} 

然後,如果我想獲得一流的...

include('pacman.php'); 
$ClassA = pacman::GetPackage('classa'); 

我意識到這是一個非常基本的實現。我的例子只涵蓋了最低限度。我的問題是沒有實現這一點;相反,這是一個問題,從包含的數百個未被證實的類是否會對性能產生顯着影響。如果是這樣,是否有人知道解決方法?我無法告訴你,要追蹤數百個按內容排序成董事的班級的相對路徑是多麼困難。

+0

[在尤達的聲音]在你可以重用之前,你必須先使用。關注未來項目對目前項目線索失敗的需求。 – cleong

+0

沒有先入爲主。爲什麼我會花2個小時創建一個項目特定的組件,當我可以採取2:30並創建一個通用的可重用組件。長期而短暫,它更有意義。我寧願在500個具有多態性的地方使用單個泛型函數,而不是通過代碼庫分散500個變體。你想談談噩夢 –

回答

2

你應該嘗試自動加載它們:

<?php 
function __autoload($class_name) { 
    include $class_name . '.php'; 
} 

$obj = new ClassA(); 
$obj2 = new ClassB(); 
?> 

這種「按需」加載類,減少開銷,需要有所有文件包括的前期。更多的信息在這裏:http://php.net/autoload

+0

謝謝!對此,我真的非常感激 –

0

回答你的表現問題是 - 沒關係。除非你有Facebook2,Yahoo2或者Googl2,否則你不會注意到任何區別。

我個人不鼓勵你廣泛使用單身。這是一個全球化的名字。使您的代碼難以長期使用。

如果您對可重複使用的軟件包/庫感興趣,請參閱Phar

如果您在任何地方需要靜態吸氣器,請檢查最新的5.4.x功能traits。它將幫助您避免代碼重複。

最後,不要使用require作爲你的類。使用autoload

+0

榮譽的幫助。通過自動加載,全球範圍內的類是否可用? –