/*
請問 php 用自動加載類別的方式
並將數據庫的資料用 PDO::FETCH_CLASS 轉換成 xxx 類別
xxx 類別是放在 classes/xxx.php 內
class xxx{
public $name;
}
在別的網頁執行以下程式碼是沒問題的
*/
function class_loader($class){
require("classes/{$class}.php");
}
spl_autoload_register('class_loader');
$q = "SELECT `name` FROM `xxx`";
$pdo = new PDO( 連線資訊 );
$stmt = $pdo->prepare($q);
$stmt->execute();
$stmt->setFetchMode(PDO::FETCH_CLASS, 'xxx');
while($n = $stmt->fetch()){
echo $n->name.'<br />';
}
/*
但是如果我在 classes/xxx.php 內加上命名空間
namespace my;
class xxx{
public $name;
}
這樣就會錯誤,請問要如何修正呢?
謝謝大家
*/
namespace是為了防止class name衝突而設計的機制,最簡單的實現方式就是在儲存體上分離,也就是用namespace當做路徑,class name當做檔名。
例如auto loader可以改成這樣(這個寫法要php-5.3之後才支援,因為使用了匿名函數):
spl_autoload_register(function($name) {
if(class_exists($name) || interface_exists($name)) {
return;
}
$name = str_replace("\\", '/', $name);
if(file_exists('classes/' . $name . '.php')) {
require 'classes/' . $name . '.php';
}
return;
});
在你的例子中,加上namespace my;之後,配合這個auto loader,就要把class xxx的檔案移到classes/my/xxx.php。
另外,在叫用時,也需要加上namespace,所以setFetchMode的參數應該改成'my\xxx'才對。
說實話,手冊上官方的例子在實作namespace的部份有點弱XD,可以參考一下後面一些使用者分享的例子。