1

同じ名前空間にクラスがあるとします。

ディレクトリ:

  • (フォルダ)a

    • a.php
  • (フォルダ)b

    • b.php
    • c.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
4

2 に答える 2

2

オートローダーを定義していません。PHPは、定義しただけで__autoload(または\__autoload-グローバル名前空間で定義された関数)を検索します\b\__autoload(はい、関数は名前空間になります!)

修正方法:__autoload宣言を名前空間の外に移動する

より良い修正:使用する必要がありますspl_autoload_register

于 2012-11-27T23:22:49.117 に答える
0

何が悪いのかを正確に把握するのは困難です。エラーの外観から、__autoload()関数が呼び出されていないように見えます。require_onceもしそうなら、ファイルが見つからないなどのエラーでステートメントが失敗することを期待していました。

関数にいくつかのデバッグステートメントを入れて、変数を含め、何が起こっているかを確認することができます__autoload()var_dump$clsName

自動ロードに関してPHPマニュアルに表示される次のメッセージに注意する価値があるかもしれません:

spl_autoload_register()は、クラスを自動ロードするためのより柔軟な代替手段を提供します。このため、__ autoload()の使用は推奨されておらず、将来的に非推奨または削除される可能性があります。

また、 PSR-0と呼ばれるPHP自動読み込みの「標準」があることにも注意してください。これはそれをよく説明している記事へのリンクです。

上記の記事PSR-0ドキュメントの両方に、使用できるオートローダーの例があります。独自に実装するよりも、これらのいずれかを使用することをお勧めします。

于 2012-11-27T23:01:08.457 に答える