Foros del Web » Programando para Internet » PHP »

PHP OO Mismo directorio y namespace

Estas en el tema de Mismo directorio y namespace en el foro de PHP en Foros del Web. Estoy probando los namespaces para aprender a utilizarlos. Tengo la siguiente estructura de directorios Cita: /xampp/web/pruebas/poo/ [**]aa.php [**]bb.php [**]sub/ [***]sub/cc.php Tengo el siguiente código en ...
  #1 (permalink)  
Antiguo 04/05/2014, 06:00
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Mismo directorio y namespace

Estoy probando los namespaces para aprender a utilizarlos.

Tengo la siguiente estructura de directorios

Cita:
  • /xampp/web/pruebas/poo/
    [**]aa.php
    [**]bb.php
    [**]sub/
    [***]sub/cc.php
Tengo el siguiente código en aa.php, que es el archivo que ejecuto siempre para probar los namespaces, es el que accede a bb.php y cc.php.

Código PHP:
Ver original
  1. //namespace poo
  2.  
  3. Bb::bb();
  4.  
  5. sub\Cc::cc();
  6.  
  7. //si descomento la linea del namespace me devuelve lo siguiente
  8. //Fatal error: Class 'poo\Bb' not found in C:\xampp\htdocs\xampp\web\pruebas\poo\aa.php on line 11

El siguiente código en bb.php

Código PHP:
Ver original
  1. //namespace poo;
  2.  
  3. class Bb {
  4.  
  5.     private function __construct() {
  6.        
  7.     }
  8.  
  9.     static function bb() {
  10.         echo "bb <br>";
  11.     }
  12.  
  13. }
  14.  
  15. //si descomento la linea del namespace en este archivo pero mantengo comentada la de aa.php al ejecutar aa.php me devuelve lo siguiente
  16.  
  17. //Fatal error: Class 'Bb' not found in C:\xampp\htdocs\xampp\web\pruebas\poo\aa.php on line 11

En cc.php tengo este código

Código PHP:
Ver original
  1. namespace sub;
  2.  
  3. class Cc {
  4.  
  5.     private function __construct() {
  6.        
  7.     }
  8.  
  9.     static function cc() {
  10.         echo "cc";
  11.     }
  12.  
  13. }

Entonces el problema está que dos archivos que comparten estructura de directorio no puedo utilizarlos si tienen mismo namespace o uno de ellos tiene un namespace.

¿Cómo puedo resolver esto?

He buscado información y no encuentro por ninguna parte :S
__________________
Ayúdame a hacerlo por mi mismo.
  #2 (permalink)  
Antiguo 05/05/2014, 04:46
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Mismo directorio y namespace

Deberia funcionar si descomentas namespace poo en los ficheros que lo tienen.
Namespaces y directorios no tienen nada que ver.Hacer coincidir namespaces y directorios es una práctica, no un requisito.
  #3 (permalink)  
Antiguo 05/05/2014, 06:32
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Mismo directorio y namespace

Hola dashtrash! gracias por tu ayuda.

He descomentado los namespaces de aa.php y bb.php y me devuelve el siguiente Fatal error

Cita:
Fatal error: Uncaught exception 'LogicException' with message 'Class poo\Bb could not be loaded' in C:\xampp\htdocs\xampp\web\pruebas\poo\aa.php:10 Stack trace: #0 C:\xampp\htdocs\xampp\web\pruebas\poo\aa.php(10): spl_autoload('poo\Bb') #1 {main} thrown in C:\xampp\htdocs\xampp\web\pruebas\poo\aa.php on line 10
Entonces probé a comentar el uso de la clase Bb en aa.php, para utilizar solamente la clase Cc y me devuelve el mismo error pero para la clase Cc

Cita:
Fatal error: Uncaught exception 'LogicException' with message 'Class poo\sub\Cc could not be loaded' in C:\xampp\htdocs\xampp\web\pruebas\poo\aa.php:12 Stack trace: #0 C:\xampp\htdocs\xampp\web\pruebas\poo\aa.php(12): spl_autoload('poo\sub\Cc') #1 {main} thrown in C:\xampp\htdocs\xampp\web\pruebas\poo\aa.php on line 12
Entonces probé use sub; y sí se ejecuta la clase Cc así que intenté use poo; pero me vuelve a arrojar el Fatal error con Bb

No entiendo nada.
__________________
Ayúdame a hacerlo por mi mismo.
  #4 (permalink)  
Antiguo 05/05/2014, 07:17
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Mismo directorio y namespace

spl_autoload_register , sin parámetros (es decir, sin implementar tu propio autoloader), sí que requiere un mapeo entre el sistema de ficheros y los namespaces.Esto es un prerrequisito de esa función , no de los namespaces PHP.Implementa una funcion que haga de autoloader, y que haga el include necesario.
  #5 (permalink)  
Antiguo 05/05/2014, 07:54
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Mismo directorio y namespace

Entonces dashtrash ¿debería poner el código de mi propia funcion autoload para spl_autoload_register() en cada archivo de una clase para poder tener acceso a los namespaces (que, utilizando buenas prácticas, coincidan con su directorio)?

¿Esto no es muy aparatoso?

Porque sino ¿para qué utilizar los use [namespaces] si ya se estaría incluyendo el archivo? :S

Perdón por preguntar, pero estoy aprendiendo esto y soy ignorante al respecto.
__________________
Ayúdame a hacerlo por mi mismo.
  #6 (permalink)  
Antiguo 05/05/2014, 14:23
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Mismo directorio y namespace

Cita:
Iniciado por guardarmicorreo Ver Mensaje
Entonces dashtrash ¿debería poner el código de mi propia funcion autoload para spl_autoload_register() en cada archivo de una clase para poder tener acceso a los namespaces (que, utilizando buenas prácticas, coincidan con su directorio)?

¿Esto no es muy aparatoso?

Porque sino ¿para qué utilizar los use [namespaces] si ya se estaría incluyendo el archivo? :S

Perdón por preguntar, pero estoy aprendiendo esto y soy ignorante al respecto.
Los namespace se utilizan para evitar que exista coincidencia con los nombres de clases y las de terceros. Esto se logra agrupando tu clases en "paquetes" lógicos que no tiene nada que ver con el sistema de archivos de tu S.O.
El autoloader es una forma de ahorrarte el paso de incluir los archivos físicos que contiene dichas clases o funciones.

Y sí, para el autoloader_register necesitas proporcionar tu función o funciones para realizar su tarea y para no hacerte la vida difícil puedes usar dos especificaciones PSR-0 o PSR-4
Otra opción es que uses include y require para evitar el autoload o que implementes tu propia idea de como quieres hacer las cosas
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #7 (permalink)  
Antiguo 05/05/2014, 14:46
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Mismo directorio y namespace

Muchas gracias hhs, pero mi curiosidad principal es saber si no hay alguna manera de registrar la función como una función que esté disponible en todo el sistema sin tener que copiar y pegar ese código en cada archivo.

¿Se puede hacer en PHP?
__________________
Ayúdame a hacerlo por mi mismo.
  #8 (permalink)  
Antiguo 05/05/2014, 15:16
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Mismo directorio y namespace

Cita:
Iniciado por guardarmicorreo Ver Mensaje
Muchas gracias hhs, pero mi curiosidad principal es saber si no hay alguna manera de registrar la función como una función que esté disponible en todo el sistema sin tener que copiar y pegar ese código en cada archivo.

¿Se puede hacer en PHP?
Claro, solo necesitar que el loader sea llamado antes de que comience a ejecutarse tu aplicación. Lo puedes hacer por tu cuenta o puedes usar loaders existentes ya depende de ti.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #9 (permalink)  
Antiguo 06/05/2014, 02:48
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Mismo directorio y namespace

Cita:
Iniciado por guardarmicorreo Ver Mensaje
Entonces dashtrash ¿debería poner el código de mi propia funcion autoload para spl_autoload_register() en cada archivo de una clase para poder tener acceso a los namespaces (que, utilizando buenas prácticas, coincidan con su directorio)?
El código del autoloader lo suelo meter en el archivo startup.php, que se incluye inmediatamente despues del config.php.
Y, si vas a hacer que los namespaces coincidan con las carpetas, no necesitas una implementación del autoload.

Cita:
Iniciado por guardarmicorreo Ver Mensaje
Porque sino ¿para qué utilizar los use [namespaces] si ya se estaría incluyendo el archivo? :S
El incluir el archivo no tiene que ver con el "use"."Use" digamos que importa al namespace actual (que es el global, o el definido al principio de un fichero), los objetos existentes en otro namespace, de forma que los puedes *invocar* como si pertenecieran al namespace actual.
Es sólo una forma de evitar incluir prefijos al hacer referencia a objetos de otro namespace.Pero esos objetos tienen que existir, es decir, haberse incluido previamente, o tener un autoloader que lo gestione.

Cita:
Iniciado por guardarmicorreo Ver Mensaje
Perdón por preguntar, pero estoy aprendiendo esto y soy ignorante al respecto.
Hombre, el foro está pa esto, no?
  #10 (permalink)  
Antiguo 06/05/2014, 05:49
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Mismo directorio y namespace

Entonces ¿solo debo implementar autoload en el archivo que llame a otros archivos del mismo directorio no? porque de momento spl_autoload_register me sirve para utilizar en un archivo de jerarquía de directorio superior una clase de un subdirectorio, como en el ejemplo que puse desde aa.php puedo utilizar la clase en el subdirectorio sub.

no se me ocurre cómo puedo iniciar autoload una sola vez y que los demás archivos se beneficien de ello :S
__________________
Ayúdame a hacerlo por mi mismo.
  #11 (permalink)  
Antiguo 06/05/2014, 16:20
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Mismo directorio y namespace

Cita:
Iniciado por guardarmicorreo Ver Mensaje
no se me ocurre cómo puedo iniciar autoload una sola vez y que los demás archivos se beneficien de ello :S
No sé exactamente a qué te refieres con "iniciar".La función de autoload la "registras".Defines una función (o varias) que debe ser llamada cuando se intenta hacer uso de una clase que no ha sido declarada.No llamas tú a la función.Lo va a hacer PHP (el motor) cada vez que la necesite.
  #12 (permalink)  
Antiguo 06/05/2014, 16:46
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Mismo directorio y namespace

Ejemplos de otras funciones que se "registran" para ejecutarse ante determinados eventos (cierre del programa, ticks, etc) :

http://www.php.net/manual/en/functio...n-function.php
http://www.php.net/manual/en/functio...k-function.php

Ademas de las mencionadas y entre otras.
__________________
Salu2!

Etiquetas: directorio, namespace
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:35.