2017-10-29 30 views
0

問題是自動加載多個文件包括未加載。
直接加載函數而不使用spl_autoload_register()的自動加載是否正確?直接加載函數而不使用自動加載是否正確?

文件:

-class(folder) 
--cls.php (file) 
--db.cls.php(file) 
--config.cls.php(file) 
-index.php(file) 
mp3.cls.php 

文件:cls.php

<?php 
    class dosya 
    { 
    static function yukle($a) 
    {  $d=__DIR__.DIRECTORY_SEPARATOR.str_replace('\\','/',$a).".cls.php"; 
     if(file_exists($d)) 
     { 
     include_once($d);   
     } 
     else{ 
    return self::yukle($a); 

     die($a." sınıfı bulunamadı :("); 
     } 
    } 
    } 
?> 

文件:mp3.cls.php

<?php 
include_once("cls.php"); 
     dosya::yukle("config"); 
     dosya::yukle("db"); 
class mp3 extends db {} 
    ?> 

文件:config.cls.php

<?php 
include_once("cls.php"); 
dosya::yukle("db"); 
    class config extends db {} 
    ?> 

文件:db.cls.php

<?php include_once("cls.php"); 
    class db {} 
    ?> 

的index.php

<?php 
    include_once("mp3.cls.php"); 
$b=new mp3(); 
?> 
+0

最新版本正常工作 –

+0

您的問題可能與命名慣例有關。你的班級被命名爲'dosya',但是存在於'cls.php'裏面,文件名和班級名稱應該匹配。像這樣的'mp3.cls.php'這樣的名字也不符合PSR標準慣例。 (帶額外的'.') – ArtisticPhoenix

+0

唯一的問題未定義的變量$ dosyal 2.error yukle()null。現在可能已經修復:/ –

回答

-2

其實自動加載是使用spl_autoload_register()函數特殊feacture,這是有道理的自動加載的項目的所有在庫一旦使用psr-4/psr-0是非常常見的,並且在php7引入命名空間時也是如此。從哪裏開始,自動加載是必要的。要加載超過7的PHP,我們需要使用require(once)/ include(once),但對於單一語句的龐大代碼的名稱空間。

所以我有一個自動加載的例子here它使用composer.json文件來自動加載,但不需要作曲者以及它比其他更安全。嘗試一下,並與我們分享這個自動加載器是好還是不好。

結論:如果我們想加載總libraray然後自動加載幫助我們,如果我們想只用了不到2-3個文件,那麼建議使用包括/需要

+1

命名空間已經比PHP 7多了很多。 – ArtisticPhoenix

+1

這裏有太多的謊言/觀點,很難選擇哪一個讓我低估這個寶石。 – YvesLeBorg

0

我會忽視的事實,你忽略了命名約定和自動加載器的PSR標準。但有一件事我覺得有必要指出的是這樣的:(這是你確切的代碼,因爲它有一個合理的格式,但代表)

class dosya 
{ 
    static function yukle($a) 
    {  
     $d=__DIR__.DIRECTORY_SEPARATOR.str_replace('\\','/',$a).".cls.php"; 
     if(file_exists($d)){ 
      include_once($d);   
     }else{ 
      return self::yukle($a); //this is recursive, and as you dont modify $a, it's infinate 

      die($a." sınıfı bulunamadı :("); //this code is never executed. 
     } 
    } 
} 

如果你說嘗試加載一個名爲foo類。磁帶自動加載機將挑選,把它弄成這個樣子

$b = '/home/public_html/foo.cls.php' 

這是所有罰款和花花公子,但一旦你如果因爲文件不存在if(file_exists($d)) = false條件失敗。您的條件的其他部分運行return self::yukle($a);,其中您可以簡單地調用自動加載函數yukle($a)。現在,這裏關鍵的一點是你根本沒有改變$a。所以它會重複上面的內容(分配$ b,文件檢查失敗),然後再次調用自己,再次重複。這將會無限發生,或者直到您的應用程序達到PHP的max_execution_time限制。

我強烈建議你避免這樣做。

乾杯!

+0

我明白。刪除'return self :: yukle($ a)'add die(「」)方法。 :)感謝我研究和學習Psr標準版本;/ –

+0

這是我的自動加載器,是一個更大的框架Im的一部分,它允許你註冊多個「根」命名空間路徑對。 https://github.com/ArtisticPhoenix/Evo/blob/master/Evo/Autoloader.php – ArtisticPhoenix

+0

它使用像這樣'AutoLoader :: getInstance() - > regesterPath('',__DIR __)'這將註冊沒有命名空間當前目錄。然後,您可以註冊其他對,例如'AutoLoader :: getInstance() - > regesterPath('Evo',__DIR __)',它將命名空間'Evo'添加到當前目錄。所以如果我運行'New SomeClass()',它會查找'__DIR __。'/ SomeClass.php',如果我執行'new \ Evo \ OtherClass()',它會查找'__DIR __./Evo/ OtherClass.php'。它也正確地將'new Evo_OtherClass()'作爲'__DIR __./ Evo/OtherClass.php'來處理。在這種情況下,我不需要將第2條路徑排除,因爲它會發現它。 – ArtisticPhoenix