ThinkPHP3.2 扩展
之前写到TP3.1的行为扩展是tag();在TP3.2中引入了另一种说法—:钩子。 我们来看一下TP3.2中的钩子这个东西: 一:文件流程: 1:/index.php - require './ThinkPHP/ThinkPHP.php'; 2:/ThinkPHP/ThinkPHP.php—- require CORE_PATH.'Think'.EXT; Think\Think:
之前写到TP3.1的行为扩展是tag();在TP3.2中引入了另一种说法—:钩子。
我们来看一下TP3.2中的钩子这个东西:
一:文件流程:
1:/index.php ->require './ThinkPHP/ThinkPHP.php';
2:/ThinkPHP/ThinkPHP.php—->require CORE_PATH.'Think'.EXT; Think\Think::start();
3:/ThinkPHP/Library/Think/Think.class.php—–>App::run();
4:/ThinkPHP/Library/Think/App.class.php 。到这里基本流程就走完了,(这里不说细节);
二:代码:
1:看一下 App::run()方法:
<code> Hook<span>::listen(<span>'app_init'</span>);</span> App<span>::init();</span> Hook<span>::listen(<span>'app_begin'</span>);</span> <span>// Session初始化</span> <span>if(!IS_CLI)</span>{ <span>session(<span>C(<span>'SESSION_OPTIONS'</span>)</span>)</span>; } <span>// 记录应用初始化时间</span> <span>G(<span>'initTime'</span>)</span>; App<span>::exec();</span> Hook<span>::listen(<span>'app_end'</span>);</span> return ;</code>
其中的Hook::listen(”)就是用来执行钩子的,我们可以在app_init这个安插的位置用来获取应用中安装的插件。
看一下Hook::listen();
<code><span><span> @param</span><span> @param</span> mixed $params 传入参数 *<span> @return</span> void */</span> <span>static</span> <span>public</span> <span><span>function</span> <span>listen</span><span>(<span>$tag</span>, &<span>$params</span>=NULL)</span> {</span> <span>if</span>(<span>isset</span>(<span>self</span>::<span>$tags</span>[<span>$tag</span>])) { <span>if</span>(APP_DEBUG) { G(<span>$tag</span>.<span>'Start'</span>); trace(<span>'[ '</span>.<span>$tag</span>.<span>' ] --START--'</span>,<span>''</span>,<span>'INFO'</span>); } <span>foreach</span> (<span>self</span>::<span>$tags</span>[<span>$tag</span>] <span>as</span> <span>$name</span>) { APP_DEBUG && G(<span>$name</span>.<span>'_start'</span>); <span>$result</span> = <span>self</span>::exec(<span>$name</span>, <span>$tag</span>,<span>$params</span>); <span>if</span>(APP_DEBUG){ G(<span>$name</span>.<span>'_end'</span>); trace(<span>'Run '</span>.<span>$name</span>.<span>' [ RunTime:'</span>.G(<span>$name</span>.<span>'_start'</span>,<span>$name</span>.<span>'_end'</span>,<span>6</span>).<span>'s ]'</span>,<span>''</span>,<span>'INFO'</span>); } <span>if</span>(<span>false</span> === <span>$result</span>) { <span>// 如果返回false 则中断插件执行</span> <span>return</span> ; } } <span>if</span>(APP_DEBUG) { <span>// 记录行为的执行日志</span> trace(<span>'[ '</span>.<span>$tag</span>.<span>' ] --END-- [ RunTime:'</span>.G(<span>$tag</span>.<span>'Start'</span>,<span>$tag</span>.<span>'End'</span>,<span>6</span>).<span>'s ]'</span>,<span>''</span>,<span>'INFO'</span>); } } <span>return</span>; }</code>
其中关键是:self::exec($name, $tag,$params);
看一下exec的代码:
<code> <span>/** * 执行某个插件 *<span> @param</span> string $name 插件名称 *<span> @param</span><span> @param</span> Mixed $params 传入的参数 *<span> @return</span> void */</span> <span>static</span> <span>public</span> <span><span>function</span> <span>exec</span><span>(<span>$name</span>, <span>$tag</span>,&<span>$params</span>=NULL)</span> {</span> <span>if</span>(<span>false</span> === strpos(<span>$name</span>,<span>'\\'</span>)) { <span>// 插件(多个入口)</span> <span>$class</span> = <span>"Addons\\{$name}\\{$name}Addon"</span>; }<span>else</span>{ <span>// 行为扩展(只有一个run入口方法)</span> <span>$class</span> = <span>$name</span>.<span>'Behavior'</span>; <span>$tag</span> = <span>'run'</span>; } <span>$addon</span> = <span>new</span> <span>$class</span>(); <span>return</span> <span>$addon</span>-><span>$tag</span>(<span>$params</span>); }</code>
最后还不是 new $class();
进而return $addon->$tag($params);
又转到了具体钩子的代码方法。其实就是我们原本的调用class的方法,只不过经过别人的高度封装了。
三:那么问题来了,这个钩子有什么用呢? 怎么用?
这里以OneThink 的{:hook('AdminIndex')}
为例,看一些别人是怎么用的。
在系统初始化到 Hook::listen('app_init');
时,
<code><span><span><?php </span> <span>return</span> <span>array</span>( <span>'app_init'</span>=><span>array</span>(<span>'Common\Behavior\InitHook'</span>) );</span></span></code>
一看就明白,无非就是读取持久化的信息,放到缓存或是其他的方式
<code> <span>// 行为扩展的执行入口必须是run</span> <span>public</span> <span><span>function</span> <span>run</span><span>(&<span>$content</span>)</span>{</span> <span>if</span>(<span>isset</span>(<span>$_GET</span>[<span>'m'</span>]) && <span>$_GET</span>[<span>'m'</span>] === <span>'Install'</span>) <span>return</span>; <span>$data</span> = S(<span>'hooks'</span>); <span>if</span>(!<span>$data</span>){ <span>$hooks</span> = M(<span>'Hooks'</span>)->getField(<span>'name,addons'</span>); <span>foreach</span> (<span>$hooks</span> <span>as</span> <span>$key</span> => <span>$value</span>) { <span>if</span>(<span>$value</span>){ <span>$map</span>[<span>'status'</span>] = <span>1</span>; <span>$names</span> = explode(<span>','</span>,<span>$value</span>); <span>$map</span>[<span>'name'</span>] = <span>array</span>(<span>'IN'</span>,<span>$names</span>); <span>$data</span> = M(<span>'Addons'</span>)->where(<span>$map</span>)->getField(<span>'id,name'</span>); <span>if</span>(<span>$data</span>){ <span>$addons</span> = array_intersect(<span>$names</span>, <span>$data</span>); Hook::add(<span>$key</span>,<span>$addons</span>); } } } S(<span>'hooks'</span>,Hook::get()); }<span>else</span>{ Hook::import(<span>$data</span>,<span>false</span>); } }</code>
当在程序执行到{:hook(‘AdminIndex’)}时—>调用的是Hook::listen(‘AdminIndex’);
AdminIndex这个挂载点包含了三个插件:分别是:SiteStat, SystemInfo,DevTeam。
用一个循环来分别按顺序执行.
总结:钩子其实就是起到一个挂载点的作用,这个钩子挂在哪里,就可以在哪里执行,内容或功能就是挂载插件或类库的具体实现。这样实现的代码就有很大的灵活性,挂载点不变,挂的东西变量,功能也就相应的变化,是不是很灵活强大呀。
以上只属于学习笔记,若有错请指正。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











PHP の SNMP 拡張機能は、PHP が SNMP プロトコルを介してネットワーク デバイスと通信できるようにする拡張機能です。この拡張機能を使用すると、CPU、メモリ、ネットワークインターフェイスなどのネットワークデバイスの構成情報やルータ、スイッチなどの情報を簡単に取得および変更できます。また、スイッチングデバイスのポートなどの制御操作も実行できます。この記事では、SNMP プロトコルの基本知識、PHP の SNMP 拡張機能をインストールする方法、PHP で SNMP 拡張機能を使用してネットワーク デバイスを監視および制御する方法を紹介します。 1.SN

PHP 関数の機能を拡張するには、拡張機能とサードパーティのモジュールを使用できます。拡張機能は、pecl パッケージ マネージャーを通じてインストールおよび有効化できる追加の関数とクラスを提供します。サードパーティ モジュールは特定の機能を提供し、Composer パッケージ マネージャーを通じてインストールできます。実際の例には、拡張機能を使用して複雑な JSON データを解析したり、モジュールを使用してデータを検証したりすることが含まれます。

最初から最後まで: HTTP リクエストに php 拡張機能 cURL を使用する方法 はじめに: Web 開発では、多くの場合、サードパーティ API または他のリモート サーバーと通信する必要があります。 cURL を使用して HTTP リクエストを行うのは、一般的で強力な方法です。この記事では、PHP を使用して cURL を拡張して HTTP リクエストを実行する方法を紹介し、いくつかの実用的なコード例を示します。 1. 準備 まず、php に cURL 拡張機能がインストールされていることを確認します。コマンドラインで php-m|grepcurl を実行して確認できます。

1.UncaughtError:Calltoundependentfunctionmb_strlen(); 上記のエラーが発生した場合、mbstring 拡張機能がインストールされていないことを意味します; 2. PHP インストール ディレクトリ cd/temp001/php-7.1.0/ext/mbstring に入ります 3. phpize( /usr/local/bin /phpize または /usr/local/php7-abel001/bin/phpize) コマンドを使用して、php 拡張機能 4../configure--with-php-config=/usr/local/php7-abel をインストールします。

Aurora Push 拡張機能を使用して PHP アプリケーションにバッチ メッセージ プッシュ機能を実装する方法 モバイル アプリケーションの開発において、メッセージ プッシュは非常に重要な機能です。 Jiguang Push は、豊富な機能とインターフェイスを提供する、一般的に使用されるメッセージ プッシュ サービスです。この記事では、Aurora Push 拡張機能を使用して、PHP アプリケーションにバッチ メッセージ プッシュ機能を実装する方法を紹介します。ステップ 1: Jiguang Push アカウントを登録し、API キーを取得する まず、Jiguang Push の公式 Web サイト (https://www.jiguang.cn/push) に登録する必要があります。

一部のユーザーは、d ドライブの容量が足りないと感じて、d ドライブの容量を拡張したいと考えていますが、操作中に、win11d ドライブを拡張できず、拡張ボリュームが灰色になっていることがわかります。ディスク容量が不足しています。以下の解決策を見てみましょう。 win11d ディスクを拡張できない理由: 1. 容量が不足しています 1. まず、d ディスクを拡張するには、図に示すように、ディスクに「空き容量」があることを確認する必要があります。 2. このように空きスペースがなければ、当然拡張のしようがありません。 3. この時点で D ドライブを拡張したい場合は、他のディスクを見つけて右クリックし、「ボリュームの圧縮」を選択します。 4. 拡張して圧縮するスペースを入力し、「OK」をクリックして、利用可能なスペース。 2. ディスクは隣接していません。 1. ディスクを拡張するには、次のことができます。

PHP は、Web アプリケーションの開発やファイルの処理に使用できる人気のあるサーバー側言語です。 PHP 用の ZipArchive 拡張機能は、PHP で zip ファイルを操作するための強力なツールです。この記事では、PHP の ZipArchive 拡張機能を使用して zip ファイルを作成、読み取り、変更する方法について説明します。 1. ZipArchive 拡張機能をインストールする ZipArchive 拡張機能を使用する前に、拡張機能がインストールされていることを確認する必要があります。インストール方法は以下のとおりです。 1. インストールします。

PHP の POSIX 拡張機能は、PHP が POSIX 準拠のオペレーティング システムと対話できるようにする関数と定数のセットです。 POSIX (PortableOperatingSystemInterface) は、ソフトウェア開発者がさまざまな UNIX または UNIX 類似のオペレーティング システム上で実行できるアプリケーションを作成できるように設計された一連のオペレーティング システム インターフェイス標準です。この記事では、PHP 用の POSIX 拡張機能のインストールと使用方法を紹介します。 1. PHP の POSIX 拡張機能を次の場所にインストールします。
