Ver Mensaje Individual
  #4 (permalink)  
Antiguo 03/04/2018, 18:46
Avatar de mortiprogramador
mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: Clases POO. Teoría.

Saludo

Pues teniendo en cuenta lo que mencionas, hagamos un ejemplo.

1. Digamos que tenemos esta clase en un archivo llamado Person.php

Código PHP:
Ver original
  1. class Person
  2. {
  3.     public $name;
  4.     protected $gender;
  5.     private $age;
  6.    
  7.     public function __construct($name, $gender, $age)
  8.     {
  9.         $this->name = $name;
  10.         $this->gender = $gender;
  11.         $this->age = $age;
  12.     }        
  13. }

Esta clase como se puede ver tiene 3 atributos
($name que es público, $gender que es protegido, y $age que es privado)

A su vez tiene un método inicial (el constructor) que se encarga
de recibir parámetros y asignarlos a estas variables.

2. Ya que tenemos esta clase, podemos crear un formulario html que nos pida
los datos de una persona (para el ejemplo los mismos tres)
(el formulario al mismo nivel de Person.php, es decir, la misma carpeta)

Código PHP:
Ver original
  1. <html>
  2.     <body>
  3.         <form method='post'>
  4.             Nombre:<input type='text' id='name' name='name' value='<?php echo @$_POST['name'];?>'>
  5.             <br>Género:<input type='text' id='gender' name='gender' value='<?php echo @$_POST['gender'];?>'>
  6.             <br>Edad:<input type='text' id='age' name='age' value='<?php echo @$_POST['age'];?>'>
  7.             <br><input type='submit'>
  8.         </form>
  9.     </body>
  10. </html>
  11. <?php
  12.     if( isset($_POST) && sizeof($_POST) )
  13.     {
  14.         include 'Person.php';
  15.         $person = new Person($_POST['name'],$_POST['gender'],$_POST['age']);
  16.         echo 'El nombre recibido es '.$person->name;
  17.         echo '<br>El género recibido es '.$person->gender;
  18.         echo '<br>La edad recibida es '.$person->age;
  19.     }
  20.      
  21. ?>


Cómo podemos ver, el formulario pide tres campos, y hará el envío.
Cuando se reciba, incluiremos el archivo Person.php del punto 1 (que es la clase creada antes)
para posteriormente usarlo para instanciar la clase Person.

Al hacer la instancia con new Person, se ejecutará por defecto el método constructor,
y es por esto que enviaremos los datos que nos llegaron vía POST del formulario.
Con esto, los atributos de la clase obtienen los valores capturados.

Aquí ya cubrimos lo que preguntabas respecto a cómo recoger los datos del form y almacenarlo
en la clase.

Ahora bien, como quiero ver la información que tiene ahora la clase, estoy invocando
a los atributos ($person->name, $person->gender y $person->age) PERO solo uno de ellos es público

Esto generará un error por temas de visibilidad de los atributos (en el caso de protected y private)
pues no podemos acceder directamente a ellos.

Para esto, se hace necesario agregar dos funciones a nuestra clase

Código PHP:
Ver original
  1. public function getGender()
  2. {
  3.     return $this->gender;
  4. }
  5.  
  6. public function getAge()
  7. {
  8.     return $this->age;
  9. }

Estas dos funciones son públicas, y retornarán los valores de las variables
sin necesidad de tener que modificar el ámbito de las mismas (es decir, por ej, dejarlas public)

Y por ende, ahora haremos este llamado:

Código PHP:
Ver original
  1. echo 'El nombre recibido es '.$person->name;
  2. echo '<br>El género recibido es '.$person->getGender();
  3. echo '<br>La edad recibida es '.$person->getAge();


Con esto, estamos invocando a las nuevas funciones quienes nos devolverán los datos que necesitamos.

Finalmente, agreguemos una función más a la clase que se encarge de guardar la información en una base de datos.

Código PHP:
Ver original
  1. public function save()
  2. {
  3.     $conn = mysqli_connect(self::$server, self::$user, self::$pass, self::$dbname);
  4.    
  5.     $query = 'INSERT INTO person (name, gender, age) VALUES (?,?,?)';
  6.     $stmt = mysqli_prepare($conn, $query);
  7.     mysqli_stmt_bind_param($stmt, 'ssd', $this->name, $this->gender, $this->age);
  8.     mysqli_stmt_execute($stmt);
  9.    
  10.     $affected_rows = mysqli_stmt_affected_rows($stmt);                
  11.    
  12.     $stmt->close();
  13.     $conn->close();
  14.    
  15.     return $affected_rows;
  16. }


Aquí vemos de entrada algo nuevo, el operador self::, ¿qué es esto?

Bueno, resulta que aparte de las propiedades que ya vimos (private, protected, public)
podemos agregar algo más a estas, convertirlas en estáticas (ideal para datos que NO cambiarán)

Un ejemplo de datos que no cambian (bueno, al menos no deberían cambiar tan seguido..)
son los de conexión a la base de datos.

Para esto, en la clase agregaré 4 datos más que serán privados Y estáticos.

Código PHP:
Ver original
  1. private static $server = 'localhost';
  2. private static $user = 'miusuario';
  3. private static $pass = 'micontraseña';
  4. private static $dbname = 'mibasededatos';


Y estos cuatro son los que se llaman con self::, que es el modo en que php
nos permite acceder a variables que son estáticas dentro de la misma clase que las define.

El resto de la función se encarga de luego de establecer la conexión,
crear el query de inserción de los datos, usar las variables que ya tienen los valores a guardar,
y realizar la operación retornando el resultado de la misma.

Y claro, para verificar visualmente, en nuestro archivo del formulario
agregaremos esto:

Código PHP:
Ver original
  1. if( $person->save() )
  2.     echo '<br>Registro guardado';
  3. else
  4.     echo '<br>Inconvenientes al guardar';


Un simple condicional que preguntará el resultado del llamado a la función save,
y en el caso que retorne 1 informará del registro guardado, en otro caso informará de inconvenientes al guardar.

Y con esto ya cubrimos también la manera de comunicar la clase con una base de datos.

Cómo nota final, este ejemplo necesita mejoras.
Por ejemplo, los datos de la base de datos no deberían estar en la clase Person,
puesto que esta solo debería tener los atributos de las personas.

Para solucionar eso, se podría crear una clase donde se maneje todo lo necesario
respecto a la base de datos como tal, y luego se modificaría el formulario para
que trabaje con las dos clases (es decir, la clase Person que ya existe, y la nueva de la base de datos)

También necesita validaciones, por ejemplo, la longitud de los datos a guardar,
si son numéricos o alfanuméricos, etc.

Y bueno, de ahí en adelante todo lo que de la imaginación.
Con esto creo que te distraes un rato, y si quieres distraerte más,
te recomiendo revises esto
e incluso te pasees por los frameworks que existen para trabajar en conjunto con php
(CodeIgniter, CakePhp, Symfony, Laravel, etc) que manejan ya todos estos conceptos
de comunicación entre los formularios (Vistas), la base de datos (Modelo) y la lógica de programación (Controlador).
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com

Última edición por mortiprogramador; 03/04/2018 a las 18:52