Al desarrollar un complemento, ¿deberían agruparse las funciones en una Clase para evitar conflictos de espacio de nombres?
Sí, pero ese es solo uno de los argumentos menores. De hecho, esa no es la naturaleza "verdadera" de una clase en OOAD .
¿El uso de clases crea gastos generales de rendimiento para PHP?
No, no notablemente. El mal diseño y / o el mal código escrito o la optimización prematura crean muchos más problemas de rendimiento que las características del lenguaje real.
Si hay un impacto en el rendimiento, ¿deberían los nombres de las funciones ser simplemente arreglados en su lugar?
Como está escrito, no hay éxito en el rendimiento. El código escrito incorrecto será más un éxito en el rendimiento que el código escrito bueno que tiene algunas líneas de código más pero no lo obliga a hacer cosas malas.
Línea de fondo:
Puede hacer un uso diferente de las clases para complementos. Puede usarlos para tener algún tipo de espacio de nombres y usarlos "solo" para funciones globales. La forma más directa de eso son las funciones de clase estática, el siguiente ejemplo de código muestra ambas, primero funciones globales, luego funciones de clase estática global:
/* global function */
function myplug_hook()
{
}
add_filter('the_hook', 'myplug_hook');
/* global static function */
class myplug
{
public static function hook()
{
}
}
add_filter('the_hook', 'myplug::hook');
Este es solo un pequeño ejemplo que muestra que necesita escribir más para el gancho único. Además, muestra cómo funciona el espacio de nombres: puede reemplazar más fácilmente el nombre de una sola clase para cambiar el nombre de todas las funciones estáticas y luego buscar y reemplazar, lo myplug::
que podría ser más difícil myplug_
debido a los falsos positivos. Pero al final no hay mucha diferencia.
El punto clave es: funciones de clase estáticas Los documentos no son mucho más que funciones globales Documentos .
Y este ejemplo también muestra: el espacio de nombres está bien, pero con worpdress, el espacio de nombres se detiene al usar ganchos: la función de devolución de llamada está codificada, por lo tanto, el beneficio en el espacio de nombres usando la clase (un lugar para el nombre base, el nombre de clase) no ayuda cuando interviene su código con wordpress para los nombres de gancho.
El beneficio real comienza con el uso de instancias de clase reales y funciones no estáticas. Esto tiene el beneficio de que puede comenzar a utilizar los principios de OO y puede optimizar su código. Las funciones de clase estáticas son más un problema que una solución.
Entonces es más que solo azúcar sintáctico.
El punto clave es: Haz algo que te ayude a escribir el código con el que puedes lidiar y mantener fácilmente. No sobrevalores el rendimiento, es un error común. Más importante es que escriba código que sea fácil de leer y comprender, que simplemente haga lo que necesita. Quizás esta pregunta y respuesta sea útil para tener una visión más amplia en este contexto: Ayuda de Metabox personalizada múltiple .
Un enfoque común que tengo incluso con complementos más pequeños es hacer uso de una función auxiliar estática para crear instancias del complemento y el resto reside dentro de la instancia del complemento. Esto ayuda a encapsular la lógica principal del complemento y se beneficia del espacio de nombres con los ganchos, así como que los miembros privados pueden reutilizarse entre los ganchos, lo que no es posible con las funciones globales estándar. El siguiente código de ejemplo muestra el patrón:
<?php
/** Plugin Headers ... */
return MyPlugin::bootstrap();
class MyPlugin
{
/** @var MyPlugin */
static $instance;
static public function bootstrap() {
if (NULL === self::$instance) {
self::$instance = new __CLASS__;
}
return self::$instance;
}
# ...
}
Este es un patrón común que uso para el archivo de complemento base. La clase de complemento, por un lado, representa el complemento para wordpress y, por otro lado, permite comenzar a usar paradigmas orientados a objetos para el propio código, que incluso puede estar completamente orientado a objetos (pero no necesariamente). Es una especie de controlador, que interactúa con toda la API de WordPress como la (s) solicitud (es).
Como muestra el ejemplo, se creará una instancia del complemento. Esto le permite hacer uso de los bienes comunes conocidos, como un Constructor Docs ( __construct
) para inicializar el complemento real:
# ...
class MyPlugin
{
# ...
public function __construct()
{
add_filter('the_hook', array($this, 'hook'));
}
public function hook()
{
}
# ...
}
En el momento en que se registra el enlace, este objeto de complemento ya se beneficia de su diseño: ha dejado de codificar la función de enlace real contra el nombre de clase del complemento concreto . Eso es posible debido al enlace de la clase a la instancia del objeto para la devolución de llamada. Suena complicado, solo digo: $this
es el complemento. Se puede utilizar en devoluciones de llamada de enlace, compare los métodos de la Clase de registro como devoluciones de llamada de enlace .
Este patrón permite una interfaz más fácil con WordPress: la inyección se reduce a los nombres de los ganchos y a los datos que proporcionan. A continuación, puede comenzar a implementar directamente en esta clase de complemento o refactorizar su implementación contra ella, por lo que solo debe poner código en la clase de complemento que es lo mínimo para definir su interfaz de complementos contra WordPress, pero mantenga la lógica general a un lado de worpdress. Aquí es donde comienza la diversión y, muy probablemente, lo que cada autor del complemento quiere lograr a largo plazo.
Así que no programes con worpdress sino contra él. Como worpdress es bastante flexible, no existe una interfaz común o fácil de describir para programar. Una clase de complemento base puede asumir este rol, permitiéndole más flexibilidad para su propio código, lo que conducirá a un código más fácil y a un mejor rendimiento.
Por lo tanto, hay algo más que un beneficio para el espacio entre nombres. La mejor sugerencia que puedo dar es: pruébalo. No hay mucho que perderá, solo cosas nuevas por descubrir.
Probablemente notará diferencias después de haber pasado algunas actualizaciones más importantes de WordPress mientras mantiene su complemento compatible.
Advertencia : si su complemento se integra directamente con WordPress para hacer el trabajo, usar una o dos funciones públicas podría ser mejor para usted. Tome la herramienta adecuada para el trabajo.