Foros del Web » Programando para Internet » PHP »

Cómo puedo llamar a un método dentro de la misma clase?

Estas en el tema de Cómo puedo llamar a un método dentro de la misma clase? en el foro de PHP en Foros del Web. Buenas noches, Estoy atascado en un punto. Tengo mi clase usuario definida, la cual tiene varios métodos, pero me gustaría poder llamar dentro de un ...
  #1 (permalink)  
Antiguo 03/10/2010, 15:37
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Cómo puedo llamar a un método dentro de la misma clase?

Buenas noches,

Estoy atascado en un punto. Tengo mi clase usuario definida, la cual tiene varios métodos, pero me gustaría poder llamar dentro de un método a otro que hay en la misma clase. Con un ejemplo creo que se entenderá mejor.

Código PHP:
Ver original
  1. class Usuario{
  2.  
  3.     private $_nombre;
  4.     private $_usuario;
  5.     private $_password;
  6.     private $_correo;
  7.     private $_pais;
  8.     private $_birthday;
  9.     private $_sexo;
  10.     private $_userReferido;
  11.     private $_userKey;
  12.     private $_con;
  13.        
  14.     public function __construct($DbConexion){
  15.             $this->_con=$DbConexion;
  16.     }
  17.    
  18.     // Registrar nuevo usuario
  19.     public function addNewUser($nombre,$usuario,$password,$correo,$pais,$birthday,$sexo,$userReferido){
  20.        
  21.         // Cargo las variables
  22.         $this->_nombre=$nombre;
  23.         $this->_usuario=$usuario;
  24.         $this->_password=$password;
  25.         $this->_correo=$correo;
  26.         $this->_pais=$pais;
  27.         $this->_birthday=$birthday;
  28.         $this->_sexo=$sexo;
  29.         $this->_userReferido=$userReferido;
  30.        
  31.         $this->_userKey = randomKeygen($length=10);
  32.         echo $this->_userKey;
  33.        
  34.         // Inserta datos en la TBL_USERS
  35.         $query = "INSERT INTO tbl_user (`user_login`,`user_pass`,`user_activation_key`) VALUES (:username,:password,:user_activation_key)";
  36.  
  37.         $comando = $this->_con->prepare($query);
  38.         $comando->execute(array(':username'=>$this->_usuario,
  39.                                 ':password'=>$this->_password,
  40.                                 ':user_activation_key'=>$this->_userKey));
  41.        
  42.         // Inserta datos en la TBL_USERS_PERSONAL
  43.  
  44.         // Inserta datos en la TBL_USERS_PREFERENCIAS
  45.  
  46.     }
  47.    
  48.     // Genera un password aleatorio
  49.     function randomKeygen($length=10){
  50.         $key = '';
  51.         list($usec, $sec) = explode(' ', microtime());
  52.         mt_srand((float) $sec + ((float) $usec * 100000));
  53.        
  54.         $inputs = array_merge(range('z','a'),range(0,9),range('A','Z'));
  55.  
  56.         for($i=0; $i<$length; $i++)
  57.         {
  58.             $key .= $inputs{mt_rand(0,61)};
  59.         }
  60.         return $key;
  61.     }
  62. }

Dentro del método addNewUser() me gustaría poder utilizar el método randomKeygen() para generar la clave de activación de la cuenta. Pero cuando lo hago así (linea 31), me dice "Fatal error: Call to undefined function randomKeygen()"

¿Sabéis cómo lo tengo que hacer?

Muchas gracias de antemano!
  #2 (permalink)  
Antiguo 03/10/2010, 15:46
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Cómo puedo llamar a un método dentro de la misma clase?

Podría ser así?

$this->_userKey = self::randomKeygen($length=10);

o así?

$this->_userKey = Usuario::randomKeygen($length=10);

Lo hago bien?

Qué diferencia hay entre usar la primera o la segunda?

Muchas gracias de antemano
  #3 (permalink)  
Antiguo 03/10/2010, 15:49
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 8 meses
Puntos: 1532
Respuesta: Cómo puedo llamar a un método dentro de la misma clase?

$this->_userKey = $this->randomKeygen(10);

con respecto a self usalmente se usa para hacer referencia a constantes y miembros estáticos

si usas Usuario:: es como si usaras self, a diferencia que afectaría si decides cambiar el nombre de la clase
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...

Última edición por maycolalvarez; 03/10/2010 a las 15:55
  #4 (permalink)  
Antiguo 03/10/2010, 16:19
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Cómo puedo llamar a un método dentro de la misma clase?

Cita:
Iniciado por maycolalvarez Ver Mensaje
$this->_userKey = $this->randomKeygen(10);

con respecto a self usalmente se usa para hacer referencia a constantes y miembros estáticos

si usas Usuario:: es como si usaras self, a diferencia que afectaría si decides cambiar el nombre de la clase
Con tu respuesta no me quedo seguro, si hago bien usándolo así o mejor la que propones?

$this->_userKey = $this->randomKeygen($length=10);

Gracias
  #5 (permalink)  
Antiguo 03/10/2010, 22:48
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Cómo puedo llamar a un método dentro de la misma clase?

Es mucho mejor usar $this-> si estas llamando a la propía instancia, ya que si lo haces con self:: o el nombre de la clase no va a funcionar, mira el siguiente ejemplo:
Código PHP:
Ver original
  1. class Test
  2. {
  3.         private $_foo;
  4.  
  5.         public function __construct() {}
  6.  
  7.         public function viewFoo1()
  8.         {
  9.                    echo $this->getFoo();
  10.         }
  11.  
  12.         public function viewFoo2()
  13.         {
  14.                    echo self::getFoo();
  15.         }
  16.  
  17.         public function setFoo($foo)
  18.         {
  19.                     $this->_foo = $foo;
  20.         }
  21.  
  22.         public function getFoo()
  23.         {
  24.                    return $this->_foo;
  25.         }
  26. }
  27.  
  28. $fooObj = new Test();
  29. $fooObj->setFoo('bar');
  30. $fooObj->viewFoo1();
  31. $fooObj->viewFoo2();

Ejecuta el ejemplo y ve el resultado y te podrás dar cuenta el porque es necesario usar $this para llamar a métodos de la misma instancia.

Saludos.
  #6 (permalink)  
Antiguo 04/10/2010, 00:00
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Cómo puedo llamar a un método dentro de la misma clase?

Cita:
Iniciado por GatorV Ver Mensaje
Es mucho mejor usar $this-> si estas llamando a la propía instancia, ya que si lo haces con self:: o el nombre de la clase no va a funcionar
Precisamente probé mi código de las 3 formas y funcionó. No dio ningún error y los valores se insertaron correctamente en la BD

Cita:
Iniciado por GatorV Ver Mensaje

Ejecuta el ejemplo y ve el resultado y te podrás dar cuenta el porque es necesario usar $this para llamar a métodos de la misma instancia.

Saludos.
Ejecuté el código de ejemplo y me pintó 2 veces seguidas "bar" por lo que creo que también funcionó de las dos maneras.

Aunque usaré la que me recomendáis tu y maycolalvarez $this->

Muchas gracias a los dos!
  #7 (permalink)  
Antiguo 04/10/2010, 09:11
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Cómo puedo llamar a un método dentro de la misma clase?

Cierto, al parecer dentro de la clase es indiferente ya que trata de resolverla a la misma clase, aunque no es el comportamiento recomendado es mejor usar $this.

El error se presenta si lo llamas desde afuera de la función.

Saludos.

Etiquetas: clase, llamar
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 23:54.