Retroceder   Foros del Web > Programación para sitios web > PHP > PHP orientado a objetos

Respuesta
 
Herramientas Desplegado
Antiguo 08-mar-2007, 10:11   #1 (permalink)
ktulu_red ha deshabilitado el karma
 
Fecha de Ingreso: marzo-2005
Mensajes: 43
Ejemplo como para el FAQ

Saludos desde Colombia.

Al programar estructurado con AJAX, me dio por querer aprender a programar a Objetos con PHP, lenguaje al que le estoy muy agradecido por q me ha sacado de muchos problemas.

Ya he leido sobre lo primero que hay que leer, OOP lo basico. Pero como soy terco y me gusta el codigo, me e puesto en la tarea de hacer un ejemplo tipico de un formulario con informacion de un usuario, que al hacer ingresar vaya a la bd se conecte y todo eso. Yo se que es jarto que uno venga pidiendo codigo, pero es que asi es que arrancamos muchos, con ejemplos muy practicos de lo que antes haciamos estructurado para poderlo hacer en Objetos.

Estoy tratando de utilizar propiedades, atributos privados y todo eso, para de una vez, aprender estos conceptos.

De antemano mis agradecimientos y si tienen tiempo de hacer esto se los agradeceria, estoy seguro que un ejemplo de estos despejaria muchas dudas y seria el punto de arranque de muchas personas que al igual como yo, quieren programar "serio".

Gracias
ktulu_red está desconectado   Responder Citando
Antiguo 08-mar-2007, 10:35   #2 (permalink)
$this->role('moderador');
GatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradable
 
Avatar de GatorV
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ags/
Mensajes: 13.961
Re: Ejemplo como para el FAQ

Haber si entiendo tu pregunta, quieres que alguien haga un ejemplo asi de insertar datos via formulario en PHP pero OOP?
GatorV está desconectado   Responder Citando
Antiguo 08-mar-2007, 12:33   #3 (permalink)
ktulu_red ha deshabilitado el karma
 
Fecha de Ingreso: marzo-2005
Mensajes: 43
Re: Ejemplo como para el FAQ

Cita:
Iniciado por GatorV Ver Mensaje
Haber si entiendo tu pregunta, quieres que alguien haga un ejemplo asi de insertar datos via formulario en PHP pero OOP?
Si, exacto...aca mismo en el FAQ existen ejemplos de clases para conectarse a la base de datos, ahora seria bueno que el ejemplo mostrara la interaccion de todos estos conceptos con un ejemplo sencillo, asi sea de 2 capas, o si tienen tiempo pues seria bueno ir mejorando ese ejemplo hasta hacerlo de 3 capas.

Gracias.
ktulu_red está desconectado   Responder Citando
Antiguo 08-mar-2007, 16:37   #4 (permalink)
Fridureiks ha deshabilitado el karma
 
Fecha de Ingreso: julio-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.247
Re: Ejemplo como para el FAQ

Si tenes claros los conceptos de poo, me parece que lo mejor es que intentes escribir el codigo tu mismo y luego plantear dudas que aparecerán... que serán mas concretas ;)

Saludos.
__________________
Federico.

Mi página: www.jourmoly.com.ar
Fridureiks está desconectado   Responder Citando
Antiguo 09-mar-2007, 07:28   #5 (permalink)
ktulu_red ha deshabilitado el karma
 
Fecha de Ingreso: marzo-2005
Mensajes: 43
Re: Ejemplo como para el FAQ

Bueno, Buscando en Internet con paciencia encontre este articulo, me parecio bueno para los que tienen la cabeza enredada con tanto concepto.

http://www.ribosomatic.com/articulos...clases-en-php/
ktulu_red está desconectado   Responder Citando
Antiguo 09-mar-2007, 08:09   #6 (permalink)
$this->role('moderador');
GatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradable
 
Avatar de GatorV
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ags/
Mensajes: 13.961
Re: Ejemplo como para el FAQ

Si vas a tomar ese articulo como una fuente de enseñanza, yo que tu buscaria otra fuente, si realmente quieres aprender Programacion Orientada a Objetos, no significa nadamas tener una clase por aqui y por alla, va muchisimo mas alla, y ese articulo es programacion procedural pero intentando ser orientada a objetos.

La razon por la que nadie postea un codigo es porque no es tan sencillo, hacer algo bien hecho implementando, que aproveche todos los beneficios que tiene PHP en su forma de Orientado a Objetos.

Saludos
GatorV está desconectado   Responder Citando
Antiguo 12-mar-2007, 08:35   #7 (permalink)
ktulu_red ha deshabilitado el karma
 
Fecha de Ingreso: marzo-2005
Mensajes: 43
Re: Ejemplo como para el FAQ

Ese es el problema que creo tenemos muchos, depronto creemos que algo esta bien hecho y puede ser mejor.

Por ejemplo encontre e implemente un ejemplo, claro que me toco hacerle unas cosas para que funcionara, me imagino que no seran recomendables.
por favor hagan sus comentarios, en que se puede mejorar, que no es una buena practica, etc...

Gracias por su paciencia.

Código PHP:
<? //session_start();?>
<? 
class Usuario{
private  
$nombre;
private  
$apellido;
private  
$telefono;
private  
$email;

public function 
getNombre() {
      return 
$this->nombre;
    }

public function 
setNombre($nombre) {
      
$this->nombre $nombre;
    }
   
public function 
getApellido(){
       return 
$this->apellido;
    }

  public function 
setApellido($apellido) {
      
$this->apellido $apellido;
    }

    public function 
getTelefono(){
      return 
$this->telefono;
    }
    public function 
setTelefono($telefono){
      
$this->telefono $telefono;
    }

   public function 
getEmail(){
      return 
$this->email;
    }
   public function 
setEmail($email){
      
$this->email $email;
    }
        
//constructor??
    /*function Usuario($nombre,$apellido,$telefono,$email){
        $this->nombre=$nombre;
        $this->apellido=$apellido;
        $this->telefono=$telefono;
        $this->email=$email;*/

}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?php 
function print_form() {?>
<form name="form1" method="post" action="default_Usuario.php">
<table width="200" border="1" align="center">
  <tr>
    <td align="center">NOMBRE</td>
    <td>
      <input type="text" name="nombre" id="nombre">
   </td>
  </tr>
  <tr>
    <td align="center">APELLIDO</td>
    <td><input type="text" name="apellido" id="apellido"></td>
  </tr>
  <tr>
    <td align="center">TELEFONO</td>
    <td><input name="telefono" type="text" id="telefono"></td>
  </tr>
  <tr>
    <td align="center">EMAIL</td>
    <td><input name="email" type="text" id="email"></td>
  </tr>
  <tr>
    <td colspan="2" align="center">
      <input type="submit" name="submit" value="Guardar">    </td>
  </tr>
</table>
</form>
<? ?>

<?php
function set_properties($nombre,$apellido,$telefono,$email){
global 
$objUsuario;
//INSTANCIA
$objUsuario = new Usuario();/*
$_SESSION['Usuario'] = $objUsuario;  */
foreach($_POST as $nombre_campo => $valor){ 
  
$valor str_replace("'""_"$valor);
   
$asignacion "\$" $nombre_campo "='" $valor "';"
   eval(
$asignacion); 
   }
$objUsuario->setNombre($nombre);
$objUsuario->setApellido($apellido);
$objUsuario->setTelefono($telefono);
$objUsuario->setEmail($email);
?> 
<?php 
function mostrar_Usuario($objUsuario){ 
//$objUsuario = $_SESSION['Usuario'];
?>

<h3>Aca estan los datos recuperados:
 <ul>
 <li>Nombre: <? echo $objUsuario->getNombre(); ?>
 <li>Apellido: <? echo $objUsuario->getApellido(); ?>
 <li>Telefono: <? echo $objUsuario->getTelefono(); ?>
 <li>Email: <? echo $objUsuario->getEmail(); ?>
 </ul>
     <? }
if(isset(
$_POST['submit']) && $_POST['submit']=='Guardar') {
set_properties($nombre,$apellido,$telefono,$email);
mostrar_Usuario($objUsuario);
 } else {
 
print_form();
 }
?>
</body>

</html>
ktulu_red está desconectado   Responder Citando
Antiguo 12-mar-2007, 16:49   #8 (permalink)
$this->role('moderador');
GatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradable
 
Avatar de GatorV
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ags/
Mensajes: 13.961
Re: Ejemplo como para el FAQ

El ejemplo que publicaste es la forma mala de hacer las cosas, trata de pensar en todo como un objeto, te dejo aqui un ejemplito, nada loco, pero basico de altas de personas.

Persona.php:
Código PHP:
<?php
class Persona {
    private 
$nombre;
    private 
$apellido;
    
    public function 
__construct$nombre ''$apellido '' ) {
        
$this->nombre $nombre;
        
$this->apellido $apellido;
    }
    
    public function 
setNombre($nombre) {
        
$this->nombre $nombre;
    }
    
    public function 
getNombre() {
        return 
$this->nombre;
    }
    
    public function 
setApellido($apellido) {
        
$this->apellido $apellido;
    }
    
    public function 
getApellido() {
        return 
$this->apellido;
    }
    
    public function 
escribeNombre() {
        echo 
$this->nombre " " $this->apellido;
    }
}
?>
AlmacenPersonas.php:
Código PHP:
<?php
class AlmacenPersonas {
    private 
$storage = array();
    private static 
$_instance null;
    
    public static function 
getInstance() {
        if( 
self::$_instance == null ) {
            
self::$_instance = new self();
        }
        
        return 
self::$_instance;
    }
    
    private function 
__construct() {
        @
session_start();
        
        if( isset( 
$_SESSION['personasStorage'] ) ) {
            
$this->storage unserialize$_SESSION['personasStorage'] );
        }
    }
    
    public function 
__destruct() {
        
$_SESSION['personasStorage'] = serialize$this->storage );
    }
    
    public function 
addPersona $persona ) {
        
$this->storage[] = $persona;
    }
    
    public function 
getPersona$offset ) {
        if( isset( 
$this->storage[$offset] ) ) {
            return 
$this->storage[$offset];
        }
        
        throw new 
Exception("Esta persona no existe");
    }
    
    public function 
getAll() {
        return 
$this->storage;
    }
}
?>
ControladorPersonas.php:
Código PHP:
<?php
class ControladorPersonas() {
    private 
$almacen;
    
    public function 
__construct() {
        
$this->almacen AlmacenPersonas::getInstance();
    }
    
    public function 
AltaPersona$nombre$apellido ) {
        
$persona = new Persona$nombre$apellido );
        
        
$this->almacen->add$persona );
    }
    
    public function 
regresaPersonas() {
        return 
$this->almacen->getAll();
    }
}
?>
Ahora sus implementaciones:
alta_personas.php
Código PHP:
<?php
require( 'Persona.php' );
require( 
'AlmacenPersonas.php' );
require( 
'ControladorPersonas.php' );

if( 
strtoupper$_SERVER['HTTP_REQUEST_METHOD'] ) == 'POST' ) {
    
$nombre $_POST['nombre'];
    
$apellido $_POST['apellido'];
    
    
$controlador = new ControladorPersonas();
    
$controlador->AltaPersona$nombre$apellido );
    
$respuesta "Gracias!";
}
?>
<html>
<head>
<title>Alta de Persona</title>
</head>
<body>
<h1>Registrar una Persona</h1>
<h2><?php echo $respuesta?></h2>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
Nombre: <input type="text" name="nombre" value="" />
Apellido: <input type="text" name="apellido" value="" />
<input type="submit" name="submit" value="Registrar" />
</form>
</body>
</html>
ver_personas.php
Código PHP:
<?php
require( 'Persona.php' );
require( 
'AlmacenPersonas.php' );
require( 
'ControladorPersonas.php' );

$controlador = new ControladorPersonas();
$personas $controlador->regresaPersonas();
?>
<html>
<head>
<title>Ver Personas</title>
</head>
<body>
<h1>Personas Registradas:</h1>
<?php foreach( $personas as $numero => $persona ) { ?>
<?php 
echo sprintf"%s - %s %s"$numero$persona->getNombre(), $persona->getApellido() ); ?>
<?php 
?>
</body>
</html>
Si te puedes dar cuenta todo esta completamente separado, la clase Persona, no sabe si las variables llegan via POST, o via XML, o desde la linea de comando, solo se encarga de guardarlas, asi como el Almacen y el Controlador, asi debes de pensar.
En Abstraccion.
GatorV está desconectado   Responder Citando
Antiguo 13-mar-2007, 07:03   #9 (permalink)
zsamer tiene algunos puntos positivos de karma
 
Fecha de Ingreso: noviembre-2003
Mensajes: 786
Re: Ejemplo como para el FAQ

GatorV, muy buen diseño de la clase Persona, me surgió una duda de cual metodo sería más correcto implementar:

Supongamos que el usuario necesita ser guardado en una tabla en la bd (dar de alta) y ademas necesita logearse para utilizar aplicaciones del sistema.

Ambos metodos insertarUsuario, logearUsuario, incluso actualizarUsuario, en ¿qué clase es correcto que se implementaran éstas funcionalidades? En la clase de Persona o habría que crear una clase adicional para estas tareas de forma de desacoplar la clase Persona.

gracias y saludos.
zsamer está desconectado   Responder Citando
Antiguo 13-mar-2007, 09:02   #10 (permalink)
ktulu_red ha deshabilitado el karma
 
Fecha de Ingreso: marzo-2005
Mensajes: 43
Re: Ejemplo como para el FAQ

Implemente el codigo que muy amablemente te tomaste a la tarea de pensar, veo que maneja el patron Singleton, lo corri y no me generaba el resultado esperado, tuve que cambiar la linea
Código PHP:
if( strtoupper$_SERVER['HTTP_REQUEST_METHOD'] ) == 'POST' ) { 
por
Código PHP:
if(isset($_POST['submit']) && $_POST['submit']=='Registrar') { 
. Al hacer eso si entro en esa validacion, el problema es que no se como mostrar lo que almacene, ya que esta en otro script y no sabria donde seria adecuado ponerlo....!!
Gracias por tus comentarios.
ktulu_red está desconectado   Responder Citando
Antiguo 13-mar-2007, 09:08   #11 (permalink)
$this->role('moderador');
GatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradable
 
Avatar de GatorV
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ags/
Mensajes: 13.961
Re: Ejemplo como para el FAQ

Lo ideal es abstraer a la entidad de su almacen, es decir la clase persona, tiene sus propiedades, pero no esta mal hacer lo que dices, la misma persona debe de ser capaz de saber como guardarse en la base de datos. Ahora el de loggearse en el sistema y validarlo esto no es de la persona, es una clase aparte que se encarga de ver que credenciales tiene la Persona y ver si es valido o no para entrar a determinado modulo.
GatorV está desconectado   Responder Citando
Antiguo 13-mar-2007, 09:09   #12 (permalink)
$this->role('moderador');
GatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradable
 
Avatar de GatorV
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ags/
Mensajes: 13.961
Re: Ejemplo como para el FAQ

Para mostrar lo que almacenaste corre el script de ver_personas.php
GatorV está desconectado   Responder Citando
Antiguo 13-mar-2007, 10:04   #13 (permalink)
ktulu_red ha deshabilitado el karma
 
Fecha de Ingreso: marzo-2005
Mensajes: 43
Re: Ejemplo como para el FAQ

No se si hay algun problema con las variables de sesion o que pero no muestra nada, si yo quiero que inmediatamente despues de registrar el nombre y el apellido, muestre esos datos como seria correcto hacerlo?
ktulu_red está desconectado   Responder Citando
Antiguo 13-mar-2007, 10:56   #14 (permalink)
Fridureiks ha deshabilitado el karma
 
Fecha de Ingreso: julio-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.247
Re: Ejemplo como para el FAQ

Gracias por el codigo GatorV
__________________
Federico.

Mi página: www.jourmoly.com.ar
Fridureiks está desconectado   Responder Citando
Antiguo 13-mar-2007, 11:46   #15 (permalink)
$this->role('moderador');
GatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradable
 
Avatar de GatorV
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ags/
Mensajes: 13.961
Re: Ejemplo como para el FAQ

De nada Fridureiks

Para mostrarlos inmediatamente despues de AltaPersona podrias poner un header e ir a mostrar personas.

Código PHP:
header("Location: ver_personas.php"); 
GatorV está desconectado   Responder Citando
Antiguo 13-mar-2007, 13:45   #16 (permalink)
ktulu_red ha deshabilitado el karma
 
Fecha de Ingreso: marzo-2005
Mensajes: 43
Re: Ejemplo como para el FAQ

En el codigo que pusiste veo que tienes una variable de sesion asi:

Almacen_Personas.php:
Código PHP:
private function __construct() { 
        @
session_start();          
        if( isset( 
$_SESSION['personasStorage'] ) ) { 
            
$this->storage unserialize$_SESSION['personasStorage'] ); 
        } 
veo que tienes un @ antes de session_star(), si se lo quitamos, nos da el siguiente error:

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at C:\Archivos de programa\xampp\htdocs\alta_personas\Persona.php:31 ) in C:\Archivos de programa\xampp\htdocs\alta_personas\AlmacenPersona s.php on line 12
ktulu_red está desconectado   Responder Citando
Antiguo 13-mar-2007, 15:52   #17 (permalink)
ktulu_red ha deshabilitado el karma
 
Fecha de Ingreso: marzo-2005
Mensajes: 43
Re: Ejemplo como para el FAQ

Cita:
Iniciado por ktulu_red Ver Mensaje
En el codigo que pusiste veo que tienes una variable de sesion asi:

Almacen_Personas.php:
Código PHP: