Foros del Web » Programando para Internet » PHP »

Una Clase dentro de otra Clase. Ayuda

Estas en el tema de Una Clase dentro de otra Clase. Ayuda en el foro de PHP en Foros del Web. Hola amigos, tengo una duda, yo apenas comienzo en PHP, y la verdad hay muchas cosas que no se... Y yo quisiera saber si puedo ...
  #1 (permalink)  
Antiguo 02/08/2010, 09:42
 
Fecha de Ingreso: julio-2010
Mensajes: 19
Antigüedad: 13 años, 9 meses
Puntos: 0
Una Clase dentro de otra Clase. Ayuda

Hola amigos, tengo una duda, yo apenas comienzo en PHP, y la verdad hay muchas cosas que no se... Y yo quisiera saber si puedo digamos: "meter una clase en otra" Estuve leyendo sobre la herencia en PHP... Pero aun asi no me dio resultado... Tal vez ustedes me puedan explicar mas y ayudar... Notese que soy novato.

Este es mi archivo conexion.class.php
Código PHP:
Ver original
  1. <?php
  2. class DBManager{
  3.     var $conect;
  4.  
  5.     var $BaseDatos;
  6.     var $Servidor;
  7.     var $Usuario;
  8.     var $Clave;
  9.     function DBManager(){
  10.         $this->BaseDatos = "nombre";
  11.         $this->Servidor = "localhost";
  12.         $this->Usuario = "usuario";
  13.         $this->Clave = "clave";
  14.     }
  15.  
  16.      function conectar() {
  17.         if(!($con=@mysql_connect($this->Servidor,$this->Usuario,$this->Clave))){
  18.             echo"<h1> [:(] Error al conectar a la base de datos</h1>"; 
  19.             exit();
  20.         }
  21.         if (!@mysql_select_db($this->BaseDatos,$con)){
  22.             echo "<h1> [:(] Error al seleccionar la base de datos</h1>";  
  23.             exit();
  24.         }
  25.         $this->conect=$con;
  26.         return true;   
  27.     }
  28. }
  29. ?>



Ese es el de conexion, donde puse "nombre", "localhost", "usuario", "clave" ... Alli van mis valores

Este es mi archivo empleado.class.php
Código PHP:
Ver original
  1. <?php
  2. include_once("conexion.class.php");
  3.  
  4. class Empleado{
  5.  //constructor 
  6.     var $con;
  7.     function Empleado(){
  8.         $this->con=new DBManager;
  9.     }
  10.  
  11.     function insertar($campos){
  12.         if($this->con->conectar()==true){
  13.             //print_r($campos);
  14.             //echo "INSERT INTO configuracion (nombre, apellido, salario) VALUES ('".$campos[0]."','".$campos[1]."','".$campos[2]."')");
  15.             return mysql_query("INSERT INTO configuracion (nombre, apellido, salario) VALUES ('".$campos[0]."','".$campos[1]."','".$campos[2]."')");
  16.         }
  17.     }
  18.    
  19.     function actualizar($campos,$id){
  20.         if($this->con->conectar()==true){
  21.             //print_r($campos);
  22.             return mysql_query("UPDATE configuracion SET nombre = '".$campos[0]."', apellido = '".$campos[1]."', salario = '".$campos[2]."', afp = '".$campos[3]."', isss = '".$campos[4]."' WHERE id = ".$id);
  23.         }
  24.     }
  25.    
  26.     function mostrar_empleado($id){
  27.         if($this->con->conectar()==true){
  28.             return mysql_query("SELECT * FROM configuracion WHERE id=".$id);
  29.         }
  30.     }
  31.  
  32.     function mostrar_empleados(){
  33.         if($this->con->conectar()==true){
  34.             return mysql_query("SELECT * FROM configuracion ORDER BY id DESC");
  35.         }
  36.     }
  37.  
  38.     function eliminar($id){
  39.         if($this->con->conectar()==true){
  40.             return mysql_query("DELETE FROM configuracion WHERE id=".$id);
  41.         }
  42.     }
  43. }
  44. ?>


Muy bien, eso hace todo en la base de datos, acerca de los empleados... Inserta,actualiza,borra,muestra.

Ahora, mi nueva clase es esta, para hacer unos calculos en base al salario del empleado ingresado. procesos.class.php
Código PHP:
Ver original
  1. <?php class Procesos {
  2.  
  3.     var $isss_empleado = 3;
  4.     var $isss_patrono = 7.5;
  5.     var $isss_salmax = 685.71;
  6.     var $afp_empleado = 6.25;
  7.     var $afp_patrono = 6.75;
  8.     var $afp_minimo = 207.6;
  9.     var $afp_max = 5354.52;
  10.  
  11.     // constructor
  12.    
  13.  
  14.     function Procesos($isss_empleado, $isss_patrono, $isss_salmax, $afp_empleado, $afp_patrono, $afp_minimo, $afp_max) {
  15.         $this->isss_empelado = $isss_empleado;
  16.         $this->isss_patrono = $isss_patrono;
  17.         $this->isss_salmax = $isss_salmax;
  18.         $this->afp_empleado = $afp_empleado;
  19.         $this->afp_patrono = $afp_patrono;
  20.         $this->afp_minimo = $afp_minimo;
  21.         $this->afp_max = $afp_max;
  22.     }
  23.  
  24.     // metodos get
  25.  
  26.     function get_isss_empleado() {
  27.         return $this->isss_empleado;
  28.     }
  29. ............... los demas para las otras variables tambien
  30.  
  31. // metodos set
  32.  
  33.    
  34.     function set_isss_empleado($v) {
  35.         if(!is_numeric($v)) {
  36.             return false;
  37.         } else {
  38.             $this->isss_empleado = $v;
  39.         }
  40.     }
  41. ............. Los demas tambien para las otras variables


Ahora bien, yo quiero meter la clase procesos.class.php en empleado.class.php


Segun estuve investigando...

Podia usar herencia haciendo algo como:
Código PHP:
Ver original
  1. class Procesos extends Empleado {
  2.  //constructor
  3.     var $isss_empleado = 3;
  4.     var $isss_patrono = 7.5;
  5.     var $isss_salmax = 685.71;
  6.     var $afp_empleado = 6.25;
  7.     var $afp_patrono = 6.75;
  8.     var $afp_minimo = 207.6;
  9.     var $afp_max = 5354.52;
  10.    
  11.     function Procesos($isss_empleado, $isss_patrono, $isss_salmax, $afp_empleado, $afp_patrono, $afp_minimo, $afp_max) {
  12.         $this->isss_empelado = $isss_empleado;
  13.         $this->isss_patrono = $isss_patrono;
  14.         $this->isss_salmax = $isss_salmax;
  15.         $this->afp_empleado = $afp_empleado;
  16.         $this->afp_patrono = $afp_patrono;
  17.         $this->afp_minimo = $afp_minimo;
  18.         $this->afp_max = $afp_max;


O me equivoco?? Alguien me explica un poco mas?? Por favor

Lo que quiero es que esa clase este dentro de la otra, para poder recoger el salario y hacer unos descuentos! pero la verdad no tengo mucho la idea como...
  #2 (permalink)  
Antiguo 02/08/2010, 10:55
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años
Puntos: 1517
Respuesta: Una Clase dentro de otra Clase. Ayuda

Te recomiendo que hagas una búsqueda en el foro, hay mucha información y reciente sobre la herencia. Te va a ayudar a entender cuándo debes hacer herencia y cuando no. Aún sin hacer herencia puedes instanciar dentro de una clase. Trata de hacer la búsqueda en este foro específicamente y verás varias respuestas.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 02/08/2010, 10:55
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
Respuesta: Una Clase dentro de otra Clase. Ayuda

la herencia es un tema importante en poo .. te aconsejo leas el manual oficial de php para que tengas claro el funcionamiento..
te dejo un ejemplo

saludos!

Código PHP:
Ver original
  1. <?php
  2. class foo
  3. {
  4.     protected $variable = '';
  5.     public function assign($variable)
  6.     {
  7.         $this->variable = $variable;
  8.     }
  9. }
  10. class bar extends foo
  11. {
  12.     public function render()
  13.     {
  14.         return $this->variable;
  15.     }
  16. }
  17. $b = new bar;
  18. $b->assign('Texto de prueba');
  19. echo $b->render();

http://cl.php.net/manual/en/keyword.extends.php
__________________
More about me...
~ @rhyudek1
~ Github
  #4 (permalink)  
Antiguo 02/08/2010, 11:40
Avatar de _ssx  
Fecha de Ingreso: mayo-2003
Ubicación: mX
Mensajes: 683
Antigüedad: 21 años
Puntos: 60
Respuesta: Una Clase dentro de otra Clase. Ayuda



Ya se ha discutido varias veces NO hacer herencia por reutilizar código, para que la herencia tenga sentido debe de poder decirse que el objeto que hereda "es un" objeto del que va a heredar por ejemplo.

Código PHP:
class Proceso extends Empleado{} 
¿Un proceso es un empleado?

Código PHP:
class MySQL extends BasedeDatos{} 
¿Un Mysql es una BasedeDatos?


Creo que aqui es donde puedes ver que más allá de una generalización Lo que estas buscando es una composición donde preguntas "Tiene un"

Creo que dependiendo del contexto de tu problema puede ser que el "objeto" proceso pueda ser un atributo del empleado o tu proceso puede "tener un contenedor de empleados dentro".

No obstante más allá de la reutilización de funciones creo que deberías de cambiar el planteamiento a programación orientada a objetos por delegación de responsabilidades.

Ejemplo de composición.

Código PHP:
class Empleado{
     private 
$_proceso;
     public function 
__construct(){
            
//Aqui podrias enviarle al objeto proceso los datos del usuario a través del constructor
            
$this->_proceso = new Proceso($this);
     }
     public function 
getAlgoqueUseProceso(){
           return 
$this->_proceso->get_isss_empleado();
     }

__________________
Escribe tu código de forma que refleje, y saque a relucir,lo mejor de tu carácter personal
www.oscararzola.com/blog
Principios de un programador

Última edición por _ssx; 02/08/2010 a las 11:46 Razón: Agregada función ejemplo
  #5 (permalink)  
Antiguo 02/08/2010, 16:45
 
Fecha de Ingreso: julio-2010
Mensajes: 19
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Una Clase dentro de otra Clase. Ayuda

Les agradezco a todos por responder, creo que ya me hice a la idea y en el mejor de los casos ya me puse a leer el manual, sobre las clases.. y gracias por la aclaracion _ssx

Etiquetas: clase
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 10:16.