require_once otra incluir include_once entre diferencia desde conexion carpeta archivo php import include

otra - incluir archivo php en html



¿Cómo funciona la palabra clave "usar" en PHP y puedo importar clases con ella? (8)

Tengo un archivo con una clase Resp . El camino es:

C:/xampp/htdocs/One/Classes/Resp.php

Y tengo un archivo index.php en este directorio:

C:/xampp/htdocs/Two/Http/index.php

En este archivo index.php 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 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 el use palabras clave? ¿Puedo usarlo para importar clases?


¿Puedo usarlo para importar clases?

No puedes hacerlo así además de los ejemplos anteriores. También puede usar la palabra clave use inside classes para importar traits , como este:

trait Stuff { private $baz = ''baz''; public function bar() { return $this->baz; } } class Cls { use Stuff; // import traits like this } $foo = new Cls; echo $foo->bar(); // spits out ''baz''


Estoy de acuerdo con Green, Symfony necesita espacio de nombres, ¿por qué no usarlos?

Así es como comienza una clase de controlador de ejemplo:

espacio de nombres Acme / DemoBundle / Controller;

use Symfony / Bundle / FrameworkBundle / Controller / Controller;

clase WelcomeController extends Controller {...}


La palabra clave use es para aliasing en PHP y no importa las clases. Esto realmente ayuda
1) Cuando tienes clases con el mismo nombre en diferentes espacios de nombres
2) Evite usar el nombre de clase realmente largo una y otra vez.


Lo más probable es que tenga que usar un cargador automático que tomará el nombre de la clase (rompa por ''/' en este caso) y lo correlacione con una estructura de directorio.

Puede consultar este artículo sobre la funcionalidad de autoloading de PHP. Ya hay muchas implementaciones de este tipo de funcionalidad en frameworks.

De hecho, he implementado uno antes. Aquí hay un link .


No pienses demasiado en lo que es un Namespace .

El espacio de nombres es básicamente un prefijo de clase (como el directorio en el sistema operativo) para garantizar la singularidad de la ruta de clase .

También para aclarar las cosas, la declaración de uso no hace nada solo aliasing de 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:

// You can do this at the top of your Class use Symfony/Component/Debug/Debug; if ($_SERVER[''APP_DEBUG'']) { // So you can utilize the Debug class it in an elegant way Debug::enable(); // Instead of this ugly one // /Symfony/Component/Debug/Debug::enable(); }

Si desea saber cómo funcionan los espacios de nombres de PHP y la carga automática (lo antiguo y lo nuevo con Composer), puede leer la publicación de 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


No, no puedes importar una clase con la palabra clave use . Debe usar la instrucción include / require . Incluso si usa un autocargador PHP, el cargador automático inmóvil tendrá que usar " include o " require internamente".

La palabra clave de propósito de uso :

Considere un caso donde tiene dos clases con el mismo nombre; lo encontrarás extraño, pero cuando trabajas con una gran estructura de MVC, sucede. Entonces, si tiene dos clases con el mismo nombre, colóquelas en diferentes espacios de nombres. Ahora considere cuándo su cargador automático está cargando ambas clases (no require ), y está a punto de usar el objeto de clase. En este caso, el compilador confundirá qué objeto de clase cargar entre dos. Para ayudar al compilador a tomar una decisión, puede usar la declaración de use para que pueda tomar una decisión sobre cuál va a usarse.

Hoy en día, los principales frameworks sí include o require través de composer y psr

1) composer

2) PSR-4

Pasar por ellos puede ayudarte más. También puede usar un alias para abordar una clase exacta. Supongamos que tiene dos clases con el mismo nombre, por ejemplo, Mailer con dos espacios de nombres diferentes:

namespace SMTP; class Mailer{}

y

namespace Mailgun; class Mailer{}

Y si desea usar ambas clases de Mailer al mismo tiempo, entonces puede usar un alias.

use SMTP/Mailer as SMTPMailer; use Mailgun/Mailer as MailgunMailer;

Más adelante en su código, si desea acceder a esos objetos de clase, puede hacer lo siguiente:

$smtp_mailer = new SMTPMailer; $mailgun_mailer = new MailgunMailer;

Hará referencia a la clase original.

Algunos pueden confundirse porque luego no hay nombres de clases similares, entonces no hay uso de la palabra clave use . Bueno, puedes usar la __autoload($class) que se invocará automáticamente cuando se ejecute la instrucción use con la clase para usarla como argumento y esto puede ayudarte a cargar la clase en tiempo de ejecución sobre la marcha cuando sea necesario .

Consulte esta answer para saber más sobre el autocargador de clase.


Tendrás que incluir / requerir la clase de todos modos, de lo contrario PHP no sabrá sobre el espacio de nombres.
No es necesario que tengas que hacerlo en el mismo archivo. Puedes hacerlo en un archivo bootstrap por ejemplo. (o use un autocargador, pero ese no es el tema en realidad)


use no incluye nada Solo importa el espacio de nombre (o clase) especificado al alcance actual

Si desea que las clases se carguen automáticamente, lea sobre autoloading