2014-05-02 20 views
2

讓我首先說我是一名正在學習OOP的中級PHP編程人員。我有一個網站正在運行,但我想打破我的代碼來實現更靈活的設計模式......並且因爲OOP簡直太棒了。自動加載PHP中用戶輸入所需的類

在我的原始代碼中,我使用了switch語句來調用與用戶請求相對應的函數。

$request = (string) $_GET['fruit']; 
switch ($request) { 
    case 'apply': 
     Get_Apple(); 
    default: 
     Error_Not_A_Fruit(); 
     exit; 
} 

這使得它非常不靈活,需要我在多個位置更改代碼以添加用戶可能請求的新選項。

我在考慮將其更改爲Polymorphic類調用。我正在使用作曲家,所以我已經將我的Objects設置爲自動加載PSR-4標準。因此,答案似乎很簡單,如果用戶請求的是「蘋果,」我可以創建

$request = (string) $_GET['fruit']; 
$product = new Product\$request;

但是,如果用戶手動輸入不存在......說什麼「橙」我用什麼方法會用白名單列出用戶的輸入?就像我說的,這是我第一次參與面向對象開發,並且很樂意提供你們使用的設計標準。我正在考慮將塊封裝在塊內,但是它應該怎麼做?

任何建議,將不勝感激:)

乾杯, 德尼羅

更新:我想說得清楚,因爲它可能沒有之前。我正在尋找這樣的方法,以便可以添加新的子類產品對象(實現產品接口)。這樣我就可以添加不同的產品類型,而無需隨時更改代碼。

回答

1

那麼,你總是可以使用class_exist('Product\\Apple')

class_exists需要兩個參數:

  1. 類名稱(完整,命名空間)
  2. 布爾值,是否嘗試和自動加載的類或不。默認值是true。

該函數返回一個布爾值。

所以你寫

$fullClassName = "Product\\$request"; 
if(class_exists($fullClassName)) { 
    $product = new $fullClassName(); 
} 
else { 
    //error here 
} 
+0

感謝您的快速反應。這是一個可以接受的做法嗎?這不會清理任何輸入。如果他們猜測可能有一個名爲「Product \ Apple \ Red」的類,那麼就會運行。我可能並不清楚,我正在尋找一個設計原則,因爲我讀過的書都沒有清楚說明實現。 – Niro

+0

那麼,你通過一個正則表達式來過濾輸入,或者其他東西,以確保它包含一個有效的標識符。 我不確定你想在這裏完成什麼,那麼怎麼會有一個模式?如果你指的是MVC風格的URL可以轉化爲初始化的某些控制器,那麼它與file_exists等文件系統功能有很大關係,而不僅僅依靠自動加載。 – AlexanderMP