Cuando uso spl_autoload_register en mi complemento, obtengo:
Fatal error: Uncaught exception 'LogicException' with message
'Class wp_atom_server could not be loaded'
wp-includes\pluggable-deprecated.php on line 182
Leí un poco y encontré varias soluciones. Uno en SO dijo que no usara spl_autoload_register con WordPress.
¿Es eso exacto?
Estoy seguro de que puedo encontrar una "solución" para el error, pero no estoy seguro de querer hacerlo con cada versión de WP.
Si no uso la función de carga automática, ¿cómo debo cargar mis clases? Esto es lo que se rompe ahora:
spl_autoload_extensions(".php");
spl_autoload_register();
use MyPluginClasses\Student as MS;
$student = new MS\Student();
echo $student->sayHello();
En estudiante:
<?PHP
namespace MyPluginClasses\Student
{
class Student{
public function __Construct(){
echo "Hello Johnny";
}
public function sayHello(){
echo "Hello Johnny's Method";
}
}
}
Este diseño funciona bien fuera de WordPress.
php
plugin-development
errors
johnny
fuente
fuente
spl_autoload_register()
sin efectos secundarios negativos.glob()
al directorio una vez, luego entregar las clases cuando se necesitenspl_autoload_register()
.Respuestas:
Realmente no estoy seguro de si es una buena o mala práctica cargar automáticamente las clases en el complemento WP. Para mí, no veo efectos secundarios del uso
spl_autoload_register
(rendimiento no probado)Entonces, para responder a su pregunta, me gustaría compartir una clase de mi próximo complemento que estoy usando para cargar automáticamente las clases desde un solo directorio sin ningún problema y hasta ahora me ha ido bien.
Para romper esta clase simple en partes como ves, estoy usando el patrón Singleton.
Constructor
es privado yinstance()
y$_instance
pertenece al patrón. El constructor tienespl_autoload_register
función.que es llamar al
load
método de la auto clase. Las dos primeras líneas de este método son:que es bastante directo si sigue WPCS, lo alienta a seguir una convención de nomenclatura de clase con el prefijo word class y luego el nombre de la clase. por supuesto, cualquier guión bajo (_) se reemplaza con un guión (-).
entonces un nombre de archivo de clase
WPSE_Post
seríaclass-wpse-post.php
Menores nombres de clase de carcasa con
strtolower
y usandostr_replace
para reemplazar guiones bajos con guiones. así queWPSE_Post
ahora se hacewpse-post
. finalmente agregando un prefijoclass-
en la siguiente línea.Estoy usando una
is_readable
declaración condicional que es intercambiable confile_exists
. asumiendo queYOUR_PLUGIN_PATH
es la ruta base del complemento yclasses-dir
está bajo el directorio principal del complemento que contiene todas sus clases que necesitan carga automática.include_once
se usa para cargar el archivo real en la llamada.Uso:
solo necesita incluir la clase de cargador automático anterior en el archivo base de su complemento
y luego llame a sus clases a pedido.
Nota: No estoy utilizando el método de espacio de nombres en mi solución, por lo que puede o no ajustarse de acuerdo a sus necesidades, pero publicado aquí con la esperanza de que alguien obtenga al menos los beneficios de cargar clases dinámicamente.
fuente
fuente