Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

include / import

Estas en el tema de include / import en el foro de Frameworks y PHP orientado a objetos en Foros del Web. estuve viendo el tema Programacion a 3 capas PHP pero quede un poco perdido, tengo definido lo siguiente: Cita: /SYS | - index.php | + ...
  #1 (permalink)  
Antiguo 10/05/2008, 20:34
 
Fecha de Ingreso: marzo-2008
Mensajes: 45
Antigüedad: 16 años, 8 meses
Puntos: 0
include / import

estuve viendo el tema Programacion a 3 capas PHP
pero quede un poco perdido, tengo definido lo siguiente:

Cita:
/SYS
| - index.php
| + Presentacion
| + Negocio
| - Persona.php
| - ...
| + Acceso Dato
| - PostgreSQL.php

ahora bien puedo dentro de la clase prueba.php incluir la clase Persona.php ke esta dentro de la carpeta Negocio ??

saludos
  #2 (permalink)  
Antiguo 11/05/2008, 15:26
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 21 años
Puntos: 8
Re: include / import

Persona debiera de ir en el modelo, te recomiendo que leas sobre MVC

Última edición por zsamer; 12/05/2008 a las 07:42
  #3 (permalink)  
Antiguo 12/05/2008, 06:33
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años, 6 meses
Puntos: 32
Re: include / import

Antes que te metas en "aguas profundas" (como el tema MVC ) lo que tienes que tener en cuenta que una arquitectura de 3 capas se puede hacer perfectamente con 3 directorios, donde en cada uno colocas clases que hace una taréa específica de acuerdo a la responsabilidad de esa capa.

Es decir, podrías tener algo como:

presentación/
-> Html.class.php

dominio/
-> Persona.class.php

persistencia/
-> PersonaPersistente.class.php
-> BaseDeDatos.class.php


La diferencia entre las clases "Persona" es que en dominio solo trata cosas de más alto nivel relacionadas con la "lógica de negocio" pero cuando quiere persistir información o recuperarla, habla con su par "Persona" de la capa de persistencia, que resuelve todo lo que tiene que ver con la base de datos y la "persona".

Es un "pasamanos", pero te aseguras que en cada capa se haga una actividad concreta distinta de la otra.

presentación -> dominio -> persistencia

En algún momento verás que parecerá "redundante" pero el tema es que será así cuando el sistema es muy pequeño, pero cuando entres a crecer, será fundamental para bajar y tener contenido el crecimiento de la complejidad.

Nota:
otro agregado que se puede hacer es una clase "fachada" que recibe todas las peticiones sobre la capa / paquete y las contesta, simplificando la dependencia contra muchas clases del paquete (siempre alquien que use el paquete irá contra la fachada).
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #4 (permalink)  
Antiguo 12/05/2008, 06:59
 
Fecha de Ingreso: marzo-2008
Mensajes: 45
Antigüedad: 16 años, 8 meses
Puntos: 0
Re: include / import

enriqueplace, esactamente lo que tengo creado son carpetas asi mismo como dices, pero lo que no se es como hago referencia a las clases que estan dentro de ellas..
ejemplo en presentacion como puedo incluir o importar(no se cual de los dos se debe usar)una clase que esta en dominio..
saludos
  #5 (permalink)  
Antiguo 12/05/2008, 07:59
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años, 6 meses
Puntos: 32
Re: include / import

"Importar" no existe en PHP, solo incluir o requerir. Yo te recomiendo para el caso de "objetos" hagas siempre un require_once, ya que pueden clases requerir la misma clase y con esto solo te ejecuta el primer requiere y no te da ningún error.

Una opción simple es crear un archivo de configuración tipo "configuracion.php" que defina las rutas relativas para las tres capas / paquetes. Luego, en cada paquete te creas un "configuracion.php" que apunte al real en la raiz ( require_once ('../configuracion'); ) y haces que todas las clases siempre requieran un configuracion.php en su mismo nivel (require('configuracion.php');).

Por consiguiente, no importa desde donde llames las clases, siempre irán al único configuracion.php y este define las rutas.

Y listo.

Si estás en Html.class.php puedes hacer:

[capa presentación]


Código PHP:
<?php
require('configuracion.php');
require_once( 
DOMINIO '/Usuario.class.php' );

class 
Html{
   public function 
listadoUsuarios(){
      
      
$usuario = new Usuario();
      
$usuarios $usuario->getAll();

      
// generación de html para el listado de usuarios
   
}

}
?>
[capa dominio]

Código PHP:
<?php
require('configuracion.php');
require_once( 
PERSISTENCIA '/UsuarioPersistente.class.php' );

class 
Usuario{
   public function 
getAll(){
      
$usuario = new UsuarioPersistente();
      return 
$usuario->getAll();
   }
}
?>
[capa persistencia]

Código PHP:
<?php
require('configuracion.php');
require_once( 
PERSISTENCIA '/BaseDeDatos.class.php');

class 
UsuarioPersistente{
   public function 
getAll(){
      
$bd = new BaseDeDatos();
      return 
$bd->query('SELECT * FROM usuarios');
   }
}
?>
Algo así, lo escribí en caliente, puede tener errores .
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #6 (permalink)  
Antiguo 12/05/2008, 08:17
 
Fecha de Ingreso: marzo-2008
Mensajes: 45
Antigüedad: 16 años, 8 meses
Puntos: 0
Re: include / import

enriqueplace, entendi la parte de los require_once, pero lo que no entiendo bien es el fichero configuracion.php .. me puedes poner ejemplo...

gracias
  #7 (permalink)  
Antiguo 12/05/2008, 08:26
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años, 6 meses
Puntos: 32
Re: include / import

En el archivo de configuracion.php deberás colocar las constantes para ubicar cada capa / paquete / directorio, y luego todo lo que necesite tu aplicación.

configuracion.php

Código PHP:
<?php
define
('HOME',$_SERVER[DOCUMENT_ROOT]);
define('APLICA',HOME."/aplicacion");

define('DOM',APLICA."/dominio");
define('PRE',APLICA."/presentacion");
define('PER',APLICA."/persistencia");
?>
Lo de los configuracion.php en cada directorio es un pequeño truco para saltearte el problema de las invocaciones de PHP que cambian según desde donde las hagas.

Con el tema de los "namespace" de PHP, este tema debería quedar resuelto (hay que esperar que los servidores de hosting también actualicen sus versiones).
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #8 (permalink)  
Antiguo 12/05/2008, 09:58
 
Fecha de Ingreso: marzo-2008
Mensajes: 45
Antigüedad: 16 años, 8 meses
Puntos: 0
Re: include / import

ese fichero seria el mismo para cada carpeta??
  #9 (permalink)  
Antiguo 12/05/2008, 10:01
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años, 6 meses
Puntos: 32
Re: include / import

Lee bien la explicación anterior... solo hay un configuracion.php "real" en la raiz, el resto son configuración.php "falsos" que existen físicamente pero que apuntan al real.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #10 (permalink)  
Antiguo 12/05/2008, 19:30
 
Fecha de Ingreso: marzo-2008
Mensajes: 45
Antigüedad: 16 años, 8 meses
Puntos: 0
Re: include / import

enriqueplace, volvi a leer lo ke posteas arriba, ahora me surge la duda en esta linea de codigo:

<?php
define('HOME',$_SERVER[DOCUMENT_ROOT]);
define('APLICA',HOME."/aplicacion");

define('DOM',APLICA."/dominio");
define('PRE',APLICA."/presentacion");
define('PER',APLICA."/persistencia");
?>
el document_root es una variable global o tengo ke sustituirla pr la dir de mi sitio?

gracias de nuevo
  #11 (permalink)  
Antiguo 12/05/2008, 21:35
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Re: include / import

Hola yellow1984,

Es una variable que apunta al document root donde están tus archivos.

Saludos.
  #12 (permalink)  
Antiguo 13/05/2008, 06:36
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años, 6 meses
Puntos: 32
Re: include / import

Estimado, aquí es la parte donde debo dejar de "darte de comer en la boca" y que empieces "a pescar por ti mismo"... buscar RTFM
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #13 (permalink)  
Antiguo 13/05/2008, 19:23
 
Fecha de Ingreso: marzo-2008
Mensajes: 45
Antigüedad: 16 años, 8 meses
Puntos: 0
Re: include / import

gracias gatorV y enriqueplace .. me funciono ok
  #14 (permalink)  
Antiguo 25/06/2008, 21:34
 
Fecha de Ingreso: noviembre-2006
Mensajes: 9
Antigüedad: 18 años
Puntos: 0
Respuesta: include / import

Una preguntaa en el ejemplo que puso Enrique acerca de 3 capas .. por ejemplo Listarusuarios tendria k hacer una clase usuario por cada capa para persistencia ,dominio y que pasaria si qusiera programar ListarFactura ... pregunto tendria que hacer la clase Factura para cada capa dominio y persistenacia ??? y asi fuera siempre ?????? con los demas¿?? osea estaria llenando un monton de archivos clases usuario,factura,ordendecompra,provvedores esa misma cantidad de archivos tendria k ir para capa dominio y persistencia??? si fuera por ejemplo un sistema de compras pekeño :S?'' osea no creen que es demasiado archivos clases :S? o nose porfa sakenme de la duda ....


yo plantearia asii ...

capa presentacion listarcliente.php,agregarfactura.php,modificarfact ura.php oentre los dos ultimos seria mantenimientofactura.php


capa dominio .-. crearia la clase CLiente,Clase FActura ,Clase ORden
cada clase con sus funciones de agregar,moficar,listar,etc
donde por ejemplo agarrando ..

class Cliente
{
// ago las instancias requiere_once --- configuracion y de la otra capa persistencia
function Listar()
{
obj=new Data();
$sql = mandaria un "store procedure" si tubiera parametros tamb.. o una sentencia sql
return obj->query($sql);

}
}

y en la Capa Persistencia .-

Clss Data
{
var $idCon;
function __construct()
{

$idCon=mysql_connect("localhost","root","1234"));


mysql_select_db("empresa",$idCon);

}
function query($sql)
{

$result=mysql_query($sql,$idCon);
return $result;

}

}


bueno la idea algo asi para tener un solo archivo en la capa Data la cual se puede mejorar para poderse conectar con varias base de datos ,,...... peroo asi en la Capa dato solo se llamara funciones de agregar, listar, eliminar pasando con parametros array() asi en la capa dominio solo ahi se tendria k crear las clases que tendrias que utilzar y pasarle el nombre del store procedure con parametros si tiene claro .... y asi sucesivamente en este ejemplo con la clase Factura,Clase Orden , etcc etcc ..

bueno espero me capten la idea ..... me gustaria saber sii mi logica esta mall y si se puede mejorar algo con mi logica y ponerlo llevar ala practica y sobre todo utilizar store procedure con parametros espero amigos del foro me puedan ayudar =D y dejar en claro a todos =) ...


Espero su respuesta y una replantacion =)
  #15 (permalink)  
Antiguo 26/06/2008, 06:57
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años, 6 meses
Puntos: 32
Respuesta: include / import

Cita:
Iniciado por merkslay Ver Mensaje
Una preguntaa en el ejemplo que puso Enrique acerca de 3 capas .. por ejemplo Listarusuarios tendria k hacer una clase usuario por cada capa para persistencia ,dominio y que pasaria si qusiera programar ListarFactura ... pregunto tendria que hacer la clase Factura para cada capa dominio y persistenacia ??? y asi fuera siempre ?????? con los demas¿?? osea estaria llenando un monton de archivos clases usuario,factura,ordendecompra,provvedores esa misma cantidad de archivos tendria k ir para capa dominio y persistencia??? si fuera por ejemplo un sistema de compras pekeño :S?'' osea no creen que es demasiado archivos clases :S? o nose porfa sakenme de la duda ....
Conceptualmente hablando, siempre tendrás un representante en cada capa, de la misma forma que lo haría el modelo OSI (de redes) donde cada capa le pasa a la otra un paquete hasta que el paquete llega a la capa que le corresponder procesar (un "pasamanos").

También, conceptualmente hablando, no necesariamente tienes que tener una clase por cada tema, ya que ahí está el punto de la POO, tú tienes que componen objetos que contienen a su vez otros objetos. No es POO tener por cada tema un objeto suelto que no se relaciona con nadie más.

En lo que respecta al tamaño de los sistemas, la primera impresión es así cuando haces un sistema pequeño, parece que todo esto es "una sobrecarga innecesaria", pero cuando tu sistema inmediatamente empieza a crecer el diseño de 3 capas es indispensable para tener desacoplado cada tema (presentación, dominio y persistencia).

Cita:
Iniciado por merkslay Ver Mensaje
yo plantearia asii ...

capa presentacion listarcliente.php,agregarfactura.php,modificarfact ura.php oentre los dos ultimos seria mantenimientofactura.php


capa dominio .-. crearia la clase CLiente,Clase FActura ,Clase ORden
cada clase con sus funciones de agregar,moficar,listar,etc
donde por ejemplo agarrando ..


Código PHP:
class Cliente
{
 
// ago las instancias requiere_once --- configuracion y de la otra capa persistencia
function Listar()
{
 
obj=new Data();
 
$sql mandaria un "store procedure" si tubiera parametros tamb.. o una sentencia sql
 
return obj->query($sql);
 
}

Estaría todo bien hasta la parte donde metes el sql en una clase del dominio, ya que esto es responsabilidad pura y exclusivamente de la persistencia.

Cita:
Iniciado por merkslay Ver Mensaje
y en la Capa Persistencia .-


Código PHP:
Clss Data
{
var 
$idCon;
    function 
__construct()
    {
           
        
$idCon=mysql_connect("localhost","root","1234"));
       
           
        
mysql_select_db("empresa",$idCon);
                        
    }
    function 
query($sql)
    {
       
        
$result=mysql_query($sql,$idCon);
        return 
$result;   
               
    }


Podría ser, pero para lograr lo anterior y que en dominio no exista "sql" deberías tener una clase Cliente que quiera persistir, pero que llame a una clase ClientePersistente en la capa de persistencia que reciba todos los datos y haga la consulta sql, es más, tal vez debería la clase usar la clase Data (o similar) y pasarle la consulta, así cada clase tiene una responsabilidad única y no varias.

Cita:
Iniciado por merkslay Ver Mensaje
bueno espero me capten la idea ..... me gustaria saber sii mi logica esta mall y si se puede mejorar algo con mi logica y ponerlo llevar ala practica y sobre todo utilizar store procedure con parametros espero amigos del foro me puedan ayudar =D y dejar en claro a todos =) ...
Espero su respuesta y una replantacion =)
Lo de store procedure está fuera del tema que estamos hablando, es independiente de las 3 capas.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #16 (permalink)  
Antiguo 01/07/2008, 17:11
 
Fecha de Ingreso: noviembre-2006
Mensajes: 9
Antigüedad: 18 años
Puntos: 0
Respuesta: include / import

Amigos .. lei sobre front controllers pero no me quedo claro algunas cosas al momento de organizar mi forma de trabajooo..

por ejemplo....tengo un index.php pagina que solo sera la unica entrada por la cual sera manejada mediante acciones que el usuario realize la pagina por ejemplo (noticias,pedidosmusicales,agenda grupal) trato de hacer un mantenimiento por cada una de ellas tanto agregar,modificar y eliminar..

para esooo despues de lo que me comentaste de trabajar con las capas y el controlador ise estoo..

proceso del pedido o accion del cliente
1.-accion: listar Noticia (esta accion por defecto se ejecuta aldar clik enel boton Noticias)

2.-redirecciona index.php al FrontController la cual a su vez ase otro redireccionamiento al CONTROL ESPECIFICO llamado "NoticiasController.php" la cual es una clasee con funciones(agreggarnoticia,listarnoticia,actualizar noticia,etc) , como la accion por defecto es listarnoticia llama la funcion "Listarnoticia" de esa clase la cual contiene esto formato :
nota:este controlador solo hacer redireccionamiento
noticiacontroller.php
Class NoticiasCOntroller

// declaraciones
public function agregarnoticia {}
public function modificarnoticia {}
public funcion ListarNoticia
{
// codigo de include la cual llamara al objeto clase "noticia" la cual esta clase esta en una carpeta aparte y se comporta como capa llamada capa Dominio

//llama a la funcion.... correspondiente
// y llama la a vistaa o pagina solo para mostrar el resultado "Listarnoticias.php"
}

capa dominio-------- es is es una carpeta
ClsNoticia.php : es una clase de la capa dominio la cual contienen:
include(../persistencia/ClsData.php)
class noticia
{
//declaraciones
public function listarnoticia
{
$sql="select * from noticias"
objdata= new consultar($sql)
return objdata;
// puede tener fallas de codigo ya que solo recalco mi ideaa en este ejemplito
}
}


-----Capa Persitencia----------
:s una carpeta llamda persisnteica donde solo tengo una archivo clase llamado "ClsData"

ClsData.php

class ClsData
{
// declaraciones
public function consultar($sql)
{
conec=mysql_conection
obj=mysql_result($sql,conec)
return obj;

/// tambien el codigo faltaa corregir pero es la idea de esta capaa retorna conteniendo en un array la cualtamb me falto declarar como array =P jajaja pero la idea es esa..
}

luego ase el retornooo hasta la capa dominio y este la controlador donde el controlador como mencione en una de su funciones busca la plantilla "listarnoticias.php" y muestraa al naveganteee con todas las noticias registradas en su base de datos =D ..

pregunto amigos de este foro estara bien mi forma de organzacion de trabajo? o parece que estoy programando de mas?? algoque se pueda mejorar?? para no hacer tanto codigoo mas que todo en lso controllers pork parece que tendre que hacer POR ACCION UN CONTROLLER especifico DIFERENTE :s? y el front controoller en este caso solo redirecciona alos controllers especificos :S? o es la misma defincion porfaaaa ayudamee en estas preguntas talves con tu ayuda podria mejorar esto =) k tengo de duda antes de emepezar a programar .. muchas gracias espero tus respuestas =D
Atte Mario


}
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.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 14:54.