ホームページ  >  記事  >  バックエンド開発  >  Phalcon が自動的にロードされる (PHP が自動的にロードされる)、Phalcon がロードする php_PHP チュートリアル

Phalcon が自動的にロードされる (PHP が自動的にロードされる)、Phalcon がロードする php_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-12 09:00:36897ブラウズ

Phalcon が自動的にロード (PHP が自動的にロード)、Phalcon が php をロード

自動的にロード (palconLoader)

転載の際は出典を明記してください

1.PHPファイルの紹介

include() または require() 関数を通じて、PHP プログラムが実行される前にファイルの内容をファイルに挿入できます。

リーリー

* ファイルが存在しないか名前が変更された後はスクリプトの実行が続行されないため、include() の代わりに require() を使用することをお勧めします。

2. PHPクラスの自動読み込み

参考記事:PHPマニュアルとPHPのクラス自動読み込みの仕組み

PHP5 より前では、各 PHP フレームワーク実装クラスのロードには、一般に、合意された条件を満たすファイル クラスや関数を自動的にロードするために、一定の合意に従って トラバース ディレクトリ が必要でした。したがって、php5 より前のクラスの使用は現在ほど頻繁ではありませんでした。

php5以降、phpクラスをロードする際、クラスが配置されているフォルダーが含まれていなかったり、クラス名が間違っていたりすると、Zendエンジンは自動的に__autoload関数を呼び出します。 __autoload 関数はユーザーが実装する必要があります。

バージョンphp5.1.2以降ではspl_autoload_register関数を使用して読み込み処理関数をカスタマイズすることができます。この関数が呼び出されない場合、spl のカスタム spl_autoload 関数がデフォルトで使用されます。

1. PHP 自動読み込み __autoload

リーリー

実際、__autoload は少なくとも 3 つのこと (「 3 つのステップ」) を行う必要があることがわかります。

最初と 2 番目のステップでは、クラス名とファイルの

マッピング方法について合意する必要があります。この方法でのみ、クラス名に基づいて対応するファイルを見つけてロードを実装できます。

したがって、__autoload 自動ロードで最も重要なことは、

クラス名とそれが配置されているファイルの対応を指定することです。含める必要のあるクラスが多数ある場合は、対応するルールを確立し、クラス名を対応するファイルにマッピングして、遅延読み込みを実現するだけです。 リーリー

2. PHP 自動ロード spl_autoload_register

はじめに: PHP システム実装で他の多くのクラス ライブラリが使用されている場合、これらのクラス ライブラリは異なるエンジニアによって開発される可能性があるため、クラス名とクラス ライブラリが配置されているファイルの間のマッピング ルールは異なります。この時点で、クラス ライブラリの自動ロードを実装する場合は、すべてのマッピング ルールを __autoload 関数に実装する必要があります。これにより、__autoload が非常に複雑になったり、実装が不可能になったりします。同時に、__autoload 関数も非常に肥大化します。これは、将来のシステムの保守とパフォーマンスに多大な悪影響を及ぼします。 (

__自動ロードの欠点)

spl_autoload_register:

指定された関数を__autoloadの実装として登録します。簡単に言うと、関数は SPL の __autoload 関数スタックに登録され、システムのデフォルトの __autload() 関数が削除されます。

リーリー

リーリー

機能説明

リーリー

    autoload_function [オプション] 自動ロードスタックに追加される関数。デフォルトは spl_autoload() です。
    • 関数に文字列名を指定する代わりに、spl_autoload_register() 関数を呼び出してコールバック関数を登録することもできます。たとえば、array('class','method') のような配列を指定すると、オブジェクトのメソッドを使用できるようになります
    throw [オプション] 登録が成功しなかった場合に例外をスローするかどうか
  • prepend [オプション] この関数をキューの末尾ではなくキューの先頭に追加するかどうか。
  • リーリー
  • 3. Phalcon のクラスは自動的にロードされます

PhalconLoader ユニバーサル クラス ローダー (ユニバーサル クラス ローダー) は、プロジェクトがプロトコルに従ってプロジェクトにクラスを自動的にロードできるようにすることを目的としています (このコンポーネントは、いくつかの規則に基づいてプロジェクト クラスを自動的にロードするのに役立ちます)。 Phalcon は 4 つのクラスロード方法をサポートしています。その順序は、クラス名の登録、名前空間の登録、プレフィックスの登録、フォルダーの登録です。

Phalcon のデフォルトのファイルサフィックスは php ですが、もちろん自分で設定することもできます (setExtensions())。

1.クラス名を登録します

リーリー

リーリー

2. ネームスペースを登録する

リーリー

名前空間または外部ライブラリを使用してコードを整理する場合、名前空間を登録して、そこに含まれるライブラリを自動的にロードできます。

リーリー

3. 登録プレフィックス

リーリー

名前空間と同様に、Phalcon は 2.1.0 以降プレフィックスをサポートしなくなります。

リーリー

4.フォルダーを登録します

リーリー

登録ディレクトリ内のクラスファイルを自動的にロードできます。ただし、Phalcon は各フォルダー内で同じクラス名を持つ多数のファイルを検索するため、この方法はパフォーマンスの観点からお勧めできません。登録ディレクトリを使用して自動的にロードする場合は、登録ディレクトリの関連性、つまり重要なディレクトリを前に置くことに注意してください。

<p>具体实现:</p>

5. 修改当前策略(Modifying current strategies)

即为当前自动加载数据添加额外的值。

<?<span>php
</span><span>//</span><span> Adding more directories</span>
<span>$loader</span>-><span>registerDirs(
    </span><span>array</span><span>(
        </span>"../app/library/",
        "../app/plugins/"<span>
    )</span>,
    <span>true</span><span>
);</span>

 

注册时添加第二个参数值true,使其与原数组合并。

6. 安全层(Security Layer)

没有进行任何安全检查的自动加载器,如下:

<?<span>php
</span><span>//</span><span>Basic autoloader</span>
spl_autoload_register(<span>function</span>(<span>$className</span><span>) {
    </span><span>if</span> (<span>file_exists</span>(<span>$className</span> . '.php'<span>)) {
        </span><span>require</span> <span>$className</span> . '.php'<span>;
    }
});</span>

 

假如我们没有进行任何安全检查时,如果误启了自动加载器,那么恶意准备的字符串就回作为参数访问程序中的重要文件。

<?<span>php

</span><span>//</span><span>This variable is not filtered and comes from an insecure source</span>
<span>$className</span> = '../processes/important-process'<span>;

</span><span>//</span><span>Check if the class exists triggering the auto-loader</span>
<span>if</span> (<span>class_exists</span>(<span>$className</span><span>)) {
    </span><span>//</span><span>...</span>
}

 

Phalcon的做法是删除任何无用的字符串,减少被攻击的可能性。

7. 自动加载事件

在下面的例子中,而不必使用类加载器,使我们获得调试信息的流程操作:

<?<span>php
</span><span>$eventsManager</span> = <span>new</span><span> \Phalcon\Events\Manager();
</span><span>$loader</span> = <span>new</span><span> \Phalcon\Loader();
</span><span>$loader</span>->registerNamespaces(<span>array</span><span>(
       </span>'Example\\Base' => 'vendor/example/base/',
       'Example\\Adapter' => 'vendor/example/adapter/',
       'Example' => 'vendor/example/'<span>
));
</span><span>//</span><span>Listen all the loader events</span>
<span>$eventsManager</span>->attach('loader', <span>function</span>(<span>$event</span>, <span>$loader</span><span>) {
    </span><span>if</span> (<span>$event</span>-><span>getType</span>() == 'beforeCheckPath'<span>) {
        </span><span>echo</span> <span>$loader</span>-><span>getCheckedPath();
    }
});
</span><span>$loader</span>->setEventsManager(<span>$eventsManager</span><span>);
</span><span>$loader</span>->register();

 

Phalcon自动加载支持以下事件:

  • beforeCheckClass,自动加载的过程开始前触发,当返回布尔假可以停止活动操作。
  • pathFound,当一个类装入器定位触发
  • afterCheckClass,自动加载的过程完成后触发。

8. 注意事项(Troubleshooting)

 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1092699.htmlTechArticlePhalcon自动加载(PHP自动加载),phalcon加载php 自动加载(phalcon\Loader) 转载请注明来源 一、php文件引入 通过 include() 或 require() 函数,可以在PH...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。