2011-12-03 120 views
0

好吧我試圖開始真正學習PHP中的OOP風格。我已經聲明瞭接口和類,並且有實現接口的類。但是我想知道,是不是可以將接口文件加載到PHP腳本文件中,並從接口調用方法而不是加載類實現文件?如果是這樣,那麼如何做到這一點我找不到答案。謝謝!調用PHP接口方法

回答

5

接口可能沒有實現,所以你不能這樣做。他們的目的是規定「合同」(即「實現這個接口的類承諾提供公共方法X Y和Z」),這些類(實現接口)必須遵守。

這實際上是非常基本的面向對象的東西,它不適用於PHP。我建議在嘗試進一步研究之前,先研究一些更多的面向對象的理論。

+0

謝謝!是的,我從書中讀了一些東西后感到困惑,並認爲這就是告訴我要做的事。大聲笑我很習慣程序化的做事方式。 – vol4life27

2

您無法在接口上調用方法。一個接口不能實例化。您必須創建一個實現該接口並使用該類的類。

0

提供了INTERFACE,因此您可以描述一組函數,然後隱藏這些函數在實現類中的最終實現。這使您可以更改這些功能的實現,而無需更改使用方法。

例如:我有一個數據庫。我想編寫一個訪問數據庫中的數據的類。我定義了這樣一個接口:

interface Database { 
function listOrders(); 
function addOrder(); 
function removeOrder(); 
... 
} 

那麼我們假設我們開始使用MySQL數據庫。所以我們寫一個類來訪問MySQL數據庫:

class MySqlDatabase implements Database { 
function listOrders() {... 
} 

我們根據需要編寫這些方法來獲取MySQL數據庫表。然後,你可以寫你的控制器使用接口,例如:

$database = new MySqlDatabase(); 
foreach ($database->listOrders() as $order) { 

然後讓我們說,我們決定遷移到Oracle數據庫。我們可以編寫另一個類來獲取到Oracle數據庫這樣的:

class OracleDatabase implements Database { 
public function listOrders() {... 
} 

然後 - 切換我們的應用程序使用Oracle數據庫,而不是MySQL數據庫中,我們只需要修改一行代碼:

$database = new OracleDatabase(); 

的代碼的所有其它線路,如:

foreach ($database->listOrders() as $order) { 

將保持不變。關鍵是 - INTERFACE描述了我們訪問數據庫所需的方法。它不會以任何方式描述我們如何實現這一目標。這就是IMPLEMENTing類所做的。我們可以根據需要以儘可能多的方式多次執行此界面。然後,我們可以在不影響我們的代碼的情況下在接口的實現之間切換,因爲接口定義了我們將如何使用它,而不管它實際上如何工作。