1

グローバル変数は、絶対に必要でない限り、一般的に悪い習慣と見なされているため、いくつかの機能を実現する別の方法を検討しています。

現在、PHP で CMS システムに取り組んでおり、他の開発者が CMS 用のモジュールを簡単に作成できるようにしたいと考えています。CMS クラスを次のように定義しました。

class CMS
{
    public $version;
    public $sitename;
    public $siteurl;
    public $tbl_prefix;

    function __construct()
    { 

    }

    function RegisterModule()
    {

    }
}

ここで、 のインスタンスを生成CMSし、開発者 (およびすべてのモジュールとコア ファイル) が変数を通じてアクセスできるようにします$_cms。PHP ではオブジェクトに定数変数を使用できず、シングルトン パターンを使用するとインスタンス (つまりCMS::GetInstance()->RegisterModule()) にアクセスするための扱いにくい構文が提供されるため、インスタンスを含むグローバル変数を定義せずに目的を達成する方法はありますCMSか?

理想的には、次の構文のようなものを探しています。

_cms->RegisterModule();または$_cms->RegisterModule();、前者が優先されます。

4

3 に答える 3

4

プラグインをクラスとしてコーディングする必要があります。これはextend、クラスであるか、CMSコンストラクターへのパラメーターとして受け入れるかのいずれかです。これは Dependency Injection とも呼ばれ、入手できる最もクリーンなインターフェイスです。

class MyPlugin {

    public function __construct(CMS $cms) {
        ...
    }

}

プラグインをクラスにすることを要求すると、プラグインは自己完結型であり、特定の命名規則とインターフェイス規則に簡単に従うことができるため、アプリからプラグインを簡単に含めることができます。

于 2012-08-30T09:20:49.320 に答える
0

交霊会を行っているかどうかはわかりませんが、私の意見を述べさせてください そのような問題がある場合は、マジックメソッドを使用します __call() は、他の開発者が作業するファイルに適用され、私のいずれかのようになりますコードファイル

function __call($name,$params)
{
   if($name == 'RegisterModule')
   {
      $cms = myRegisty::get('cms');
      $cms->RegisterModule($params); 
   }

}

モジュール登録時は次のようになります

RegisterModule($params);

それが役立つことを願っています:)あなたのコンサーンは構文に関するものであり、より鋭いコードが必要だと思うので、これが私のポイントでした

于 2012-08-30T09:29:19.143 に答える
0

メソッド呼び出しを GetInstance()-Methods にリダイレクトする静的クラスを使用できます。

インスタンスが必要ですか、それとも CMS クラスを静的として宣言することは可能でしょうか?

http://www.php.net/manual/en/language.oop5.static.php

于 2012-08-30T09:19:55.923 に答える