Va bene, ho avuto due grandi progetti in cui ho avuto il controllo del server abbastanza per lo spazio dei nomi e fare affidamento sul caricamento automatico.
Innanzitutto. Il caricamento automatico è fantastico. Non preoccuparti è una cosa relativamente buona.
Ecco un caricatore che ho usato su alcuni progetti. Verifica per prima cosa che la classe si trovi nello spazio dei nomi corrente, quindi in caso contrario esegue il bail. Da lì è solo un po 'di manipolazione delle stringhe per trovare la classe.
<?php
spl_autoload_register(__NAMESPACE__ . '\\autoload');
function autoload($cls)
{
$cls = ltrim($cls, '\\');
if(strpos($cls, __NAMESPACE__) !== 0)
return;
$cls = str_replace(__NAMESPACE__, '', $cls);
$path = PLUGIN_PATH_PATH . 'inc' .
str_replace('\\', DIRECTORY_SEPARATOR, $cls) . '.php';
require_once($path);
}
Si potrebbe facilmente adattare questo per l'uso senza spazi dei nomi. Supponendo che il prefisso sia uniformemente inserito nelle classi del tema / del plugin, si potrebbe semplicemente verificare quel prefisso. Quindi utilizzare i trattini bassi nel nome della classe come segnaposto per i separatori di directory. Se stai usando molte classi, probabilmente vorrai usare una sorta di caricatore automatico di classmap.
Spazi dei nomi e ganci
Il sistema di hook di WordPress funziona usando call_user_func
(e call_user_func_array
), che prende i nomi delle funzioni come stringhe e li chiama quando viene effettuata la chiamata do_action
(e, successivamente, call_user_func
) della funzione.
Con gli spazi dei nomi, ciò significa che dovrai passare nomi di funzioni completi che includono lo spazio dei nomi in hook.
<?php
namespace WPSE\SomeNameSpace;
add_filter('some_filter', 'WPSE\\SomeNameSpace\\the_function');
function the_function()
{
return 'did stuff';
}
Probabilmente sarebbe meglio fare un uso liberale della __NAMESPACE__
costante magica se vuoi farlo.
<?php
namespace WPSE\SomeNameSpace;
add_filter('some_filter', __NAMESPACE__ . '\\the_function');
function the_function()
{
return 'did stuff';
}
Se metti sempre i tuoi ganci in classe, è più facile. Lo standard crea l'istanza di una classe e tutti gli hook nel costruttore con $this
funzionano bene.
<?php
namespace WPSE\SomeNameSpace;
new Plugin;
class Plugin
{
function __construct()
{
add_action('plugins_loaded', array($this, 'loaded'));
}
function loaded()
{
// this works!
}
}
Se usi metodi statici come voglio fare, dovrai passare il nome completo della classe come primo argomento dell'array. È un sacco di lavoro, quindi puoi semplicemente usare la __CLASS__
costante magica o get_class
.
<?php
namespace WPSE\SomeNameSpace;
Plugin::init();
class Plugin
{
public static function init()
{
add_action('plugins_loaded', array(__CLASS__, 'loaded'));
// OR: add_action('plugins_loaded', array(get_class(), 'loaded'));
}
public static function loaded()
{
// this works!
}
}
Utilizzo delle classi principali
La risoluzione del nome classe di PHP è un po 'traballante. Se hai intenzione di utilizzare le classi WP di base ( WP_Widget
nell'esempio seguente) devi fornire use
dichiarazioni.
use \WP_Widget;
class MyWidget extends WP_Widget
{
// ...
}
Oppure puoi usare il nome di classe completo, in pratica semplicemente aggiungerlo con una barra rovesciata.
<?php
namespace WPSE\SomeNameSpace;
class MyWidget extends \WP_Widget
{
// ...
}
definisce
Questo è PHP più generale, ma mi ha morso, quindi eccolo qui.
Potresti voler definire cose che userai spesso, come il percorso del tuo plugin. L'uso dell'istruzione define mette le cose nello spazio dei nomi root a meno che non passi esplicitamente lo spazio dei nomi nel primo argomento di define.
<?php
namespace WPSE\SomeNameSpace;
// root namespace
define('WPSE_63668_PATH', plugin_dir_path(__FILE__));
// in the current namespace
define(__NAMESPACE__ . '\\PATH', plugin_dir_path(__FILE__));
Puoi anche usare la const
parola chiave on nel livello principale di un file con PHP 5.3 plus. consts
sono sempre nello spazio dei nomi corrente, ma sono meno flessibili di una define
chiamata.
<?php
namespace WPSE\SomeNameSpace;
// in the current namespace
const MY_CONST = 1;
// this won't work!
const MY_PATH = plugin_dir_path(__FILE__);
Sentiti libero di aggiungere altri suggerimenti che potresti avere!