簡體   English   中英

自動加載和命名空間

[英]autoload and namespace

假設我在相同的命名空間中有類:

目錄 :

  • (文件夾)一個

    • 一個.php
  • (文件夾) b

    • b.php
    • php

我們使用命名空間和__autoload如您所見:在文件夾b\\b.php

<?php          
namespace b;
use b as x;

function __autoload($clsName){
  $clsName='../'.str_replace('\\', '/', $clsName).'.php';
  require_once $clsName;
}
class b{
  function __construct(){
    print("b file<hr/>");
  }
}
$t=new x\c(); // line 13 
?>

並在文件夾b\\c.php

<?php
namespace b;

class c{
    function __construct(){
        print("c file<hr/>");
    }
}
?>

當我們定義$t=new x\\c__autoload不會調用! 請幫我 :(

錯誤信息:

Fatal error: Class 'b\c' not found in C:\xampp\htdocs\project\TEST\b\b.php on line 13

您尚未定義自動加載器。 PHP 查找__autoload (或\\__autoload - 在全局命名空間中定義的函數),而您只定義了\\b\\__autoload (是的,函數被命名為!)

如何修復:將__autoload聲明移到命名空間之外

更好的修復:您應該使用spl_autoload_register

很難看出到底出了什么問題。 從錯誤的外觀來看,似乎沒有調用__autoload()函數。 如果是這樣,我希望require_once語句失敗,並出現錯誤,提示未找到文件,或類似的錯誤。

您可以嘗試在__autoload()函數中放入一些調試語句來查看發生了什么,包括$clsName變量的var_dump

可能值得注意的是PHP 手冊中出現的有關自動加載的以下消息:

spl_autoload_register()為自動加載類提供了更靈活的替代方法。 出於這個原因,不鼓勵使用__autoload()並且將來可能會被棄用或刪除。

您還應該注意,PHP 自動加載有一個“標准”,稱為PSR-0 這是一篇文章鏈接,該文章對其進行了很好的解釋。

在上面提到的文章PSR-0 文檔中,都有您可以使用的示例自動加載器。 我建議使用其中之一而不是嘗試實現自己的。

暫無
暫無

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

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