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

Uso de clases en PHP

Estas en el tema de Uso de clases en PHP en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Saludos de nuevo... Tengo que realizar una página que emita por ejemplo un albarán. En su primer paso se designa el cliente al que se ...
  #1 (permalink)  
Antiguo 24/05/2005, 04:47
 
Fecha de Ingreso: mayo-2005
Mensajes: 44
Antigüedad: 18 años, 11 meses
Puntos: 0
Uso de clases en PHP

Saludos de nuevo...

Tengo que realizar una página que emita por ejemplo un albarán. En su primer paso se designa el cliente al que se le realiza el mismo. Mis dudas serían

cómo debería definir los datos tanto de este albarán como del cliente? con clases?

es decir 2 clases

1 clase albarán con propiedades cliente, aparato, averias(q seria un array).
1 clase cliente con propiedades dni, telefono, apellidos etc

lo pregunto por que sólo se editaria desde una sesión un solo albarán perteneciente a un mismo albarán. Es mejor hacer esto con clases o definiendo directamente arrays?

Otra duda... dónde se almacenan los datos de la clase? se pueden almacenar como parte de la sesión vaya bajo $_SESSION?

Es que nunca he usado clases pero las veo muy interesantes.
  #2 (permalink)  
Antiguo 24/05/2005, 04:54
 
Fecha de Ingreso: mayo-2005
Mensajes: 44
Antigüedad: 18 años, 11 meses
Puntos: 0
Bueno sigo monologeando... a ver que os parece esto
[PHP]

<?
class c_albaran
{
var $cliente;
var $aparato;
var $averia;
}

ahora la duda que me surge es... cómo relaciono el albarán con el cliente?

class c_cliente
{
var $cod_cliente;
var $nombre;
var $dni;
}
  #3 (permalink)  
Antiguo 24/05/2005, 05:02
 
Fecha de Ingreso: diciembre-2003
Mensajes: 213
Antigüedad: 20 años, 4 meses
Puntos: 0
Desde luego si te vas a lanzar a trabajar con clases me parece una gran elección. Los objetos son estructuras mucho mas modulares y abstractas que cualquier otra estructura, pero ten en cuenta que un objeto (instancia de una clase) contempla tanto propiedades como metodos asociados (Funciones a aplicar sobre esa clase) y en tu caso dado que por lo que dices solo quieres realizar una estructura de datos sin funciones asociadas no se si te merecera la pena. Aun como trabajar con objetos en php es bastante fácil y tu ejemplo es bastante sencillo estaría bien que lo hicieras para aprender una cosilla mas no?

¿Que donde se almacenan los datos de la clase? Pues se almacenan en la memoria principal, vamos, que son como una variable de php y cuando termina el script se van a la mier...

Si quieres lo que puedes hacer es que en el constructor de la clase (Si no sabes que es esto preguntame) coger los datos desde $_SESSION hasta los atributos de la clase.

Pero para guardarlos en la sesion antes de que el objeto sea destruido (Por ejemplo fin de la ejecucion del script) tienes que hacerlo en el destructor de la clase, pero lo malo es que php4 no contempla destructores (PHP5 sí), asi que deberás hacerlo tu explicitamente mediante una función.

Pues espero haberme explicado bien y nop haberme equivocado (Que todo puede ser)
Si quieres cualquier cosa pregunta, que estoy aburrido y asi me entretengo.
  #4 (permalink)  
Antiguo 24/05/2005, 05:03
 
Fecha de Ingreso: diciembre-2003
Mensajes: 213
Antigüedad: 20 años, 4 meses
Puntos: 0
El caso es que en cuanto me hablas de albaranes y clientes se me vienen a la cabeza las bases de datos.
  #5 (permalink)  
Antiguo 24/05/2005, 05:08
 
Fecha de Ingreso: diciembre-2003
Mensajes: 213
Antigüedad: 20 años, 4 meses
Puntos: 0
Ah! y se me olvidaba decirte que aqui hay un foro especifico de PHP-Objetos
  #6 (permalink)  
Antiguo 24/05/2005, 05:33
 
Fecha de Ingreso: mayo-2005
Mensajes: 44
Antigüedad: 18 años, 11 meses
Puntos: 0
Vaya... que desaparezcan con el script me resulta un inconveniente bah... y no hay algun tipo de estructura que pueda guardarse en $_SESSION?...

en realidad las funciones para las clases las guardaba para más adelante cómo por ejemplo emitir yo que se un pdf con el albarán completo.
  #7 (permalink)  
Antiguo 24/05/2005, 05:39
 
Fecha de Ingreso: diciembre-2003
Mensajes: 213
Antigüedad: 20 años, 4 meses
Puntos: 0
en Session puedes guardar cualquier otra estructura de datos (Con lo de guardar un objeto entero si te digo la verdad me has hecho dudar, pero creo que no), aun asi ya te digo que lo que son los atributos del objeto SI los puedes guardar en la sesion. para asi recuperarlos cuando quieras, y asi por lo tanto realmente es como si recuperaras el objeto entero, ya que los atributos son lo unico que cambian en tiempo de ejecucion. Las funciones digamos que no hace falta guardarlas en ningun sitio, cuando vulvas a instanciar el objeto las funciones siguen estando declaradas, no se si me entiendes.
  #8 (permalink)  
Antiguo 24/05/2005, 05:48
 
Fecha de Ingreso: diciembre-2003
Mensajes: 213
Antigüedad: 20 años, 4 meses
Puntos: 0
Como se hace lo de emitir PDF´s y asi nos ayudamos mutuamente, mira , voy a hacer un esbozo de lo que quieres hacer.

<?
class c_albaran
{
var $cliente;
var $aparato;
var $averia;

//Esto es el constructor. El constructor se lanza automaticamente cuando creas
//una "variable" de la clase albaran
function c_albaran()
{
$this->cliente=$_SSESION["CLIENTE"];
$this->aparato=$_SSESION["CLIENTE"];
.........

}

//Destructor(PHP4, hay que lanzarlo "manualmente")
function destruir_albaran()
{
$_SESSION["CLIENTE"]=$this->cliente
..............
}

}


//Para usarlo:

session_start();

$MiAlbaran=new c_albaran(); //Aqui se ejecutara el constructor

//haces lo que sea con el albaran

//y por ultimo llamas a la funcion destructora para salvar los datos en la sesion

$MiAlbaran->Destruir_albaran();



//Algo asi
  #9 (permalink)  
Antiguo 24/05/2005, 09:06
 
Fecha de Ingreso: mayo-2005
Mensajes: 44
Antigüedad: 18 años, 11 meses
Puntos: 0
Muchas gracias por las molestias kurlax. Una duda... a ver el constructor que es una función o método de la clase que lleva el mismo nombre y que se ejecuta automaticamente 1 vez?
  #10 (permalink)  
Antiguo 24/05/2005, 09:29
 
Fecha de Ingreso: diciembre-2003
Mensajes: 213
Antigüedad: 20 años, 4 meses
Puntos: 0
Tu lo has dicho
  #11 (permalink)  
Antiguo 24/05/2005, 13:33
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
El constructor en PHP4 lleva el mismo nombre de la clase. En PHP5 el método se llama __construct().

En PHP sí es posible (y recomendable), guardar los objetos en variables de sesión, en lugar de estar guardando uno por uno los atributos. El objeto se serializa al guardarlo y se desserializa al recuperarlo. Todo este proceso es automático.

Pero recuerda que una sesión dura mientras el usuario esté navegando por tu sitio. Cuando el usuario cierre su navegador o se vaya a otra página la sesión se hará inaccesible y perderás todos los datos almacenados en ella.

Si quieres que tus objetos persistan más allá de una sesión, deberás recurrir a una base de datos. ¿Cómo guardar los objetos en una Base de datos relacional?... es un tema complejo, pero existen varios patrones de "mapeo de objetos a tablas" (y viceversa). así que es por ahí por donde debes averiguar.

Saludos
  #12 (permalink)  
Antiguo 24/05/2005, 15:29
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Algo más a tener en cuenta:
Si vas a guardar los objetos directamente en variables de sesión,debes considerar que hay que incluir la definición de la clase antes de hacer el session_start().
Puedes ver este tema donde se tratan algunos problemas dervados:
http://www.forosdelweb.com/f68/tengo-problemillas-con-objetos-sesiones-ayudemme-pls-273659/

Saludos
  #13 (permalink)  
Antiguo 25/05/2005, 01:27
 
Fecha de Ingreso: mayo-2005
Mensajes: 44
Antigüedad: 18 años, 11 meses
Puntos: 0
Logicamente los datos se almacenan en una base de datos al efecto. La idea es que por ejemplo el albarán pueda tratarse como un bloque... que visualmente me aclara mucho las estructuras. Y poder programar métodos como el guardar el albarán... el cargarlo o incluso imprimirlo.

1 saludo y gracias voy al lío
  #14 (permalink)  
Antiguo 26/05/2005, 10:17
 
Fecha de Ingreso: mayo-2005
Mensajes: 44
Antigüedad: 18 años, 11 meses
Puntos: 0
Bueno sigo con el tema a ver si podeis ayudarme

Código PHP:
class c_albaran
{
    var 
$cliente;
    var 
$aparato;
    var 
$averia;

//constructor
function c_albaran ()
    {
        
$this->cliente=new c_cliente;
    }
}


class 
c_cliente
{
    var 
$cod_cliente;
    var 
$nombre;
    var 
$dni;
    var 
$apellido1;
    var 
$apellido2;
    var 
$telefono;
    var 
$direccion;

fijaos en el $this->cliente=new c_cliente();

Estoy intentando que cuando creo una nueva instancia de c_albaran cree a su vez una instancia de tipo c_cliente. Pero me asalta una duda, es correcto hacerlo así? porque a ver el constructor se ejecutará en cada declaración no? o lo que es lo mismo cada vez que se recargue la página...

EDITO:

Estoy pasandolo a código y veo que puede reconocer el contenido de las instancias en todas las páginas asi que supongo que lo que pongo arriba está correcto.

jpinedo gracias por aclarar que se pueden guardar los objetos via $_SESSION. Era realmente lo que estaba buscando.

Por cierto todo esto vino pq no conseguía hacer un struct en php... no existen o ke?

La verdad es q ahora mismo estoy entusiasmado con las clases.

Última edición por elmasvital; 26/05/2005 a las 10:29
  #15 (permalink)  
Antiguo 27/05/2005, 01:06
 
Fecha de Ingreso: diciembre-2003
Mensajes: 213
Antigüedad: 20 años, 4 meses
Puntos: 0
Si, tienes razon, el constructor "saltara" cada vez que se recargue la pagina, pero si en el constructor del cliente a su vez coges los datos adecuados, pues no hay problema.

Ah y recuerda que lo de guardar los objetos en la sesion el otro chaval dijo que solo era para php5!!!!!!

Asi que asegurate muy bien de qué version tienes instalada.
  #16 (permalink)  
Antiguo 27/05/2005, 09:57
 
Fecha de Ingreso: mayo-2005
Mensajes: 44
Antigüedad: 18 años, 11 meses
Puntos: 0
Pues uso easyphp con php 4.3.10 y funciona de lujo lo de guardarlo en $_SESSIONS pruebalo

Código PHP:
$_SESSION['new_albaran']=new c_albaran
Lo que ya no consigo que funcione es

Código PHP:
unset($_SESSION['new_albaran']); 
no descarga el objeto he puesto una pregunta en el foro pero nadie parece haberle ocurrido
  #17 (permalink)  
Antiguo 27/05/2005, 10:25
Avatar de sism82  
Fecha de Ingreso: octubre-2003
Ubicación: Guadalajara
Mensajes: 865
Antigüedad: 20 años, 6 meses
Puntos: 1
como que no descarga el objeto?
unset se encarga de eliminar por completo la variable de la tabla de símbolos y liberar la memoria que tenía asignada. Que es lo que deseas?
  #18 (permalink)  
Antiguo 27/05/2005, 10:37
 
Fecha de Ingreso: mayo-2005
Mensajes: 44
Antigüedad: 18 años, 11 meses
Puntos: 0
Cita:
Iniciado por sism82
como que no descarga el objeto?
unset se encarga de eliminar por completo la variable de la tabla de símbolos y liberar la memoria que tenía asignada. Que es lo que deseas?

Pues que imprimo algun valor del antiguo objeto y resulta que no solo existe el objeto sino que tiene sus valores antiguos

PROBAD ESTO PLEASE

Código PHP:
<?
class c_albaran
{
    var 
$cliente;
    var 
$aparato;
    var 
$averia;

    
//constructor
    
function c_albaran ()
    {
        
$this->cliente=new c_cliente;
        
$this->aparato=new c_aparato;
    }


}

class 
c_cliente
{
    var 
$cod_cliente;
    var 
$nombre;
    var 
$dni;
    var 
$apellido1;
    var 
$apellido2;
    var 
$telefono;
    var 
$direccion;
}

class 
c_aparato
{
    var 
$cod_aparato;
    var 
$tipo_aparato;
    var 
$marca;
    var 
$modelo;
    var 
$num_serie;
}
session_start();

$_SESSION['new_albaran']=new c_albaran;
$_SESSION['new_albaran.averia']=5;
unset(
$_SESSION['new_albaran']);
?>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Documento sin t&iacute;tulo</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
    <?="averia=" $_SESSION['new_albaran.averia']?>;
</body>
</html>

a mi me devuelve 5 cuando deberia dar error de objeto no declarado o si acaso null

de hecho creo que es un error conocido, si acudiis a la documentación de unset de php.net y vais abajo a los comentarios de los usuarios se comenta este error con la descarga de instancias de clase. El caso es que mi inglés es bastante malo y no entiendo bien lo que dicen y las soluciones que alguno proponen no me funcionan de forma correcta. Solo consigo descargar el objeto eliminando la session pero claro esto no es lo que yo quiero.

Porcierto uso php 4.3.10 con easyphp y la register_globals=off

Última edición por elmasvital; 27/05/2005 a las 10:48
  #19 (permalink)  
Antiguo 27/05/2005, 13:19
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Bueno... parece que lo que te ha faltado es leer el manual o un tutorial básico de clases/objetos en PHP.

En PHP no se utiliza el operador punto (.) para referirte a un método o atributo. El operador utilizado en php es la flecha (->).
Código PHP:
$albaran = new c_albaran;
$albaran->averia 5
O en tu caso si manejas variables de sesión:
Código PHP:
$_SESSION['new_albaran'] = new c_albaran;
$_SESSION['new_albaran']->averia 5;
unset(
$_SESSION['new_albaran']); 
Te recomiendo leer el manual de PHP
http://www.php.net/oop

Saludos
  #20 (permalink)  
Antiguo 27/05/2005, 16:53
 
Fecha de Ingreso: mayo-2005
Mensajes: 44
Antigüedad: 18 años, 11 meses
Puntos: 0
Cita:
Iniciado por jpinedo
Bueno... parece que lo que te ha faltado es leer el manual o un tutorial básico de clases/objetos en PHP.

En PHP no se utiliza el operador punto (.) para referirte a un método o atributo. El operador utilizado en php es la flecha (->).
Código PHP:
$albaran = new c_albaran;
$albaran->averia 5
O en tu caso si manejas variables de sesión:
Código PHP:
$_SESSION['new_albaran'] = new c_albaran;
$_SESSION['new_albaran']->averia 5;
unset(
$_SESSION['new_albaran']); 
Te recomiendo leer el manual de PHP
http://www.php.net/oop

Saludos
Ok ese era el problema. No conoces ninguna traducción del documento que mencionas? aparece en ingles.

De todas formas me parece muy curioso el hecho de que no lance el paser ningun error a eso que pongo
$_SESSION['new_albaran.averia']=5; si no hay soporte para este operador porque me lo admite? Al ver que todo iba bien excepto la descarga me parecía raro.



Gracias a todos por la ayuda
  #21 (permalink)  
Antiguo 28/05/2005, 11:37
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Cita:
Iniciado por elmasvital
No conoces ninguna traducción del documento que mencionas? aparece en ingles.
En la parte de arriba (encima del título) puedes elegir el idioma:
Cita:
view the [--elige "spanish"--] version of this page
-----
-----
Cita:
Iniciado por elmasvital
De todas formas me parece muy curioso el hecho de que no lance el paser ningun error a eso que pongo
$_SESSION['new_albaran.averia']=5; si no hay soporte para este operador porque me lo admite? Al ver que todo iba bien excepto la descarga me parecía raro.
Lo que pasa es que el punto (.) en este caso no se toma como un operador, sino como parte de la cadena que nombra a esa posición del array $_SESSION.
Un array asociativo (como $_SESSION), acepta cualquier cadena para nombrar a una posición. Por ejemplo:
Código PHP:
$mi_array['una cadena'] = 'palabras';//notas que acepta el espacio en blanco?
$mi_array['otra.cadena'] = 'palabras';//notas que acepta el punto? 
En general se acepta cualquier cadena y no se interpretan los puntos ni los espacios en blanco ni ningún caracter como operador.
En tu caso lo que está pasando es que estás guardando dos variables de sesión:
Código PHP:
$_SESSION['new_albaran'] = new c_albaran;//un nuevo objeto "c_albaran"
$_SESSION['new_albaran.averia'] = 5//una nueva variable (que no tiene nada que ver con el objeto anterior).
unset($_SESSION['new_albaran']); // Eliminas el objeto creado, pero no la variable. 
Saludos
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 21:12.