Wie kann eine class / Instanz ohne globale Variablen eingebunden werden?

Ich möchte http://mobiletetect.net/ class zu meiner Vorlage hinzufügen. Welches ist der beste Ansatz, um diese class in jedem Teil meiner Vorlage dynamisch zu verwenden?

Im Moment habe ich die class einfach in die functions.php geladen

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

aber um es zu benutzen, muss ich zuerst eine Instanz in jeder Seitenvorlage erstellen

 $detect = new Mobile_Detect; 

Ich weiß, dass globale Variablen keine gute Lösung sind, was ist dann der beste Ansatz, um solche classn einzubeziehen?

Solutions Collecting From Web of "Wie kann eine class / Instanz ohne globale Variablen eingebunden werden?"

Globale Variablen sind keine gute Lösung

Ja, ich habe diesen Satz oft gehört, aber wie Sie erfahren haben, müssen manchmal einige Variablen überall abgerufen werden.

Einige moderne PHP-Frameworks implementieren erweiterte Muster wie IOC , die in solchen Dingen helfen, aber WordPress fehlt darin, und dies ist der Grund, warum eine Menge globaler Variablen in WP verwendet wird.

Im Allgemeinen sind in PHP Lösungen:

  1. Sigleton . Eine Menge Programmierer (speziell aus anderen Sprachen als PHP) sagt Singleton saugt, weil eine Art maskierte Globals sind. Meiner Meinung nach, wenn man sich nicht auf eine Implementierung von IOC verlassen kann, sind Singleton besser als “reine” Globals, aber für einfache Aufgaben ist es nicht notwendig, dieses Muster zu implementieren.
  2. Globals. In PHP lassen die Schlüsselwörter global global vars etwas weniger riechen. Wenn Sie einen nachdenklichen Gebrauch machen, saugt Globals nicht so viel. ZB ist es keine sehr schlechte Lösung, sie innerhalb von functionen zu verwenden.

Streng verwandt mit deinem Fall, wird eine statische Methode als Alternative zu Globalen ausreichen, wenn du sie einfach hasst.

 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'); } } } 

Erfordert dann die Datei mit der class in Ihrem Plugin

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

Wenn Sie die Variable $detect (die mobile Erkennungsinstanz) MyDetect::$detect verwenden Sie MyDetect::$detect und wenn Sie die Variable MyDetect::$devicType $deviceType , verwenden Sie MyDetect::$devicType

Edit: ein Anwendungsbeispiel

 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' );