web-dev-qa-db-ja.com

グローバル変数を使用せずに1つのクラス/インスタンスを含める方法

テンプレートに http://mobiledetect.net/ クラスを追加します。テンプレートのあらゆる部分でこのクラスを動的に使用するための最善の方法はどれですか。

今のところ、私はちょうどこのようにfunctions.phpにクラスをロードしました

    function devicecontrol() {
    require_once '_/inc/md/Mobile_Detect.php';
}
add_action('wp_loaded', 'devicecontrol', '1');

しかしそれを使うためには、私は最初にすべてのpage-templateにインスタンスを作成しなければなりません

$detect = new Mobile_Detect;

グローバル変数は良い解決策ではないことを私は知っています、それではそのようなクラスを含めるための最善の方法はどれでしょうか。

1
Andrea Puiatti

グローバル変数は良い解決策ではありません

はい、私はこの文を何度も聞いたことがありますが、あなたが経験したように、いくつかの変数にはどこでもアクセスする必要があることがあります。

最近のPHPフレームワークの中には、 IOC のような高度なパターンを実装しているものもありますが、ワードプレスには欠けています。これが、WPで多くのグローバル変数が使用されている理由です。

一般的に言って、PHPでは、解決策は以下のとおりです。

  1. シグルトン 。多くのコーダー(特にPHP以外の言語からの)は、一種のマスクされたグローバルであるため、シングルトンが吸うと言います。私の意見では、IOCの実装に頼ることができないときは、シングルトンは「純粋な」グローバルよりも優れていますが、単純なタスクではこのパターンを実装する必要はありません。
  2. グローバルPHPでは、キーワードglobalによって、グローバル変数の臭いが少し少なくなります。あなたが思いやりのある使い方をすれば、グローバルはそんなに吸いません。例えば。関数内でそれらを使用することはそれほど悪い解決策ではありません。

厳密にあなたのケースに関連して、あなたがそれらを嫌うならば、静的メソッドはグローバルの代わりとして十分でしょう。

class MyDetect {

  static $detect = NULL;
  static $deviceType = NULL;

  static function detect() {
    if ( is_null(self::$detect) ) {
      require_once '_/inc/md/Mobile_Detect.php';
      self::$detect = new Mobile_Detect;
      self::$deviceType = ($detect->isMobile() ? ($detect->isTablet() ? 'tablet' : 'phone') : 'computer'); 
    }
  }

}

プラグインにクラスを含むファイルを要求し、

add_action('wp_loaded', array('MyDetect', 'detect') );

$detect変数(モバイル検出インスタンス)が必要な場合はMyDetect::$detectを使用し、$deviceType変数が必要な場合はMyDetect::$devicTypeを使用します。

編集:使用例

function add_mobile_scripts() {
   wp_enqueue_script('my_script_for_mobiles', 'the_script_url_here' );
}

function add_phone_scripts() {
   wp_enqueue_script('my_script_for_phones', 'the_script_url_here' );
}

function add_tablet_scripts() {
   wp_enqueue_script('my_script_for_tablets', 'the_script_url_here' );
}

function add_desktop_scripts() {
   wp_enqueue_script('my_script_for_desktops', 'the_script_url_here' );
}

function addDevicesScripts() { 
  if ( MyDetect::$deviceType == 'phone' || MyDetect::$detect == 'tablet' ) {
    add_mobile_scripts();
    if ( MyDetect::$deviceType=='phone' ) {
      add_phone_scripts();
    } else {
      add_tablet_scripts();
    }  
  } else {
     add_desktop_scripts();
  }
}

add_action( 'wp_enqueue_scripts', 'addDevicesScripts' );
4
gmazzap