Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Problema con el método static

Estas en el tema de Problema con el método static en el foro de PHP en Foros del Web. Hola buen día para todos, tengo un problema. Resulta que estoy haciendo un ejercicio de clases y de repente cuando voy en el ejemplo sobre ...
  #1 (permalink)  
Antiguo 19/05/2015, 20:25
 
Fecha de Ingreso: mayo-2015
Mensajes: 6
Antigüedad: 4 años, 9 meses
Puntos: 0
Exclamación Problema con el método static

Hola buen día para todos, tengo un problema.

Resulta que estoy haciendo un ejercicio de clases y de repente cuando voy en el ejemplo sobre un método "static" comienzan los problemas, primero, mi código es el siguiente.
(Son dos problemas los comento abajo del código).

Código PHP:
Ver original
  1. <?php
  2.  
  3. class Mulato extends Persona
  4. {
  5.     public function getExtNombre()
  6.     {
  7.         return parent::getConocimiento();
  8.     }
  9. }
  10.  
  11. class Persona
  12. {
  13.     private     $_Estatura          = 1.34;
  14.     public      $_Nombre            = "Pedro";
  15.     public      $_Apellido          = "Gomez";
  16.     public      $_Fechanacimiento   = "04/06/1996";
  17.     static      $_Sexo              = "Masculino";
  18.     protected   $_Conocimiento      = TRUE;
  19.  
  20.  
  21.     public function __construct($Estatura = NULL, $Nombre = NULL,
  22.                                 $Apellido = NULL, $Fechanacimiento = NULL,
  23.                                 $Sexo = NULL, $Conocimiento = FALSE)
  24.     {
  25.         $this->_Estatura        =is_null($Estatura)         ?   $this->_Estatura        :$Estatura;
  26.         $this->_Nombre          =is_null($Nombre)           ?   $this->_Nombre          :$Nombre;
  27.         $this->_Apellido        =is_null($Apellido)         ?   $this->_Apellido        :$Apellido;
  28.         $this->_Fechanacimiento =is_null($Fechanacimiento)  ?   $this->_Fechanacimiento :$Fechanacimiento;
  29.         self::$_Sexo            =is_null($Sexo)             ?   $this->_Sexo            :$Sexo;
  30.         $this->_Conocimiento    =$Conocimiento;
  31.     }
  32.    
  33.     public function getEstatura()
  34.     {
  35.         return $this->_Estatura;
  36.     }
  37.     public function getSexo()
  38.     {
  39.         return self::$_Sexo;
  40.     }
  41.  
  42.     public function getConocimiento()
  43.     {
  44.         if ($this->_Conocimiento){
  45.             echo "Su hoja de vida ah sido registrada gracias por preferirnos.";
  46.         }else{
  47.  
  48.             echo "Lo sentimos su hoja de vida no ah sido registrada por que no cumple con los requisitos.";
  49.         }
  50.     }
  51.     public function __destruct()
  52.         {
  53.             unset($this->_Estatura);
  54.             unset($this->_Nombre);
  55.             unset($this->_Apellido);
  56.             unset($this->_Fechanacimiento);
  57.             unset($this->Sexo);
  58.             unset($this->_Conocimiento);
  59.            
  60.         }
  61. }
  62.  
  63. $Persona=new Persona(1.69,"Juan Diego","Alfonso","04/08/1995","masculino", TRUE);
  64. //$Mulato =new Mulato();
  65. echo "Buen día señor(a) ".$Persona->_Nombre." ".$Persona->_Apellido.
  66.      " usted nació el ".$Persona->_Fechanacimiento." mide ".$Persona->getEstatura().
  67.      " y su sexo es ".$Persona->getSexo()."<br>";
  68. echo $Persona->getConocimiento();
  69.  
  70.  
  71.  
  72. ?>


Ahora les comento, mi primer problema es que el tutorial y las personas que me dicen que realice este método escriben en el constructor lo siguiente para que no cambie.

Código PHP:
Ver original
  1. $this->_Sexo            =$Sexo;

Ahora a lo que yo voy es que a mí me toca con "selft", si lo escribo como dice arriba me da un error (Accessing static property Persona::$_Sexo as non static), ¿que puedo hacer para arreglar esto?.

Ahora el segundo error es que si quiero hacer una clase extendida de persona ejemplo una clase mulato, me van a salir también dos errorres con relación al "self", como pueden ver el código arriba la instancia de la clase extendida está comentada debido al error.
Error1: "Accessing static property Mulato::$_Sexo as non static"
Error2: "Undefined property: Mulato::$_Sexo"

PD: el codigo tal como esta escrito arriba sirve pero en el caso que quite el comentario o cambie el "self" por "this->" me dan los errores.

Gracias.

Última edición por juandhalcolo; 19/05/2015 a las 20:32
  #2 (permalink)  
Antiguo 19/05/2015, 21:09
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 11 años, 10 meses
Puntos: 2534
Respuesta: Problema con el método static

Yo creo que el tutoríal que estás siguiendo es pésimo, tan malo es que te obliga a cometer errores de diseño de software.

¿De qué año es y qué versiones de PHP contempla?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 19/05/2015, 22:02
 
Fecha de Ingreso: mayo-2015
Mensajes: 6
Antigüedad: 4 años, 9 meses
Puntos: 0
Respuesta: Problema con el método static

Cita:
Iniciado por pateketrueke Ver Mensaje
Yo creo que el tutoríal que estás siguiendo es pésimo, tan malo es que te obliga a cometer errores de diseño de software.

¿De qué año es y qué versiones de PHP contempla?
JAJAJA probablemente si tengas algo de razón, me puse a buscar en el manual de php y dice esto

Código HTML:
Ver original
  1. Debido a que los métodos estáticos se pueden invocar sin tener creada una instancia del objeto, la pseudo-variable $this no está disponible dentro de los métodos declarados como estáticos.
  2.  
  3. Las propiedades estáticas no pueden ser accedidas a través del objeto utilizando el operador flecha (->).

Esto responde mi primera pregunta, pero no eh podido encontrar el motivo por el cual al instanciar la clase Mulato me genera conflicto con el método que es estático.
  #4 (permalink)  
Antiguo 20/05/2015, 09:10
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 6 años, 7 meses
Puntos: 379
Respuesta: Problema con el método static

El problema esta en esta linea:
Código PHP:
Ver original
  1. self::$_Sexo            =is_null($Sexo)             ?   $this->_Sexo            :$Sexo;
$this->_Sexo debe ser self::_Sexo
Por cierto los métodos deben de regresar "algo" cuando los invocas, así que cambia los echos que tienes en getConocimiento() por returns
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #5 (permalink)  
Antiguo 20/05/2015, 12:10
 
Fecha de Ingreso: mayo-2015
Mensajes: 6
Antigüedad: 4 años, 9 meses
Puntos: 0
Respuesta: Problema con el método static

Cita:
Iniciado por hhs Ver Mensaje
El problema esta en esta linea:
Código PHP:
Ver original
  1. self::$_Sexo            =is_null($Sexo)             ?   $this->_Sexo            :$Sexo;
$this->_Sexo debe ser self::_Sexo
Por cierto los métodos deben de regresar "algo" cuando los invocas, así que cambia los echos que tienes en getConocimiento() por returns
La manera en la que lo estaba escribiendo estaba bien, si lo escribo como tu me dices da error, a excepción de los "return", esos si me ayudaron y ya los cambie, pero me puse a investigar y me hacia falta código para la clase extendida de mulato.

Gracias a los que respondieron, a continuación dejo el código final, para los que estén interesados.


Código PHP:
Ver original
  1. <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
  2. <fieldset><center>
  3. <?php
  4.  
  5. /** Clase Mulato extendida de persona
  6. *   Sin ningun metodo añadido
  7. */
  8. class Mulato extends Persona
  9. {
  10.    
  11.     function __construct($Estatura = NULL, $Nombre = NULL,
  12.                         $Apellido = NULL, $Fechanacimiento = NULL,
  13.                         $Sexo = NULL, $Conocimiento = FALSE)
  14.     {
  15.         $this->_Estatura        =is_null($Estatura)         ?   $this->_Estatura        :$Estatura;
  16.         $this->_Nombre          =is_null($Nombre)           ?   $this->_Nombre          :$Nombre;
  17.         $this->_Apellido        =is_null($Apellido)         ?   $this->_Apellido        :$Apellido;
  18.         $this->_Fechanacimiento =is_null($Fechanacimiento)  ?   $this->_Fechanacimiento :$Fechanacimiento;
  19.         self::$_Sexo            =is_null($Sexo)             ?   $this->_Sexo            :$Sexo;
  20.         $this->_Conocimiento    =$Conocimiento;
  21.     }
  22.  
  23.     //Función de Estatura para mulato
  24.  
  25.     public function getEstaturaMul()
  26.     {
  27.         return $this->_Estatura;
  28.     }
  29.     //Función para Sexo mulato
  30.     public function getSexoMul()
  31.     {
  32.         return self::$_Sexo;
  33.     }
  34.     //FUncion para conocimiento mulato
  35.     public function getConocimientoMul()
  36.     {
  37.         if ($this->_Conocimiento)
  38.         {
  39.             return "Su hoja de vida ah sido registrada gracias por preferirnos.";
  40.         }
  41.         else
  42.         {
  43.             return "Lo sentimos su hoja de vida no ah sido registrada por que no cumple con los requisitos.";
  44.         }
  45.  
  46.     }
  47. }
  48.  
  49. //Clase persona
  50.  
  51. class Persona
  52. {
  53.     private     $_Estatura          = 1.34;
  54.     public      $_Nombre            = "Pedro";
  55.     public      $_Apellido          = "Gomez";
  56.     public      $_Fechanacimiento   = "04/06/1996";
  57.     static      $_Sexo              = "Masculino";
  58.     protected   $_Conocimiento      = TRUE;
  59.  
  60.  
  61.     public function __construct($Estatura = NULL, $Nombre = NULL,
  62.                                 $Apellido = NULL, $Fechanacimiento = NULL,
  63.                                 $Sexo = NULL, $Conocimiento = FALSE)
  64.     {
  65.         $this->_Estatura        =is_null($Estatura)         ?   $this->_Estatura        :$Estatura;
  66.         $this->_Nombre          =is_null($Nombre)           ?   $this->_Nombre          :$Nombre;
  67.         $this->_Apellido        =is_null($Apellido)         ?   $this->_Apellido        :$Apellido;
  68.         $this->_Fechanacimiento =is_null($Fechanacimiento)  ?   $this->_Fechanacimiento :$Fechanacimiento;
  69.         self::$_Sexo            =is_null($Sexo)             ?   $this->_Sexo            :$Sexo;
  70.         $this->_Conocimiento    =$Conocimiento;
  71.     }
  72.     //Funcion para retornar estatura por que el metodo es "private"
  73.     public function getEstatura()
  74.     {
  75.         return $this->_Estatura;
  76.     }
  77.     //Funcion para retornar sexo por que el metodo es "Static"
  78.     public function getSexo()
  79.     {
  80.         return self::$_Sexo;
  81.     }
  82.     //Funcion para retornar conocimiento por que el metodo est protegido
  83.     public function getConocimiento()
  84.     {
  85.         if ($this->_Conocimiento){
  86.             return "Su hoja de vida ah sido registrada gracias por preferirnos.";
  87.         }
  88.         else
  89.         {
  90.             return "Lo sentimos su hoja de vida no ah sido registrada por que no cumple con los requisitos.";
  91.         }
  92.     }
  93.     //Destructor de los metodos
  94.     public function __destruct()
  95.         {
  96.             unset($this->_Estatura);
  97.             unset($this->_Nombre);
  98.             unset($this->_Apellido);
  99.             unset($this->_Fechanacimiento);
  100.             unset($this->Sexo);
  101.             unset($this->_Conocimiento);
  102.            
  103.         }
  104. }
  105.  
  106. //instanciar objetos
  107. $Persona    =   new Persona(1.69,"Juan Diego","Alfonso","04/08/1995","masculino", TRUE);
  108. $Mulato     =   new Mulato  (1.78,"Pedro","Aponte","06/12/1997","masculino", FALSE);
  109.  
  110. //Actividad HTML Persona
  111. echo "Buen día señor(a) ".$Persona->_Nombre." ".$Persona->_Apellido.
  112.      " usted nació el ".$Persona->_Fechanacimiento." mide ".$Persona->getEstatura().
  113.      " y su sexo es ".$Persona->getSexo()."<br>";
  114. echo $Persona->getConocimiento()."<br>";
  115.  
  116.  
  117. ?></center></fieldset>
  118.  
  119.  
  120.  
  121.  
  122. <fieldset><center><?php
  123.  
  124. //Actividad HTML Mulato
  125. echo "Buen día señor(a) ".$Mulato->_Nombre." ".$Mulato->_Apellido.
  126.      " usted nació el ".$Mulato->_Fechanacimiento." mide ".$Mulato->getEstaturaMul().
  127.      " y su sexo es ".$Mulato->getSexoMul()."<br>";
  128. echo $Mulato->getConocimientoMul()."<br>";
  129.  
  130.  
  131.  
  132. ?></center></fieldset>

Etiquetas: metodo, poo
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 18:03.