2014-03-05 23 views
1

我懷疑我在這裏遇到的主要問題是我不瞭解究竟是spl_autoload_register()函數發生了什麼。使用namepsace和全局類

基本上我想開始一個新的網站,並試圖用一個更好的系統比我以前使用(以前的系統是沒有階級,沒有結構,沒有任何事情真的)。

我使用的是Linux中寫上。

我的結構是:

+index.php 
-lib (folder) 
    +toolset.inc.php 
    -database (folder) 
     +handler.php (uses PDO) 
    -model 
     +model1.php 
     +model2.php 
     +etc 

等。

我可以在lib結構中使用我從index.php調用的文件toolset.inc.php包含任何這些類文件。但是,當我試圖在handler.php中使用PDO時遇到問題。

toolset.inc.php:

<?php 
namespace lib; 

function load($classNameSpace) { 
    echo $classNameSpace."<br />"; 
    $include_path = __DIR__ . DIRECTORY_SEPARATOR . str_replace("\\", "/", $classNameSpace) . ".php"; 
    if(is_readable($include_path)){ 
     require_once($include_path); 
    } 
} 

spl_autoload_register(__NAMESPACE__ . '\load'); 

?> 

的index.php:

<?php 
require_once("lib/toolset.inc.php"); 

use database\handler; 

$test = new handler(); 
?> 

/lib/database/handler.php(簡體版,在現實中我的連接細節等閱讀):

<?php 
namespace database; 

class handler{ 
    //define some connection stuff 
    (...) 
    function __constructor(){ 
     $attrs[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; 
     $this->connection = new PDO(...); 
    } 
} 

雖然我可以得到處理程序文件將包含在上述toolset.inc.php文件,我不能讓PDOŧ o在裏面工作。我一直在搜索論壇,StackOverflow和教程幾個小時,無法找到我正在尋找的信息。

幾個帖子和網站說,我需要申報PDO作爲絕對使用use \PDO$this->connection = new \PDO(...)然而在這種情況下,這些工作都沒有。

我很茫然,爲什麼,而我幾乎完全相信它,因爲我誤解的東西,或者我失去了一些東西很明顯。誰能解釋爲什麼 PDO不能列入這樣,什麼我需要做的就是它的要求包括哪些內容?

非常感謝

編輯: -錯誤並根據其解決方案的建議我嘗試改變,但一個例子是:

Fatal error: Class 'PDO' not found in /var/www/html/toolset/lib/database/handler.php on line 63 

雖然我知道這樣說,它尋找的文件PDO.phplib文件夾,這是同時在我指定的目錄use \PDO;$test = = new \PDO(...)應當顯然迫使它使用PHP類,而不是一個調用它(lib

+1

1.這個問題無關,與PDO或MySQL。 「我不能讓PDO在裏面工作。」不是適合堆棧溢出的問題。你有沒有收到任何錯誤訊息?如果不是 - 爲什麼?如果是 - 爲什麼你要爲自己保留它們? –

+0

知道我會錯過一些具有工作趕到了。更新的問題。 我之所以有PDO在那裏是因爲我不知道這是否是我嘗試使用PDO與斜線('$測試=新\ PDO(...)')的方式,或者如果它是什麼與spl_autoloader做什麼以及我如何設置。兩者都可能是原因。不知道sql標記來自哪裏。 – Doug

+0

斜線屬於不PDO而是命名空間。沒關係,如果PDO,mysqli的或DateTime類 –

回答

3

錯誤信息對我來說似乎很清楚,而不是關於命名空間。如果PHP在您的database名稱空間中尋找PDO類,則會顯示錯誤消息...

Fatal error: Class 'database\PDO' not found

看來你只是沒有加載PDO擴展。

FYI,一旦你加載PDO擴展,我建議你使用use聲明。否則,你將不得不同時前綴PDO所有使用以反斜槓(包括像PDO::ATTR_ERRMODE常數)...

namespace database; 

use \PDO; 

class handler { ... } 

,如果您所有的文件/目錄名,類名和命名空間是小寫的,可以滴磁帶自動加載機,只需使用下面的...

// toolset.inc.php: 

set_include_path(implode(PATH_SEPARATOR, [ 
    __DIR__, // "lib" 
    get_include_path() 
])); 

spl_autoload_extensions('.php'); 
spl_autoload_register(); 

這將使用的spl_autoload默認實現其C語言編寫,遠遠超過任何PHP執行速度更快。

+0

你是正確的。似乎有人重建服務器,並沒有恢復原來的配置。令人氣憤的是它那麼簡單! – Doug

+0

@Rekarin我已經添加了另一點,可能加快你的自動加載 – Phil

+0

謝謝,我已經添加了它作爲我的第一個'spl_autoload_register()'和我現有的功能第二,允許別人與首都寫它的可能性,或使用第三方來源。再次感謝您的幫助和信息! – Doug