1

これは、単一のファイルにPHP名前空間/自動ロードを使用した実験です。

namespace trust;

class trust_network{        
    public function __construct(){      
        print "SUP";
    }
}

namespace trust2;

$trust = new \trust\trust_network(); $do = new \test();

function __autoload($class){
    require($class.".php");     
    print $class;
}

したがって、名前空間trust2の下で、「\ test」を呼び出しています。つまり、グローバルベースの外部ファイルからそのクラスを自動ロードしたいと思います。私が書いたものは機能しません。名前空間の下に__autoloadがあることは知っていますが、グローバルベースでそれを宣言するにはどうすればよいですか?名前空間宣言の前に含めることはできません。

4

2 に答える 2

3

1つのファイルに複数の名前空間がある場合は、中括弧構文を使用する必要があります。

namespace n1 {
...
}
namespace n2 {
...
}
namespace {
...
}

最後のブロックでは、グローバル名前空間で関数を宣言できます。参照:http ://www.php.net/manual/en/language.namespaces.definitionmultiple.php

于 2013-02-21T18:32:38.667 に答える
2

自動ロードは通常、ファイルごとに1つのクラスを配置できるようにするためのものです。したがって、次のレイアウトが必要です

/index.php

function __autoload($class){
    // You may need to convert backslashes in $class to forward slashes 
    // and strip the first slash, we'll leave the
    require($class.".php");
    // debug-only:  print $class;
}
// Calling new here triggers __autoload to be called
$trust = new \trust\trust_network();
$do = new \test();

/trust/trust_network.php

namespace trust;

class trust_network{        
    public function __construct(){      
        print "TRUST_NETWORK";
    }
}

/test.php

class test() {
    public function __construct(){      
        print "TEST";
    }
}

複数のシステムが独自の自動ロード動作にフックできるため、代わりにspl_autoload_registerを使用する必要があることに注意してください。PHP 5.3以降、次のことができます。

spl_autoload_register(function ($class) {
    require($class.".php");
});
于 2013-02-21T18:36:35.260 に答える