【解惑】namespaceによるロードに関する考え方


1.ネーミングスペースはいったいどんな問題を解決したのか.
PHPは5.3.0でnamespaceキーワードと__を入力しましたNAMESPACE__マジック定数、ネーミングスペースの役割は、重名問題を解決するためです.もちろん、これも唯一の役割です.
2.ネーミングスペースを使用する上で注意すべき点はどこですか?
現在のファイルの下に2つの名前が同じで、ネーミングスペースが異なるクラスを導入します.useネーミングスペースのとき、asが2つの別名を出すことでクラスをインスタンス化するときに区別することができます.しかし、この2つのクラスを導入しなければ、useネーミングスペースだけでは、この2つのクラスはインスタンス化できません.ここで簡単にテストして、すでにネーミングスペースがある場合、クラスファイルを導入するかどうか、クラスファイルを導入していないかどうかを確認することができます.
3.ide(phpstorm)を使用するときは、このクラスを直接ノックし、ideがuseに必要なクラスネーミングスペースを使用して、クラスファイルの導入を完了したようですか?
ポイント:ネーミングスペースはinclude/requireファイルの作業をしていません.フレームワークを使用するのと使用していないのとは異なり、フレームワークは多くのことを完成させるのに役立ちます.あなたが2歩目にいると信じています.phpスクリプトの場合,ネーミングスペースのみを導入するとクラスが見つからないという事実が分かった.so、php自体に戻って、useというクラスがあるかどうかにかかわらず、プロセスがこのクラスを使用する必要があるまで実行されると、phpはそれを見知らぬクラスと見なします.フレームワークがクラスの設計を導入するのに役立たない場合は、not found classを直接エラーします.
4.ネーミングスペースuseはいつ解析されますか?
先に例を示します.
test.php
ame;
require_once("/home/yejianfeng/handcode/test/namespace1.php");
$a = new my
ame\A(); $a-?>Print1();

namespace1.php
namespace my
ame; class A { public function Print1(){ echo 11; } }

require_onceはuseの下でも正常に実行できます.プログラムはnew mynameA()のときにのみネーミングスペースmynameをロードするため、useは宣言に相当します.
5.ネーミングスペースのあるクラス、フレームワークはどのように導入された仕事を実現しますか?
2つの関数があります.Autoload()とspl_autoload_register().
存在しないクラスを参照すると、_Autoload()が呼び出され、クラス名がパラメータとして転送されます(ネーミングスペースを同時に使用すると、ネーミングスペースを含む部分がパラメータとして転送されます).
まずクラスファイルAritst.class.phpがあります.
 

あなたのindex.phpファイルにはグローバル関数があります.簡単に理解できます.
 function __autoload($classname){
     $classpath="./".$classname.'.php';
     if(file_exists($classpath)){
     require_once($classpath);
     }
     else{
      echo 'class file'.$classpath.'not found!';
     }
}


index.phpでのArtistクラスのインスタンス化
$obj = new Artist();
$obj->doThing();

index.phpを実行した後、hello aritstを正常に出力します.index.phpでは、Aritst.class.phpが含まれていないため、Aritstをインスタンス化すると自動的に__が呼び出されます.Autoload関数は、パラメータ$classの値がクラス名Aritstとなり、Aritst.class.phpが導入されます.
__Autoloadには多くの書き方と異なる使い方があり、phpフレームワークに基づいてネーミングスペースのマッピングを追加し、ネーミングスペースに基づいて対応するディレクトリをロードする作業を実現することができます.
またspl_を見てautoload_register()、この関数は__とAutoloadには曲と同じ作業の妙があり、簡単な例を見てみましょう.

function autoRequire( $class ) {
 $file = $class . '.class.php';  
 if (is_file($file)) {  
  require_once($file);  
 } 
} 
 
spl_autoload_register( 'autoRequire' ); 

$obj = new PRINTIT();
$obj->doPrint();
?>

定義されていないクラスにPHPが遭遇するとautoRequire()が実行されることを示します.
6.composer内部のネーミングスペースはどのように維持されていますか?
兄弟、いくつかの現代php符号化スタイルの開発パッケージを導入して、それからあなたのcomposer.jsonファイルを開けて、真剣にそれを読んで、
"autoload": {
        "psr-4": {
            "App\\": "app/"
        }
    },
    

ここでは、ネーミングスペースとディレクトリ構造マッピングの関係を示します.ネーミングスペースをカスタマイズしたい場合は、次のように追加できます.
"autoload": {
    "psr-4": {
        "App\\": "app/",
        "Martistcn\\" : "app/martistcn"
    } 
},

composerコマンドを実行するには、次の手順に従います.
composer dumpautoload

マッピング関係が追加されます.

// vendor/composer/autoload_psr4.php
return array(
    'App\\' => array($baseDir . '/app'),
    / ***** /
    'Martistcn\\' => array($baseDir . '/app/martistcn'),
);    

so,跡地がある.