De acuerdo, he tenido dos grandes proyectos en los que he tenido el control del servidor lo suficiente como para usar el espacio de nombres y confiar en la carga automática.
Por primera vez. La carga automática es increíble. No preocuparse por requiere es algo relativamente bueno.
Aquí hay un cargador que he estado usando en algunos proyectos. Verifica para asegurarse de que la clase esté primero en el espacio de nombres actual, luego se retira si no. A partir de ahí, es solo una manipulación de cadenas para encontrar la clase.
<?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);
}
Uno podría adaptar esto fácilmente para usarlo sin espacios de nombres. Suponiendo que prefija las clases de su plugin / tema de manera uniforme, puede probar ese prefijo. Luego use guiones bajos en el nombre de la clase como marcadores de posición para los separadores de directorio. Si está utilizando muchas clases, es probable que desee utilizar algún tipo de cargador automático de mapas de clase.
Espacios de nombres y ganchos
El sistema de ganchos de WordPress funciona mediante el uso de call_user_func
(y call_user_func_array
), que toma los nombres de las funciones como cadenas y las llama cuando se realiza la llamada a la función do_action
(y, posteriormente, call_user_func
).
Con espacios de nombres, eso significa que deberá pasar nombres de funciones completamente calificados que incluyan el espacio de nombres en ganchos.
<?php
namespace WPSE\SomeNameSpace;
add_filter('some_filter', 'WPSE\\SomeNameSpace\\the_function');
function the_function()
{
return 'did stuff';
}
Probablemente sería mejor hacer un uso liberal de la __NAMESPACE__
constante mágica si quieres hacer esto.
<?php
namespace WPSE\SomeNameSpace;
add_filter('some_filter', __NAMESPACE__ . '\\the_function');
function the_function()
{
return 'did stuff';
}
Si siempre pones tus ganchos en las clases, es más fácil. La instancia de creación estándar de una clase y todos los ganchos en el constructor $this
funcionan bien.
<?php
namespace WPSE\SomeNameSpace;
new Plugin;
class Plugin
{
function __construct()
{
add_action('plugins_loaded', array($this, 'loaded'));
}
function loaded()
{
// this works!
}
}
Si usa métodos estáticos como quiero hacer, deberá pasar el nombre de clase completo como primer argumento de la matriz. Eso es mucho trabajo, así que puedes usar la __CLASS__
constante mágica 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!
}
}
Usar clases principales
La resolución del nombre de clase de PHP es un poco inestable. Si va a utilizar las clases principales de WP ( WP_Widget
en el ejemplo a continuación) debe proporcionar use
declaraciones.
use \WP_Widget;
class MyWidget extends WP_Widget
{
// ...
}
O bien, puede usar el nombre de clase completo, básicamente con el prefijo de una barra diagonal inversa.
<?php
namespace WPSE\SomeNameSpace;
class MyWidget extends \WP_Widget
{
// ...
}
Define
Este es un PHP más general, pero me mordió, así que aquí está.
Es posible que desee definir cosas que usará con frecuencia, como la ruta a su complemento. El uso de la instrucción define coloca las cosas en el espacio de nombres raíz a menos que pases explícitamente el espacio de nombres en el primer argumento de 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__));
También puede usar la const
palabra clave en el nivel raíz de un archivo con PHP 5.3 plus. consts
s siempre están en el espacio de nombres actual, pero son menos flexibles que una define
llamada.
<?php
namespace WPSE\SomeNameSpace;
// in the current namespace
const MY_CONST = 1;
// this won't work!
const MY_PATH = plugin_dir_path(__FILE__);
¡No dude en agregar cualquier otro consejo que pueda tener!
Utilizo la carga automática (ya que mi complemento tiene muchas clases, en parte porque incluye Twig), nunca tuve un problema que me llamó la atención (el complemento se instaló> 20,000 veces).
Si está seguro de que nunca más necesitará usar una instalación de php que no admite espacios de nombres, entonces está bien (~ 70% de los blogs actuales de WordPress no admiten espacios de nombres). Algunas cosas a tener en cuenta:
Me parece recordar que los espacios de nombres no distinguen entre mayúsculas y minúsculas en php regular, pero sí cuando se usa fastcgi php en iis; esto causa algunos dolores de cabeza si prueba en Linux y no ve una letra minúscula pícara.
Además, incluso si está seguro de que el código que está desarrollando actualmente solo se usará en> 5.3.0, no podrá reutilizar ningún código con proyectos que no tengan ese lujo, esa es la razón principal por la que no lo he hecho. espacios de nombres usados en proyectos internos. He encontrado que los espacios de nombres realmente no añaden que tanto si se compara con la posible dolor de cabeza de tener que quitar la dependencia de ellos.
fuente