初心者は間違いなくデザインパターンについて多くの混乱を抱えています。今日は週末なので、一部の人向けに、シングルピースモードとコマンドチェーンモードを組み合わせた記事を書きました。記事の内容 簡単すぎる初心者向けのチュートリアルです。時間が限られているので(妻と買い物に行かなければなりません(笑))、デザインの乱れ、コードの書き方の乱れ、バグなどがあります。すべてのヒーローがそれらを指摘できるので、全員が一緒に進歩することができます^_^
。誰もが PHP でのデザイン パターンの適用に関する多くの書籍や記事を読んだことがあると思いますが、それらを直接例として挙げている人はほとんどおらず、プロジェクトの実践がなければ、デザイン パターンの部分を適用するのは困難です。クリアです
コードが複雑になりすぎないように、例外処理やその他の内容は追加されていません。
シングルトン モードとコマンド チェーン モードの基本的な知識については、詳しくは説明しません。例を直接:
APP クラスはシステムのコア部分であるシングルトン モデルを使用して設計されており、Load メソッドが APP クラスのインスタンスをロードするものであることがわかると思います。これは getInstance 静的メソッドに相当します。いくつかの本には、addCommand、runCommand、removeCommand が含まれています。runCommand は、コマンド チェーン モードのコア スタートアップ プログラムです。コードはすでに公開されています。非常に明確なので、ここでは詳細は説明しません。 以下はシステムの操作プロセスです: APP の開始 addCommand(new someClass) 実際の操作効果は次のとおりです:
中国語レベルに限ります。わからないことがあれば、ご連絡ください。
http://www.bkjia.com/PHPjc/364149.html
/*
*@author:NoAngels
*@time: 2008年8月30日
*/
interface IRunAction{
//APP
staticで実行できるクラスで定義されたメソッドを取得しますfunction LoadActions();
//クラス内のエントリ関数は、
function runAction($action, $args);
}を使用してクラス内の他の関数を呼び出します
/*
*APP クラス システムのコア部分
*/
class APP {
static private $__instance = null;
static private $__commands = array();
static private $__flag = 1;
private function __construct(){}
//唯一のこのクラスのインスタンス
static function Load(){
if(self::$__instance == null) self::$__instance = new APP;
return self::$__instance;
}
//APPの$に名前を追加毎回 __instance 新しいコマンドを作成するときに、このクラスのインスタンスが以前に追加されているかどうかを確認します
//追加されている場合は、操作を無視します。
public function addCommand($cmdName){
foreach(self: :$__commands as $cmd){
if(strto lower(get_class($cmd)) == strto lower(get_class($cmdName))){
self::$__flag = 0;
break;
}
}
if( self::$__flag == 1 ) self::$__commands[] = $cmdName;
self::$__flag = 1;
}
//コマンド チェーン パターン設計の中核部分は、インスタンスのエントリ関数を呼び出します
//最初にクラス内で呼び出しが許可されているかどうかを確認します。操作がない場合は、未定義の操作を終了するように求められます
public function runCommand($action, $args){
self::$__flag = 0;
foreach( self::$__commands as $cmd){
if(in_array($action , $cmd->LoadActions())){
self::$__flag = 1;
$cmd->runAction($action, $ args);
}
}
if(self::$__flag == 0){
self::$__flag = 1;
exit("未定義アクション by アクション : $action");
}
}
//クラスのインスタンスを削除するには、クラスの名前を指定するだけです
public function RemoveCommand($className){
foreach(self::$__commands as $key=>$cmd){
if(strto lower(get_class($ cmd)) == strto lower($className)){
unset(self:: $__commands[$key]);
}
}
}
//追加と削除が成功したかどうかを全員がテストできるようにする
public function viewCommands(){
echo(count(self::$__commands));
}
}
//クラス ユーザーはインターフェイス IRunAction を実装します
class ユーザーは IRunAction を実装します{
//呼び出し可能な操作を定義します
static private $__actions = array('addUser', 'modifyUser', 'removeUser');
//実際に操作を呼び出すプロセスでは、$__actions をパブリック呼び出しとして直接設計しないでください
//代わりに、LoadActions 関数を設計します$__actions の値を取得します
static public function LoadActions(){
return self::$__actions;
}
//指定された関数を実行します
public function runAction($action, $args){
//この関数の使用方法がわからない場合は、マニュアルを参照してください
call_user_func(array($this,$action), $args);
}
//単なるテスト関数
保護関数 addUser($name){
echo ($name);
}
}
//クラス テストは User
クラス テストと同じです IRunAction{
static private $__actions = array('addTest', 'modifyTest', 'removeTest');
static public function LoadActions(){
return self::$__actions;
}
public function runAction($action, $args){
call_user_func(array($this,$action) , $args);
}
protected function addTest($ name){
echo($name);
}
}
//以下はテストコードです
APP::Load()->addCommand(new User); (新規ユーザー);
APP::Load()->addCommand(新規ユーザー);
APP::Load()->addCommand(新規ユーザー);
APP ::Load()->runCommand(' addUser', 'NoAngels');
APP::Load()->addCommand(new Test);
APP::Load()->runCommand('addTest' , null);
クラス User と Test は IRunAction インターフェイスを実装します。両方のクラスは静的プライベート変数 $__actions を定義します。これは、APP の runCommand 関数によって呼び出すことができる操作を含む配列です。 .
-----addCommand、実行する操作が属するクラスを APP に追加します。追加したクラスがシングルトン モードを使用して設計されている場合は、addCommand(SingletonClass::Load()) を追加できます。それ以外の場合は、次のように調整できます
-----runCommand。たとえば、User クラスには runCommand($acttion, $args) のループを実行できます。 APP 内の配列で、特定のクラスのインスタンスにこの操作がある場合、そのインスタンスの runAction 関数を呼び出します。addCommand を使用して特定のクラスのインスタンスを追加しないと、未定義の操作が要求されて終了します。 class User と class Test runAction は、非常に一般的に使用される関数 call_user_func を呼び出します。これは、このクラスの対応する関数を呼び出します。
ヒント: 説明と例は以上です。このアイデアをどのように理解して使用するかは、すべて自分で行う必要があります。(追記: フレームワーク内で 1 つのエントリ ファイルにすることができます。 、MVCを実装するかどうかはあなたの考え次第です。)