Recibo este error cuando intento usar la carga automática y los espacios de nombres:
Error fatal: la clase 'Class1' no se encuentra en /usr/local/www/apache22/data/public/php5.3/test.php en la línea 10
¿Alguien puede decirme qué estoy haciendo mal?
Aquí está mi código:
Class1.php:
<?php
namespace Person\Barnes\David
{
class Class1
{
public function __construct()
{
echo __CLASS__;
}
}
}
?>
test.php:
<?php
function __autoload($class)
{
require $class . '.php';
}
use Person\Barnes\David;
$class = new Class1();
?>
AS
. No es por eso que esta solución funciona. También podría hacer:use Person\Barnes\David\Class1;
(que es equivalente ause Person\Barnes\David\Class1 as Class1;
).use Person\Barnes\David\Class1;
para poder hacerlo$class = new Class1();
. Conuse Person\Barnes\David;
debe hacer$class = new David\Class1();
. Lause
palabra clave en sí misma es el equivalente deuse Person\Barnes\David\Class1 as Class1;
ouse Person\Barnes\David as David;
, respectivamente, para cada ejemplo.Como mencionó Pascal MARTIN, debe reemplazar el '\' con DIRECTORY_SEPARATOR, por ejemplo:
También le sugiero que reorganice la estructura del directorio para que el código sea más legible. Esta podría ser una alternativa:
Estructura de directorios:
Expediente:
/ProjectRoot/lib/Person/Barnes/David/Class1.php
Expediente:
/ProjectRoot/test.php
fuente
Su
__autoload
función recibirá el nombre de clase completo, incluido el nombre del espacio de nombres.Esto significa que, en su caso, la
__autoload
función recibirá 'Person\Barnes\David\Class1
', y no solo 'Class1
'.Entonces, tienes que modificar tu código de carga automática, para lidiar con ese tipo de nombre "más complicado"; Una solución que se usa con frecuencia es organizar sus archivos usando un nivel de directorio por "nivel" de espacios de nombres y, cuando se cargue automáticamente, reemplazar '
\
' en el nombre del espacio de nombres porDIRECTORY_SEPARATOR
.fuente
__autoload
función recibirá el nombre de clase completo, incluido el nombre del espacio de nombres" ; esto solo es cierto si hause
d explícitamente la clase a la que está tratando de hacer referencia, no si simplemente hause
d el espacio de nombres al que pertenece. El error del OP fue que habíause
creado el espacio de nombres que contenía una clase y luego esperaba que su función de carga automática pasara mágicamente el classpath completo de alguna manera. Esta respuesta realmente no aborda el error del OP.Hago algo como esto: Ver este ejemplo de GitHub
fuente
Encontré esta joya de Flysystem
fuente
Veo que las funciones de carga automática solo reciben el nombre de clase "completo", con todos los espacios de nombres precediéndolo, en los dos casos siguientes:
Veo que las funciones de carga automática NO reciben el nombre de clase completo en el siguiente caso:
ACTUALIZACIÓN: [c] es un error y no es así como funcionan los espacios de nombres de todos modos. Puedo informar que, en lugar de [c], los siguientes dos casos también funcionan bien:
Espero que esto ayude.
fuente
use
palabra clave no funciona correctamente en la interfaz de línea de comandos interactiva de PHP (php --interactive
);Utilizo este simple truco en una línea:
fuente
tenía el mismo problema y acaba de encontrar esto:
Cuando crea una estructura de subcarpetas que coincida con los espacios de nombres de las clases que las contienen, nunca tendrá que definir un autocargador.
Funcionó a las mil maravillas
Más información aquí: http://www.php.net/manual/en/function.spl-autoload-register.php#92514
EDITAR: esto causa un problema en Linux debido a la barra invertida ... Vea aquí la solución de trabajo de immeëmosol
Autoload del espacio de nombres funciona en Windows, pero no en Linux
fuente
El uso tiene un problema, aunque es, con mucho, el método más rápido, también espera que todos los nombres de archivo estén en minúsculas.
Por ejemplo:
Un archivo que contenga la clase SomeSuperClass debería llamarse somesuperclass.php, esto es un problema cuando se usa un sistema de archivos sensible a mayúsculas y minúsculas como Linux, si su archivo se llama SomeSuperClass.php pero no es un problema en Windows.
El uso de __autoload en su código puede seguir funcionando con las versiones actuales de PHP, pero se espera que esta característica quede obsoleta y finalmente se elimine en el futuro.
Entonces, qué opciones quedan:
Esta versión funcionará con PHP 5.3 y superior y permite los nombres de archivo SomeSuperClass.php y somesuperclass.php. Si usa 5.3.2 y superior, este autocargador funcionará aún más rápido.
fuente
str_replace ([ '_','\\'] '/', $className );
es dos veces más rápido que dos str_replace¡Recientemente encontré la respuesta de tanerkuc muy útil! Solo quería agregar que usar
strrpos()
+substr()
es un poco más rápido queexplode()
+end()
:fuente
Daré mis dos centavos por principiantes relativos o lo que sea que desee una configuración simple de spl_autoload_register () sin toda la teoría: simplemente cree un archivo php para cada clase, nombre ese archivo php igual que el nombre de su clase y mantenga sus archivos de clase en el mismo directorio que su archivo php en cuestión, esto funcionará:
Buscar en Google las piezas dentro de esta función debería responder cómo funciona. PD: uso Linux y esto funciona en Linux. La gente de Windows debería probarlo primero.
fuente
https://thomashunter.name/blog/simple-php-namespace-friendly-autoloader-class/
Querrá poner sus archivos de clase en una carpeta llamada
Classes
, que está en el mismo directorio que el punto de entrada a su aplicación PHP. Si las clases usan espacios de nombres, los espacios de nombres se convertirán a la estructura de directorio.A diferencia de muchos otros cargadores automáticos, los guiones bajos no se convertirán en estructuras de directorio (es complicado hacer PHP <5.3 pseudo espacios de nombres junto con PHP> = 5.3 espacios de nombres reales).
Querrá colocar el siguiente código en su script PHP principal (punto de entrada):
Aquí hay un ejemplo de diseño de directorio:
fuente
fuente