PHP自動アドインと名前空間の応用のまとめ


まず、名前空間とは何かを教えてください。
「名前空間とは?広義的には、名前空間は物事をパッケージ化する方法である。多くのところでこのような抽象概念が見られます。例えば、オペレーティングシステムでは、関連ファイルをグループ化するためのディレクトリが用いられ、ディレクトリ内のファイルにとっては、名前空間の役割を果たしている。具体的に例を挙げると、ファイルfoo.txtは同時にディレクトリ/home/gregと/home/otherの中に存在することができますが、同じディレクトリの中にfoo.txtファイルが2つ存在してはいけません。また、ディレクトリ/home/gregの外でfoo.txtファイルを訪問する場合、私たちはディレクトリ名とディレクトリの区切りをファイル名の前に置いて/home/greg/foo.txtを取得しなければなりません。この原理をプログラム設計の分野に応用するのが名前空間の概念です。」
PHPの自動ローディングとは、私達が実用化クラスをロードする時に、手動でrequireを書いてこのclass.phpファイルを導入する必要がないので、プログラムは自動的にローディングして導入してくれます。名前空間規範に合わせて、複雑なシステムの中で、同じ種類のロードと呼び出しの問題を簡単に処理できます。
1.自動ローディングの原理と_u u uautloadの使用
自動ローディングの原理は、私達が実際にクラスを作った時、PHPがこのクラスを見つけられないと、自動的に本ファイルの中の___u uを呼び出します。atoload($class_)name)メソッドは、私たちnewのこのクラスです。nameはこの方法のパラメータになります。だから私たちはこの方法でnew classを必要とします。nameの各種判断と分割は、requireに対応する経路類ファイルを自動的にロードすることを実現します。
まず私たちが見に来ます。atoload()の自動呼び出しで、栗を挙げます。
index.php

<?php 
$db = new Db();
もし私達がマニュアルでDb類を導入しないと、プログラムがエラーになるかもしれません。このクラスが見つけられないと言います。
Fatal error:Uncaght Error:Class'DB'not found in D:\web\hellowba\demo\2017\autload\index.php:2 Stoctrace:倈0{man}thrown n n n n n n n n n n n n n D:\web\hellowowba\demo 2017\atoot\atotal\atotal\n\n\n\n\n\n\n\n\n\n\n\n\2.atotal
じゃ、私達は今チウに加入します。autload()この方法をもう一度見てください。

$db = new DB();
function __autoload($className) {
 echo $className;
 exit();
}
上の自動ローディング機構の説明によれば、Db、つまりnewのクラス名が必要です。だから、この時には私達は_u_u uにいることができます。autload()方法では、必要に応じてライブラリファイルをロードしました。
2.spl_autload_register自動ローディング
小さい種目なら、_u uを使います。atoload()は基本的な自動ローディングが可能です。ただし、プロジェクトが大きい場合、または異なる自動ロードが必要となります。autloadは杯具についてです。一つのプロジェクトの中で一つしか許されていません。atoload()関数は、PHPが関数の名前を書き換えることができなくなりました。つまり、2つの_u_を宣言することができません。autload()関数ファイルは、そうでなければ致命的なエラーを報告します。どうすればいいですか?心配しないでください。PHP大神はとっくに思い付きました。だからspl_autload_レジスターのようにもう一つの牛強制関数が誕生し、代わりにそれが生まれた。それは実行効率が高く、より柔軟です。
まず、どのように使うかを見てください。index.phpに下記のコードを入れます。

<?php 
spl_autoload_register(function($className){
 if (is_file('./Lib/' . $className . '.php')) {
 require './Lib/' . $className . '.php';
 }
});
$db = new Db();
$db::test();
Lib\Db.phpファイルに以下のコードを追加します。

<?php 
class Db
{
 public static function test()
 {
 echo 'Test';
 }
}
index.phpを実行後、new Db()を呼び出した場合、spl_autload_registerは自動的にlib/ディレクトリの下で対応するDb.phpファイルを検索します。成功後に実行できます。同じように、Lib\ディレクトリの下に複数のphpファイルがあれば、require複数のファイルを使用することなく、index.phpで直接呼び出すことができます。
つまり、spl_autload_registerは何度も繰り返して使うことができるので、この点はまさに解決しました。autloadのショートボードは、一つのページに複数のspl_があります。autload_レジスターは、実行順序は登録順で、一つずつ下に探して、見つけたら停止します。
3.spl_autload_register自動ローディングとnamespaceの名前空間
非常に複雑なシステムについては、そのディレクトリ構造も非常に複雑であり、規範的な名前空間は複雑な経路における大量のファイル、関数、クラスの名前の問題を解決している。自動ローディングは現在PHPの現代フレームの基礎となり、基本的にはspl_です。autload_registerは自動ローディングを実現します。だからspl_autload_register+namespaceが主流になりました。
PSRシリーズの仕様によって、namespaceの名前は非常に正規化されていますので、namespaceによって詳細なパスが見つかります。
最も簡単な例を用いて,複雑なシステムがどのように自動的にクラスファイルをロードするかを説明した。
まず、システムディレクトリ構造を準備します。

----/Lib  //    
 --Db.php
 --Say.php
----autoload.php //       
----index.php //   
以上は基本的なシステムディレクトリです。名前空間と自動ローディングを使って、直接トップページのindex.phpでLibディレクトリの下の複数のクラスを呼び出します。
二つの列のファイルを用意します。
Db.php

<?php 
namespace Lib;
class Db
{
 public function __construct()
 {
 //echo 'Hello Db';
 }
 public static function test()
 {
 echo 'Test';
 }
}
Say.php
<?php
namespace Lib;
class Say 
{
 public function __construct()
 {
 //echo 'Hello';
 }
 public function hello()
 {
 echo 'say hello';
 }
}
上記の2つの一般的なクラスのファイルに名前空間を追加しました。このクラスのファイルはLib\ディレクトリの名前の下にあるということです。もちろん、違う名前を取って、あなたのプロジェクト名を表してもいいです。
これからautload.phpを見に来ます。

<?php 
spl_autoload_register(function ($class) {
 $prefix = 'Lib\\';
 $base_dir = __DIR__ . '/Lib/';
 // does the class use the namespace prefix?
 $len = strlen($prefix);
 if (strncmp($prefix, $class, $len) !== 0) {
 // no, move to the next registered autoloader
 return;
 }
 $relative_class = substr($class, $len);
 //   Linux   。Windows  (/   \)    
 $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
 if (file_exists($file)) {
 require $file;
 }
});
以上のコードは関数spl_を使用します。autload_register()はまず名前空間を使っているかどうかを判断し、呼び出したいクラスのファイルが存在するかを検証し、存在すればrequireファイルになります。
はい、今トップページのindex.phpでこのように呼びます。

<?php 
use Lib\Db;
use Lib\Say;
require './autoload.php';
$db = new Db();
$db::test();
$say = new Say;
$say->hello();
私たちはrequireを使用してautload.phpをロードして、useキーワードを使ってクラスファイルのパスを絶対パスに変えました。もちろんあなたもクラスを呼び出す時にパスを全部書いてもいいです。しかし、複数のクラスがお互いに呼出しをする時は困りますので、やはりファイルの先頭にアメリカを使って経路を処理します。
次にLib/ディレクトリの各種ファイルを直接呼び出します。Lib/ディレクトリの下に複数のファイルを置いて試してみてください。
index.phpを実行してみます。ご希望の通りですか?
結尾語
この文章は簡単に紹介されています。自動ローディングと名前空間の使用について、実際の開発では、autloadの自動ローディングの問題に注目することはめったにありません。開発者は業務コードに注目するだけで、標準的な名前空間を使えばいいです。もちろん、自分でプロジェクトを開発したいなら、大型フレームに依存しないで、あるいは自分でphpフレームを開発したいなら、autloadが自動的にこれをロードするのを熟知しなければなりません。
現代phpでは、Compser方式で実装されているコンポーネントは、autloadによって自動的にロードされるので、やはり「怠惰」という言葉が素晴らしい開発効率をもたらしてくれます。
締め括りをつける
以上は小编がご绍介したPHP自动的にautloadと名前空间のアプリケーションをロードしました。皆さんに助けてほしいです。もし何か疑问があれば、メッセージをください。小编はすぐにご返事します。ここでも私たちのサイトを応援してくれてありがとうございます。