2011-11-05 38 views
2

我是一個PHP新手,我想知道從前面面向ajax文件使用先前定義的類方法的最佳方法。我拖了50個或更多的熱門問題尋找類似的東西,所以我很抱歉,如果這已經問過。從ajax文件訪問以前包含的(必需的)類方法

我的項目是使用前端控制器設置的,該控制器調用initialize.php,然後包含我迄今爲此項目製作的所有類文件,無論現在或不需要那些類方法/屬性(if這是非常糟糕的,然後有人請告訴我一個替代方法:[[)。所以基本上,對於在這個網站上進行的每一個請求,都會調用initialize,所有這些類都被定義,並且兩個立即實例化,這兩個是我用於數據庫和會話/登錄的類。

我已經在我的AJAX的文件在做這個:最近

<?php 
// login.ajax.php 
require_once 'initialize.php'; 

$email = $_POST['email']; 
$password = $_POST['password']; 
$remember = $_POST['remember']; 

global $session; // this is instantiated right away every time 
$login = $session->login($email, $password); 

echo json_encode($login); 
?> 

併發症,現在讓我重新考慮這種做法。不斷地加載初始化看起來真的很浪費,但是包括/只需要必要的類文件在最好的情況下會是一種痛苦。在這個例子中,我需要包含會話,這也需要兩個其他類來執行此登錄。

+0

我更喜歡自動加載作爲建議的答案。然而,我曾在一個非常大的網站上做過我們正在做的事情,並加載了所有內容。但是,我們依靠APC緩存。 http://www.php.net/manual/en/book.apc.php – mqsoh

回答

2

看來你不妨使用PHP自動加載機制。請致電the PHP autoloading documentation。你可以閱讀那裏:

許多開發人員編寫面向對象的應用程序創建一個PHP源文件的每類定義。 最大的問題之一是不得不在每個腳本的開頭(每個班級一個)編寫一個包含的長列表。

在PHP 5中,這不再需要。您可能會在中定義一個__自動加載功能,如果您嘗試使用尚未定義的類/接口,則會自動調用該函數。通過調用這個函數,腳本引擎有最後一次機會在PHP失敗並且出現錯誤之前加載類。

在您的初始化文件(或單獨的一個,這取決於你的設計決策)只是定義__autoload()功能將被用於包括所需的文件:

function __autoload($class_name) { 
    include_once $class_name . '.php'; 
} 

這應該解決的問題/需要多重的要求/包含聲明 - 從現在起,當你實例化某個類並且它不可用時,新定義的函數(__autoload())將被調用以包含必要的文件。

+0

它似乎你說要依靠自動加載我的ajax文件?如果是這樣的話,自動加載是否足夠可靠,並且在成本方面是否合理,僅僅依靠這一點,而不是擔心加載呢? – Justin

+0

是的,它是可靠的 - 它用於多個PHP框架。只要確保它不是太複雜(例如,只需定義可用文件列表,這樣就不需要搜索文件系統來查找它們)。但我認爲最有效的解決方案是在單個文件(被調用的文件)中存儲所有必要的代碼(以及僅**必需的代碼)。但是我相信你可能不需要這樣的東西,只是使用自動加載可能會更好。 – Tadeck

1

作爲一名新手,您對控制器等更高級術語以及如何正確初始化您的應用程序(即引導)有一個體面的把握。

我過去幾年的項目都是基於Symfony框架構建的,它的功能與您所描述的完全相同;控制器確定環境(dev或prod等),然後根據配置文件引導框架。

您的方法和Symfony的方法之間的區別在於Symfony利用了所謂的autoloading。Symfony將解析某些查找類文件的目錄,創建任何找到的類的數組,然後將數組寫入一個平面文件,以便後續請求不會導致再次遍歷目錄的開銷。所以現在,當我在應用程序上工作時,我需要訪問文件,我只需撥打電話,PHP就知道自動加載的位置。

你也可以更進一步,命名空間你的類,不要與PHP Namespacing混淆。我的意思是你將你的類名放在文件系統中的位置上。顯然,你不想包含完整的文件路徑,但是從一個根目錄開始,然後從它開始工作。命名空間也使查找文件變得更容易。與加載類名間距的

例子:

// /home/mpurcell/projects/core/lib/CoreLib/Api/Database.php 
// I told php to use /home/mpurcell/projects/core/lib as my root by adding it to include path, and registered the CoreLib_Api_ with the autoloader 
// So my class would look like this: 

class CoreLib_Api_Database 
{ 
    ... 
}  

// /home/mpurcell/projects/app/myAwesomeApp/makeMoneyMoney.php 

// As long as the autoloader has been initialized, I can make calls without having to require files 
CoreLib_Api_Database::getDbo($dboKey); 

如果你想自動加載能力,而不必框架範圍內使用它,我會建議Zend框架,更具體Zend_Loader_Autoloader

LOL對不起,如果這比你期望的多一點,但你問了一個很好的問題。

相關問題