人によっては記事の内容が簡単すぎるかもしれません。時間が限られているため(妻と買い物に行かなければなりません、笑)、デザインに不規則性、コードの書き方に不規則性、バグがあります。 、などなど。私たちが一緒に進歩できるように、すべてのヒーローがそれを指摘してくれることを願っています^_^
あなたはphpでのデザインパターンの適用に関する多くの本や記事を読んだと思います。しかし、それを理解するのは非常に難しく、直接例が示されていることがほとんどなく、プロジェクトの実践がなければ、コードを回避するためにデザインパターンの部分を理解するのは困難です。内容は複雑すぎるため、例外処理などは追加されていません。
シングルトン モードとコマンド チェーン モードの基本的な知識については、詳しくは説明しません。 :
コードをコピー コードは次のとおりです:
/*
*@ author:NoAngels
*@time: 2008 年 8 月 30 日
*/
interface IRunAction{
//APP で実行できるクラスで定義されたメソッドを取得
静的関数 LoadActions ();
//クラス内のエントリ関数は、
function runAction($action, $args) を使用してクラス内の他の関数を呼び出します。
/*
* コア部分APP クラス システム
*/
クラス APP{
static private $__instance = null;
static private $__flag = 1; private function __construct(){}
//シングルピース モードのデザインは、このクラスの唯一のインスタンスを取得します
static function Load(){
if(self::$__instance == null) self:: $__instance = new APP;
return self::$__instance;
}
// 名前を追加 新しいコマンドを追加するたびに、このクラスのインスタンスが作成されているかどうかを確認します。 added before
//そうであれば、操作を無視します。そうでない場合は、追加します。
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 インターフェイスを実装します
クラス ユーザーは IRunAction を実装します{
//呼び出し可能な操作を定義します
static private $__actions = array('addUser', 'modifyUser', 'removeUser');
// 呼び出し可能な操作を取得します。実際のプロセスでは、$__actions をパブリック呼び出しとして直接設計しないでください
// 代わりに、$__actions の値を取得する LoadActions 関数を設計します
static public function LoadActions(){
return self:: $ __actions;
}
//指定された関数を実行します
public function runAction($action, $args){
//この関数の使い方がわからない場合は、を参照してください。マニュアル
call_user_func(array($ this,$action), $args);
}
//単なるテスト関数
保護された関数 addUser($name){
echo($ name);
}
}
//クラス テストはユーザーと同じです
クラス テストは IRunAction{
static private $__actions = array('addTest', 'modifyTest', ' RemoveTest');
static public function LoadActions(){
return self::$__actions;
}
public function runAction($action, $args){
call_user_func($ this,$action), $args);
}
protected function addTest($name){
echo($name);
}
}
// 以下はテストコード
APP::Load()->addCommand(new User);
APP::Load()->addCommand(new User); ;addCommand(新しいユーザー);
APP::Load() ->addCommand(新しいユーザー);
APP::Load()->runCommand('addUser', 'NoAngels'); >APP::Load()->addCommand(new Test);
APP::Load()->runCommand('addTest', null);
APP クラスはシステムのコア部分であるシングルトン モデルを使用して設計されており、Load メソッドが getInstance に相当する APP クラスのインスタンスをロードするものであることがわかると思います。いくつかの本では、addCommand、runCommand、removeCommand の 3 つの public メソッドがあります。runCommand は、コマンド チェーン モードのコアの起動プログラムでもあります。コードはすでに非常に明確なので、ここでは詳しく説明しません。
クラス User および Test は IRunAction インターフェイスを実装しており、どちらのクラスも静的プライベート変数 $__actions を定義します。これは、呼び出すことができる操作を含む配列です。 APP の runCommand 関数による
以下はシステムの実行プロセスです:
APP 起動
-----addCommand、操作を行うクラスを追加します。追加されたクラスが APP に属している場合は、addCommand(SingletonClass: :Load()) を追加できます。それ以外の場合は、
addCommand(new someClass) を追加します。
------runCommand。たとえば、User クラスに addUser という操作があり、$__commands 配列を直接ループできます。 APP. 特定のクラスのインスタンスにオペレーションがある場合、addCommand を使用して特定のクラスのインスタンスを追加していない場合は、
runAction 関数を呼び出します。クラス User とクラス Test では、非常に一般的に使用される関数 call_user_func が呼び出されます。
ヒント: 説明と例はここにあります。このアイデアをどのように理解して使用するかについて説明します。すべて自分で行う必要があります (追記: フレームワーク内で 1 つのエントリ ファイルにすることができます。MVC を実装するかどうかはあなた次第です。どう思いますか?)
実際の操作効果は次のとおりです:
中国語レベルに限ります。何かわからない場合は、ご連絡ください。
時間があるときにいくつか記事を書きます。 🎜>