Tengo un archivo con una clase Resp
. El camino es:
C:\xampp\htdocs\One\Classes\Resp.php
Y tengo un index.php
archivo en este directorio:
C:\xampp\htdocs\Two\Http\index.php
En este index.php
archivo quiero crear una instancia de una clase Resp
.
$a = new Resp();
Sé que puedo usar require
o include
palabras clave para incluir el archivo con una clase:
require("One\Classes\Resp.php"); // I've set the include_path correctly already ";C:\xampp\htdocs". It works.
$a = new Resp();
Pero quiero importar clases sin usar require
o include
. Estoy tratando de entender cómo use
funciona la palabra clave. Intenté estos pasos pero nada funciona:
use One\Classes\Resp;
use xampp\htdocs\One\Classes\Resp;
use htdocs\One\Classes\Resp;
use One\Classes;
use htdocs\One\Classes; /* nothing works */
$a = new Resp();
Dice:
Fatal error: Class 'One\Classes\Resp' not found in C:\xampp\htdocs\Two\Http\index.php
¿Cómo funciona la palabra clave use
? ¿Puedo usarlo para importar clases?
namespace
s. De hecho, no hay ningún Symfony si no usa espacios de nombresRespuestas:
use
no incluye nada Solo importa el espacio de nombres (o clase) especificado al ámbito actualSi desea que las clases se carguen automáticamente, lea sobre carga automática
fuente
No, no puede importar una clase con la
use
palabra clave. Tienes que usarinclude
/require
declaración. Incluso si usa un cargador automático PHP, el cargador automático tendrá que usarlo de manera internainclude
orequire
interna.El propósito de la palabra clave de uso :
Considere un caso en el que tiene dos clases con el mismo nombre; Le resultará extraño, pero cuando trabaja con una gran estructura MVC, sucede. Entonces, si tiene dos clases con el mismo nombre, colóquelas en espacios de nombres diferentes. Ahora considere cuándo su cargador automático está cargando ambas clases (hace por
require
) y está a punto de usar el objeto de clase. En este caso, el compilador se confundirá qué objeto de clase cargar entre dos. Para ayudar al compilador a tomar una decisión, puede usar eluse
declaración para que pueda tomar una decisión sobre cuál se va a usar.Hoy en día los principales marcos hacen uso
include
orequire
víacomposer
ypsr
1) compositor
2) PSR-4 cargador automático
Revisarlos puede ayudarte más. También puede usar un alias para abordar una clase exacta. Supongamos que tiene dos clases con el mismo nombre, digamos
Mailer
con dos espacios de nombres diferentes:y
Y si desea usar ambas clases de Mailer al mismo tiempo, puede usar un alias.
Más adelante en su código, si desea acceder a esos objetos de clase, puede hacer lo siguiente:
Hará referencia a la clase original.
Algunos pueden confundirse porque entonces no hay nombres de clase similares, entonces no hay uso de
use
palabras clave. Bueno, puedes usar la__autoload($class)
función que se llamará automáticamente cuandouse
instrucción se ejecute con la clase que se usará como argumento y esto puede ayudarlo a cargar la clase en tiempo de ejecución sobre la marcha cuando sea necesario.Consulte esta respuesta para saber más sobre el autocargador de clases.
fuente
use
declaración indicará que el compilador carga esto para mí ahora. Lo tengo querido!No pienses demasiado en qué es un espacio de nombres .
El espacio de nombres es básicamente un prefijo de clase (como el directorio en el sistema operativo) para garantizar la clase unicidad de la ruta de .
También solo para aclarar las cosas, el uso declaración de no hace nada solo alias sus espacios de nombres para que pueda usar accesos directos o incluir clases con el mismo nombre pero diferentes espacios de nombres en el mismo archivo.
P.ej:
Si desea saber cómo funcionan los espacios de nombres PHP y la carga automática (la manera antigua y la nueva con Composer), puede leer la publicación del blog que acabo de escribir sobre este tema: https://enterprise-level-php.com/ 2017/12/25 / the-magic-behind-autoloading-php-files-using-composer.html
fuente
Tendrá que incluir / requerir la clase de todos modos, de lo contrario, PHP no sabrá sobre el espacio de nombres.
Sin embargo , no es necesario que lo haga en el mismo archivo. Puede hacerlo en un archivo de arranque, por ejemplo. (o use un cargador automático, pero ese no es el tema en realidad)
fuente
El problema es más probable que necesite usar un cargador automático que tomará el nombre de la clase (separe por '\' en este caso) y lo asigne a una estructura de directorio.
Puedes consultar este artículo sobre carga automática funcionalidad de de PHP. Ya hay muchas implementaciones de este tipo de funcionalidad en frameworks.
De hecho, he implementado uno antes. Aquí hay un enlace .
fuente
Estoy de acuerdo con Green, Symfony necesita un espacio de nombres, ¿por qué no usarlos?
Así es como comienza una clase de controlador de ejemplo:
fuente
No puedes hacerlo así además de los ejemplos anteriores. También puede usar la palabra clave
use
dentro de las clases para importar rasgos , como este:fuente
La
use
palabra clave es para crear alias en PHP y no importa las clases. Esto realmente ayuda1) Cuando tienes clases con el mismo nombre en diferentes espacios
de nombres 2) Evita usar el nombre de clase realmente largo una y otra vez.
fuente
El espacio de nombres se utiliza para definir la ruta a un archivo específico que contiene una clase, por ejemplo
Luego puede incluir esta clase específica en otro archivo php utilizando la palabra clave "use" de esta manera:
NOTA: No use la ruta al archivo que contiene la clase que se implementará, extiende el uso para crear una instancia de un objeto, sino solo use el espacio de nombres.
fuente
Usar la palabra clave "use" es para acortar literales de espacios de nombres. Puede usar ambos con alias y sin él. Sin alias, debe usar la última parte del espacio de nombres completo.
fuente