2012-08-08 48 views
1

我目前正在用PHP創建我的第一個網站。我不想爲每個單獨的頁面編寫自動加載,而是希望創建一個具有一般自動加載功能的文件。spl_autoload可以放在另一個文件中嗎?

這裏是我的autoloadControl.php

// nullify any existing autoloads 
spl_autoload_register(null,false); 

//specify extensions that may be loaded 
spl_autoload_extensions('.php. .class.php'); 

function regularLoader($className){ 
    $file = $className.'.php'; 
    include $file; 
} 

//register the loader function 
spl_autoload_register('regularLoader'); 

這裏是我的index.php文件:

require("header.php"); 
require("autoloadControl.php"); 

$dbConnection = new dbControl(); 
$row=$dbConnection->getLatestEntry(); 

目前,$dbConnection = new dbControl()給了我以下錯誤:

Fatal error: Class 'dbControl'

所以我的問題是,有沒有辦法使用自動加載這種方式,或者我必須放置它在我寫的使用另一個文件的每個PHP文件的頂部?

+0

你可以將它放在另一個文件中,這是完全可以的,因爲你需要這個文件。唯一重要的是它被執行,這就是你的代碼的情況。但是你有一個配置問題。哪個文件名有'dbControl'類,哪個目錄放置了所有這些文件? – hakre 2012-08-08 16:32:39

+0

你能粘貼完整的錯誤嗎? – Florent 2012-08-08 16:34:45

回答

0

spl_autoload放在外部文件中是有效的,這是使代碼更易於維護的好實踐 - 在一個地方更改可能是10,20或更多。

看來您的dbControl類沒有在您提供的代碼中提供。假設你在引用它之前就已經包含了這個類,並且該類可以正常工作,那麼完成這個任務應該沒有問題。

require("header.php"); 
require("autoloadControl.php"); 
$dbConnection = new dbControl(); // Where is this class located? 

這是一個面向對象的方法爲您autoloadControl.php文件:

<?php 

class Loader 
{  
    public static function registerAutoload() 
    { 
     return spl_autoload_register(array(__CLASS__, 'includeClass')); 
    } 

    public static function unregisterAutoload() 
    { 
     return spl_autoload_unregister(array(__CLASS__, 'includeClass')); 
    } 

    public static function registerExtensions() 
    { 
     return spl_autoload_extensions('.php. .class.php'); 
    } 

    public static function includeClass($class) 
    { 
     require(PATH . '/' . strtr($class, '_\\', '//') . '.php'); 
    } 
} 

?> 
+0

這回答這個問題的第一句話(雖然不是OP有問題)。其餘的似乎是無關緊要的。 – IMSoP 2012-08-08 17:09:51

+0

如果有人遇到這個問題,我想澄清一下我的觀點,即「Loader」類不是OOP(不包括對象,甚至包括繼承/多態性),並且不會爲它所基於的代碼添加任何內容因爲它將每行代碼替換爲單行函數,而單行函數仍然必須在單獨的代碼行中調用。 – IMSoP 2012-08-12 00:46:27

+0

如果你希望更有建設性,那麼就像你推測的那樣發佈一個真實的例子。這個網站是爲了幫助別人爲自己思考,而不是告訴他們這是唯一的方式,但你必須這樣做。 – RobB 2012-08-12 17:18:23

0

你的問題是沒有關係的,你要定義你的回調,但如何。

使用spl_autoload_extensions('.php')將實現與您的自定義回調相同的功能;如果你的回調如此簡單,你不需要兩者。您的評論也是錯誤的 - 調用spl_autoload_register,沒有參數不會清除當前回調,但會註冊默認回調。

但是,在您的代碼中,您錯誤地指定了參數spl_autoload_extensions - 它應該是逗號分隔的擴展列表。所以我覺得你想要的是這樣的:

// Tell default autoloader to look for class_name.php and class_name.class.php 
spl_autoload_extensions('.php,.class.php') 
// Register default autoloader 
spl_autoload_register(); 
// READY! 

的主要區別這將使您的代碼是默認自動裝載機將尋找「dbcontrol.php」(全部小寫),而你將尋找' dbControl.php'(在PHP代碼中提到的情況)。無論哪種方式,你當然不需要兩者。

+0

我想出了這個問題。這是我一直忽略的一個簡單的錯誤。感謝您的幫助。之後我也轉向了OOP風格。的xD – user1243892 2012-08-08 17:42:37

相關問題