簡體   English   中英

spl_autoload_register無法在包含的文件中工作

[英]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.phpMyclass.class.php等的文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM