PHPクラスの分析を自動的にロードし、名前空間

PHPが使用することです(のrequire_once)を必要とし、(のinclude_once)などがキーワードロードされたクラスファイルを。しかし、実際の開発プロジェクトでは、我々は基本的に負荷クラスにこれらのキーワードを使用するつもりはありません。そうすることになるだろうので、コードのメンテナンスが非常に困難です。実際の開発では、我々は、使用キーワードクラスを使用して、その上にファイルの先頭にこの新しいクラスを指示します。クラスがロードされるかについては、または作曲者は、一般的に達成するためのフレームワークです。

<?php

use Illuminate\Container\Container;

$container = new Container();

自動的にロード

小説サイトhttps://www.198200.com

我々はいくつかのことでできる擬似コード、それがどのように機能するかをインスタンス化クラスのエンジニアリング・クラスが何であるかをシミュレートします

function instance($class)
{
    // 如果类已加载则返回其实例
    if (class_exists($class, false)) {
        return new $class();
    }
    // 查看 autoload 函数是否被用户定义
    if (function_exists('__autoload')) {
        __autoload($class); // 最后一次加载类的机会
    }
    // 再次检查类是否存在
    if (class_exists($class, false)) {
        return new $class();
    } else { // 系统:我实在没辙了
        throw new Exception('Class Not Found');
    }
}

自動的に自分のロジックをロードするために、ユーザーを達成するための言語レベルで提供PHP ** __自動ロード**魔法の方法。ユーザーがに行くと新しいクラスがされていない場合は、時間クラスをロードし、PHPはエラーをスローする前に呼び出されます。** __自動ロードクラスをロードする方法。次の例で __autoload **メソッドは、クラス名の出力をロードするだけで、そのクラスに対応する実際の負荷に行きませんでした、それはエラーがスローされます。

<?php

use Illuminate\Container\Container;

$container = new Container();

function __autoload($class)
{
    /* 具体处理逻辑 */
    echo $class;// 简单的输出要加载类的名称
}

/**
 *
运行结果
Illuminate\Container\Container
Fatal error: Uncaught Error: Class 'Illuminate\Container\Container' not found in D:\project\php\laravel_for_ci_cd\test\ClassLoader.php:5
Stack trace:
#0 {main}
  thrown in D:\project\php\laravel_for_ci_cd\test\ClassLoader.php on line 5
 */

後** __自動ロード**機能の動作を理解する、のは、自動的にシンプルな負荷を実装するためにそれを使用してみましょう。我々は持っているのindex.phpPerson.php二つのファイルと同じディレクトリに。

//index.php
<?php
function __autoload($class)
{
    // 根据类名确定文件名
    $file = './'.$class . '.php';
    if (file_exists($file)) {
        include $file; // 引入PHP文件
    }
}
new Person();

/*---------------------分割线-------------------------------------*/

//Person.php
class Person
{
    // 对象实例化时输出当前类名
    function __construct()
    {
        echo '<h1>' . __CLASS__ . '</h1>';
    }
}

/**运行结果
 * 输出 <h1>Person</h1>
 */

名前空間

どのような名前空間を重要なの新鮮ではない、多くの言語が長い(それが呼ばれるとちょうど同じではありません)この機能をサポートしている、それが解決する問題があり、主にある名前の競合を!ただ、日常生活のように、多くの人が同じ名前、我々はいくつかの識別を通して、その違いを区別する必要があります。たとえば、今、私たちは、という人紹介し、PHPを使用する必要がジョー・スミス彼の中に誰が、金融の仕事を。私たちは、これを記述することができます。

namespace 财务部门;
 
class 张三
{
    function __construct()
    {
        echo '财务部门的张三';
    }
}

これは、ジョー・スミスの基本的な情報であり、名前空間は彼の部門識別され、クラスが彼の名前である。このように、我々は彼がいることを知ることができる財務部門ジョー・スミスのではなく、エンジニアリング部門ジョー・スミス

非修飾名、名前と完全修飾名を定義します

1. 非修飾名は、またはクラスのプレフィックス名が含まれていない、例えば、$コメントが新しいコメントを()=;現在のネームスペースがあればブログ\ Articleこの記事だったそれはコメントが解決されます、\ブログ\ Articleこの記事は、\それがコメントされましたあなたが使用している場合はコメントのコードを(のいずれかの名前空間内のコードが含まれていないグローバル空間)、コメントとして解析されますコメント\

:使用キーワード使用してそこにファイルの先頭であれば使用1 \ 2を\コメント、コメントに解決されます* *ワン\ TWO \コメント**。

2. 修飾名、または名前の接頭辞が含まれ、例えば$コメント=新しい記事\コメント( ); 現在のネームスペースがある場合はブログコメントとして解析されます\ Articleこの記事は、\コメントしたブログ\あなたが使用している場合はコメントのコードを(のいずれかの名前空間内のコードが含まれていないグローバル空間)、コメントとして解析されます\ Articleこの記事は、\コメントしました

3. 完全修飾名、またはグローバルプレフィックス演算子と名前、例えば、$コメント=新しい\条\コメント (); この場合には、そのコメントいつもに分解することが\ Articleこの記事は、コメント\でした

spl_autoload

名前空間を含む場合には自動ロードの種類を達成するために行ってみましょう。私たちはあなたのPHPのバージョン番号がより大きい必要とする、達成するためにspl_autoload_register()関数を使用して5.12関数spl_autoload_register機能はしている関数を渡す(パラメータができる機能コールバック関数名フォームを)SPLの__autoloadので登録機能キュー内、および削除、システムのデフォルト** __自動ロード()**機能。クラスが定義されていない場合spl_autoload_registerコール()関数呼び出しと、システムは(spl_autoload_registerを登録するために呼び出します)自動的に__autoload **()**関数を呼び出すのではなく、すべての機能を機能。

それでは、その名前空間としての用途のOS(クラス名と一致したファイル名の提案)というLinuxクラスを作成してみましょう:

<?php
namespace os; // 命名空间
 
class Linux // 类名
{
    function __construct()
    {
        echo '<h1>' . __CLASS__ . '</h1>';
    }
}

次に、自動的にロードするコールバック関数spl_autoload_registerの方法を使用し、同じディレクトリにあるindex.phpファイルを作成します。

<?php

spl_autoload_register(function ($class) { // class = os\Linux
 
    /* 限定类名路径映射 */
    $class_map = array(
        // 限定类名 => 文件路径
        'os\\Linux' => './Linux.php',
    );
    /* 根据类名确定文件路径 */
    $file = $class_map[$class];
    /* 引入相关文件 */
    if (file_exists($file)) {
        include $file;
    }
});
 
new \os\Linux();

ここでは、保持するために、配列を使用し、クラス名ファイルパスの着信クラスの名前は、オートローダはの導入ということを知っているだろうときよう、関係をどのファイルがクラスをロードします。文書が提出されたら、維持するのは非常に面倒なことになるので、しかし、その後、マッピングアレイは、非常に長くなります。あなたが統一命名規則に従うことができた場合は、オートローダは自動的にクラスファイルが置かれているかを決定するためにパスを解決させることができます。合意されたとして、PSR-4を導入し、次は広く使用されています

PSR-4仕様

PSR-4は、自動的に関連する仕様のクラスに対応したファイルパスにロードされ、次のような構造を持っている完全修飾クラス名の必要性の仕様:

<トップレベルの名前空間>(<サブ名前空間>)* <クラス名>

PSR-4仕様で持っている必要がありますトップレベルの名前空間は、その意義はの表現であり、特別なディレクトリファイルベースのディレクトリ)。副名前空間に対するクラスファイルを表し、ファイルディレクトリグループパス(相対パス)のこのセグメントを、クラス名があるファイル名(ケースの違いに注意)一致しています。

たとえば:完全修飾クラス名\アプリ\ビュー\ニュース\指数、Cの代わりにアプリ場合:\ Baiduは、このクラスのパスはC:\ Baiduの\ビュー\ニュース\ index.phpを私たちがする必要があります。例えば\アプリ\ビュー\ニュース\指数を解析することは、簡単なデモを記述します。

<?php

$class = 'app\view\news\Index';
 
/* 顶级命名空间路径映射 */
$vendor_map = array(
    'app' => 'C:\Baidu',
);
 
/* 解析类名为文件路径 */
$vendor = substr($class, 0, strpos($class, '\\')); // 取出顶级命名空间[app]
$vendor_dir = $vendor_map[$vendor]; // 文件基目录[C:\Baidu]
$rel_path = dirname(substr($class, strlen($vendor))); // 相对路径[/view/news]
$file_name = basename($class) . '.php'; // 文件名[Index.php]
 
/* 输出文件所在路径 */
echo $vendor_dir . $rel_path . DIRECTORY_SEPARATOR . $file_name;

道路のマイクロチャネル公共数-php栽培

オリジナルの記事は、0公表 賞賛1を獲得 ビュー1909

おすすめ

転載: blog.csdn.net/sinat_34560749/article/details/103987431