2017-10-16 105 views
0

我寫了一個自動加載器類。但是include_once函數不包含我需要的文件。變量超出範圍時使用include_once

Cls.php(路徑:CLS /)

<?php 
    class fileup{ 
    function dup($a){ 
     $x=strip_tags($a); 

     $d=__DIR__."/".$x.".cls.php"; 
     echo $d; ///storage/emulated/legacy/htdocs/yeni/sinif/ayar.sinif.php 
     if(file_exists($d)){ 
      include_once $d; 
     }else{ 
     die($a." Class not found :("); 
     } 
    } 
    } 
$dup=new fileup(); 
spl_autoload_register(array($dup,"dup")); 
?> 

Theme.cls.php主題類(路徑:CLS /)

<?php 
    include_once("cls.php"); 
    $dup->dup("conf"); 
?> 

Conf.cls.php站點配置類(路徑:CLS /)

<?php include_once("cls.php"); $dup->dup("db"); ?> 

的index.php(路徑:/)

<?php 
    include_once("theme.cls.php"); 
?> 

錯誤的詳細信息:

Fatal error: Uncaught Error: 
Call to a member function dup() on null in /storage/emulated/legacy/htdocs/yeni/sinif/conf.cls.php:3 
Stack trace: 
#0 /storage/emulated/legacy/htdocs/yeni/sinif/cls.php(12): 
**include_once() #1** 
/storage/emulated/legacy/htdocs/yeni/sinif/theme.cls.php(3): 
dup->dup('conf') #2 
/storage/emulated/legacy/htdocs/yeni/index.php(2): 
include_once('/storage/emulat...') #3 
{main} thrown in /storage/emulated/legacy/htdocs/yeni/sinif/conf.cls.php on line 3 
+1

您沒有使用自動加載,因爲它應該被使用。直接調用自動加載器功能沒有任何意義。你的代碼有更多的問題,但在進入這個之前,你應該花更多的時間研究基礎知識。 – yivi

+0

我明白,但我學習php oop我不明白錯誤,我該如何解決它。你看到錯誤的代碼 –

+1

四周。不會爲你重寫你的代碼。您錯過了對主題的基本理解,以便能夠提出有關此問題的質量問題。基本上,您使用自動加載器是錯誤的,而且您的自動加載器寫得很糟糕(它不應該在找不到時「死掉」,只是返回以便其他自動加載器也可以工作)。 – yivi

回答

0

不打算寫一個答案,但我想這樣你就可以超越這個移動:你的問題不是自動加載機相關,但範圍有關。

首先,您在Conf.cls.php上定義$dup。 然後在Theme.cls.php,你包含這個文件,所以現在定義了$dup

現在你罵$dup->dup('Conf')這將最終包括Conf.cls.php,其中包含此:

include_once("cls.php"); 
$dup->dup("conf"); 

在你打電話include_once("cls.php");第一線,但既然你已經包含這個文件在前面Theme.cls.php,這個時候它不會再包含在內(你畢竟用的是include_once,重點是一旦)。

而且由於您未定義和實例化此類的文件,因此在Conf.cls.php(例如,null)處未定義$dup

所以當你打電話給$dup->dup("db");時,你實際上是在打電話給null->dup("db");,這當然沒有任何意義。

最簡單的「修復」將使用include而不是include_once

除此之外,您的整個自動加載器示例在多種意義上都有點不對。在嘗試寫出自己的作品之前,你應該多學習一些。