[英]spl_autoload_register not working in included files
我正在使用spl_autoload_register
來加載類。
我有一個index.php
文件,其中包含一個init.php
文件。 在init.php
文件中調用spl_autoload_register
函數。
在index.php
文件中,它可以正常工作:我可以創建類和東西,他們的名字被解析。
但是后來,在index.php
,我包含了另一個文件, work.php
來做一些特定的任務。
奇怪的是,在work.php
,找不到我正在使用的類。
如果我所說的spl_autoload_register
中再次work.php
,類就可以得到解決。
真正奇怪的是,這種行為並不一致:在我的測試服務器上,我不必復制spl_autoload_register
調用,但在我的生產服務器上,這是強制性的。
我錯過了php.ini
一些選項嗎?
編輯/更新:以下是init.php
文件中的內容,以防萬一:
<?php
function my_autoload($class){
include 'class/' . $class . '.class.php';
}
spl_autoload_register('my_autoload');
?>
而我的index.php:
<?php
require_once 'include/init.php';
$barcode = new Barcode();
// here is a bunch of test and stuff
include 'work.php';
?>
而我的work.php:
<?php
$myObj = new Barcode();
// more useles stuff
?>
條形碼在index.php代碼部分中完美地創建,但在work.php部分失敗了...
嗯,實際上,我是個笨蛋。 問題不在於包含路徑等,而是使用apache配置:MultiViews。
我的網站有一個訪問點:index.php。 我使用url重寫重定向它上面的所有內容。 但是由於多視圖選項,如果網址與文件同名,則網址重寫無法正常工作。
我的目錄包含index.php和work.php。
我重寫的腳本是這樣的:如果你點擊www.mywebsite.com/work,你可以使用param url = work繼續index.php。 index.php初始化所有內容,然后包含work.php
但是感謝MultiViews選項,如果我點擊www.mywebsite.com/work,它會搜索文件,找到work.php,然后直接調用它。 含義:沒有init,意思是:沒有spl_autoload_register。
謝謝你的回答,對不起。
如果include_path
設置包含本地目錄,請檢查它。
通常,使用相對路徑不是一個好主意。 創建一個相對於init.php文件的絕對路徑很容易,如下所示:
function my_autoload($class){
include __DIR__.'/class/' . $class . '.class.php';
}
此代碼假定您的init.php文件與“class”文件夾位於同一文件夾中。
此外,不是可能通過盲目地包含給定路徑中可能存在或可能不存在的文件來創建錯誤,而是在包含它之前檢查文件是否存在:
function my_autoload($class){
$file = __DIR__.'/class/' . $class . '.class.php';
if(file_exists($file)) {
include $file;
}
}
請注意, __DIR__
是PHP 5.3的功能,在PHP 5.2的主機上不可用。 你可以用dirname(__FILE__)
替換它dirname(__FILE__)
此外,請注意在Linux上以大小寫敏感的方式搜索文件,在大多數Mac OS X安裝中,整個文件都是不區分大小寫的。 如果您實例化類MyClass
Linux將查找MyClass.class.php
而Mac OS X也將加載該類,如果它在名為myclass.class.php
, Myclass.class.php
等的文件中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.