llamar a un metodo dentro de otro

2,777 views
Skip to first unread message

cesar barcia

unread,
Jul 19, 2011, 9:52:53 PM7/19/11
to Grupo PHP Argentina
hola gente como estan?

Necesito hacer una consulta basica, pero no tengo claro como hacer
esto..
Tengo una clase donde creo 2 metodos muy simples.. uno para cargar un
nombre y el otro para mostrar ese nombre en pantalla nada mas. Les
muestro el codigo a completar:

<?php
class Practica{

var $nom;
var $ape;

public function nombre($nombre, $apellido){

$this->nom = $nombre;
$this->ape = $apellido;

return $this->nom." ".$this->ape;
}

public function muestra_nombre(){

}

}
?>


<?php
$obj = new Practica();
$obj->nombre("Cesar","Barcia");
echo $obj->muestra_nombre();
?>

Ven loque quiero hacer?

llamar este metodo solo para cargar el nombre: $obj-
>nombre("Cesar","Barcia");

y despues hacer un echo a este otro metodo para imprimir ese nombre
cargado en pantalla: echo $obj->muestra_nombre();

espero me den una mano gente y disculpas por la simplicidad :) pero no
lo se.

Agustín Quiroga

unread,
Jul 19, 2011, 10:03:35 PM7/19/11
to php...@googlegroups.com
Si no entendi mal, yo haria esto:

> <?php
> class Practica{
>
> var $nom;
> var $ape;
>
> public function nombre($nombre, $apellido){
>
> $this->nom = $nombre;
> $this->ape = $apellido;
>

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


> return $this->nom." ".$this->ape;
> }
>
> }

> ?>

Agustín Quiroga

---------------------------
Web.Q
http://www.webq.com.ar
@AgusQuiroga

> --
> Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP Argentina" de Grupos de Google.
> Para publicar una entrada en este grupo, envía un correo electrónico a php...@googlegroups.com.
> Para anular tu suscripción a este grupo, envía un correo electrónico a php-arg+u...@googlegroups.com
> Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/php-arg?hl=es.
>

Santiago Rojo

unread,
Jul 19, 2011, 10:24:01 PM7/19/11
to php...@googlegroups.com
Yo agregaría que empieces a ver de migrar tus clases a PHP5-POO, es mucho más robusto, y podrás implementar correctamente conceptos, como encapsulamiento, herencia, polimorfismo y todo lo demás. Por ejemplo clase quedaría así.

<?php

class Practica {

    private $nom;
    private $ape;


    public function nombre($nombre, $apellido) {
        $this->nom = $nombre;
        $this->ape = $apellido;

        return muestra_nombre();

    }

    public function muestra_nombre(){
        return $this->nom . " " . $this->ape;
    }

}
 
?>

También podrías seguir algunas de los estándares de codificación, eso te lo dejo a tu criterio, es mas personal. Tampoco tengas miedo de usar nombres mas descriptivos, al menos para los nombres de tus clases, atributos y métodos.

Tu duda ya la había contestado Agustín, pero me pareció bueno hacer este aporte.

Saludos.

2011/7/19 Agustín Quiroga <agusq...@gmail.com>



--
Santiago Rojo
 http://www.santiagorojo.com.ar | @tiagox

Sergio Gabriel Rodriguez

unread,
Jul 19, 2011, 11:41:51 PM7/19/11
to php...@googlegroups.com
2011/7/19 Santiago Rojo <tia...@gmail.com>

Yo agregaría que empieces a ver de migrar tus clases a PHP5-POO, es mucho más robusto, y podrás implementar correctamente conceptos, como encapsulamiento, herencia, polimorfismo y todo lo demás

Coincido con  Santiago en que comiences a usar la sintaxis de PHP5, pero no coincido con el ejemplo de Agustín
 
<?php

class Practica {

    private $nom;
    private $ape;


    public function nombre($nombre, $apellido) {
        $this->nom = $nombre;
        $this->ape = $apellido;

        return muestra_nombre();

    }

    public function muestra_nombre(){
        return $this->nom . " " . $this->ape;
    }

}
 
?>


En este caso nombre() es un setter y no debería llamar a otro método ya que no nos interesa imprimir en este punto, no tiene sentido hacer un echo $practica->nombre('Juan', 'Perez') si sólo estamos asignando valores a los atributos, desconozco la semántica de tu problema pero si la clase se llamara Persona usaría el método __toString():

<?php

class Persona
{
    private $_nombre;
    private $_apellido;

    public function __construct($nombre, $apellido)
    {
        $this->_nombre = $nombre;
        $this->_apellido = $apellido;
    }

    public function __toString()
    {
        return $this->_nombre . ' ' . $this->_apellido;
    }
}


$persona = new Persona('Sergio', 'Rodríguez');
echo $persona;


Saludos!

--
Sergio Gabriel Rodríguez
http://www.3trex.com.ar
Corrientes - Argentina

Agustin Quiroga

unread,
Jul 20, 2011, 7:27:39 AM7/20/11
to php...@googlegroups.com
Coincido con vos, no me gusto el ejemplo de Agustin... Pero bueno, era un pequeño ejemplo para salir del paso. El tuyo ya seria hacerlo bien del todo.

Agustin Quiroga
----------------------
@AgusQuiroga
--

cesar barcia

unread,
Jul 20, 2011, 12:25:54 PM7/20/11
to Grupo PHP Argentina
muy bien gente bien claro ahora el tema, les agradezco a todos sus
respuestas... lo que me queda colgado es en el ejemplo de agusto el
puso el primer metodo de esta forma:

public function nombre($nombre, $apellido){

$this->nom = $nombre;
$this->ape = $apellido;

return $this->muestra_nombre();
}

me interesa saber el por que de esta linea:

return $this->muestra_nombre();

para que se usaria algo asi? nunca lo habi visto, en algun ejemplo
sencillo me podran mostrar su funcionalidad?

se los agradesco de antemano.

On 20 jul, 08:27, Agustin Quiroga <agusquir...@webq.com.ar> wrote:
> Coincido con vos, no me gusto el ejemplo de Agustin... Pero bueno, era un
> pequeño ejemplo para salir del paso. El tuyo ya seria hacerlo bien del todo.
>
> Agustin Quiroga
> ----------------------www.webq.com.ar
> @AgusQuiroga
>
> El 20/07/2011, a las 00:41, Sergio Gabriel Rodriguez <sgrodrig...@gmail.com>
> Sergio Gabriel Rodríguezhttp://www.3trex.com.ar

p8queen

unread,
Jul 20, 2011, 2:20:38 PM7/20/11
to php...@googlegroups.com
2011/7/20 Sergio Gabriel Rodriguez <sgrod...@gmail.com>:

>
> En este caso nombre() es un setter y no debería llamar a otro método ya que
> no nos interesa imprimir en este punto, no tiene sentido hacer un echo
> $practica->nombre('Juan', 'Perez') si sólo estamos asignando valores a los
> atributos, desconozco la semántica de tu problema pero si la clase se
> llamara Persona usaría el método __toString():
>
> <?php
>
> class Persona
> {
>     private $_nombre;
>     private $_apellido;
>
>     public function __construct($nombre, $apellido)
>     {
>         $this->_nombre = $nombre;
>         $this->_apellido = $apellido;
>     }
>
>     public function __toString()
>     {
>         return $this->_nombre . ' ' . $this->_apellido;
>     }
> }
>
>
> $persona = new Persona('Sergio', 'Rodríguez');
> echo $persona;
>

Esto es lo correcto.
Básicamente esta clase (que modela una entidad), seria
Persona
- nombre
- apellido
+ constructor
+ setters & getters
+ toString

el - (menos) es para evitar acceso, es decir, los atributos son
privados. El + (más) son accesos públicos, podrán encontrarlo como
métodos públicos o la interfaz de la clase, depende de la literatura.
También pueden copiarse de como lo hace un Java Boy.

un abrazo,


--
Gustavo C

Agustin Quiroga

unread,
Jul 20, 2011, 2:23:13 PM7/20/11
to php...@googlegroups.com
Cesar, 
En el primer ejemplo que enviaste el metodo que setea nombre y apellido del usuario devuelve estos mismos formateados separados por espacio, de ahi ponerlo ahi, para devolver formatados los datos.
Solo por eso, en teoria, como bien dijeron todos un metodo "setter" no deberia devolver nada.
Abrazo,


Agustín Quiroga
Web.Q
Web. www.webq.com.ar
Twitter. @AgusQuiroga
Tel: +54.11.5368.7921 - Skype: WebQ_Online - Dir: Juncal 2622, 5to. C
Ciudad Autónoma de Buenos Aires, Argentina.
"Asesoramiento, desarrollo y soporte para proyectos y negocios en internet."



2011/7/20 p8queen <p8q...@gmail.com>

Sergio Gabriel Rodriguez

unread,
Jul 20, 2011, 2:37:14 PM7/20/11
to php...@googlegroups.com
Volviendo a la pregunta inicial de César y al título del hilo, tres ejemplos que se me ocurren de llamar a un método dentro de otro es

a) Para reutilizar código, si en un método tenemos escrita una funcionalidad, y la necesitamos en otro método de la misma clase, no vamos a escribir el código de nuevo, sino llamar a este método

b) Cuando desde un método público llamamos a un método privado, ya que es la única forma de accederlos y

c) Cuando el método que estamos llamando pertenece a un objeto que recibimos cómo parámetro, típico caso de polimorfismo


Saludos


--
Sergio Gabriel Rodríguez
http://www.3trex.com.ar
Corrientes - Argentina


"La herramienta de optimización más poderosa en existencia puede ser la tecla Delete.              Uno de mis días más productivos fue cuando deseché 1000 líneas de código."

               Ken Thompson

Santiago Rojo

unread,
Jul 20, 2011, 2:42:02 PM7/20/11
to php...@googlegroups.com
No se si hago bien en comentar esto ahora ya que podría confundir un poco. Pero a veces es técnica que hace mas comoda la escritura de codigo, que es: en los setters o métodos que no tienen ningún tipo de retorno, hacer un:

return $this;

Esto sirve para un caso que por ejemplo quiero hacer una concatenación de métodos. Por ejemplo:

class Persona ()
{

private $_nombre;
private $_apellido;

public function setNombre ($nombre)
{
$this->_nombre = $nombre;
return $this;
}

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

public function __toString ()
{
return $this->_nombre . " " $this->_apellido;
}

}

Y asi podriamos usar esta clase de la siguiente manera:

<?php

$persona = new Persona();
$persona->setNombre("Alberto")
->setApellido("Fernandez");

echo $persona;
 
Espero no haber confundido nadie.

Saludos

2011/7/20 Agustin Quiroga <agusq...@webq.com.ar>

Alejandro Mohamad

unread,
Jul 20, 2011, 2:42:46 PM7/20/11
to php...@googlegroups.com
El ejemplo completo pedido sería algo así:

<?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 setApellido($apellido)
    {
        $this->_apellido = $apellido;
    }

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

    public function getApellido()
    {
        return $this->_apellido;

    }

    public function __toString()
    {
        return $this->_nombre . ' ' . $this->_apellido;
    }
}


$persona = new Persona('Sergio', 'Rodríguez'); // con el constructor se guardan las propiedades cuando se instancia el objeto
echo $persona; // imprime el nombre y apellido, gracias al toString()
echo '<br>';
$persona->setNombre('Alejandro'); // guarda (set) el nombre
$persona->setApellido('Mohamad'); // guarda (set) el apellido
echo $persona->getNombre . ' ' . $persona->getApellido; // recuper (get) el nombre y luego el apellido

A esto se refieren con los getters y setters. En OOP conviene acceder a las propiedades a través de métodos públicos y no a la propiedad directamente.
Para entender un poco más, te recomiendo ver este link [ http://devzone.zend.com/node/view/id/638 ], aunque ahi no se acaba. :P
Espero haber sido claro.
Saludos!

---
Alejandro Mohamad
PHP Developer ~ ZCE PHP 5.3



2011/7/20 Agustin Quiroga <agusq...@webq.com.ar>

Alejandro Mohamad

unread,
Jul 20, 2011, 2:45:31 PM7/20/11
to php...@googlegroups.com
Perdón, en la última línea se me olvidó agregar los paréntesis. Debe ser todo el sueño junto. XD

echo $persona->getNombre() . ' ' . $persona->getApellido(); // recuper (get) el nombre y luego el apellido


---
Alejandro Mohamad

PHP Developer ~ ZCE PHP 5.3



2011/7/20 Alejandro Mohamad <alejandr...@gmail.com>

Federico

unread,
Jul 20, 2011, 7:02:29 PM7/20/11
to php...@googlegroups.com
Hablando de setters y getters, no hay que olvidar los metodos "magicos" __set() y __get().
Pueden ser muy utiles. A continuacion un ejemplo.

Se pueden usar para separar los atributos propios de lo que representa el objeto de atributos propios del objeto.

Class Persona {
private $_data = array();

public function __set($attr, $valor) {
if (!isset($this->$attr)) {
$this->_data[$attr] = $valor;
return;
}
$this->$attr = $valor;
}

public function __get($attr) {
if (isset($this->_data[$attr])) {
return $this->_data[$attr];
}
return $this->$attr;
}

public function get_full_name() {
return $this->nombre.', '.$this->apellido;
}
}

$persona = new Persona();
$persona->nombre = 'Juan';
$persona->apellido = 'Perez';
echo $persona->get_full_name(); // devuelve "Juan, Perez"

De esta forma, no es necesario definir multiples metodos setters o getters.

2011/7/20 Alejandro Mohamad <alejandr...@gmail.com>

Sergio Gabriel Rodriguez

unread,
Jul 20, 2011, 7:19:51 PM7/20/11
to php...@googlegroups.com
2011/7/20 Federico <fede...@gmail.com>
Hablando de setters y getters, no hay que olvidar los metodos "magicos" __set() y __get().
Pueden ser muy utiles. A continuacion un ejemplo.

Se pueden usar para separar los atributos propios de lo que representa el objeto de atributos propios del objeto.

$persona = new Persona();
$persona->nombre = 'Juan';
$persona->apellido = 'Perez';
echo $persona->get_full_name(); // devuelve "Juan, Perez"

De esta forma, no es necesario definir multiples metodos setters o getters.

 Lo malo de esto, o al menos para mi, es que el usuario de nuestra clase puede agregar atributos a su gusto y paladar, a mi entender rompe el encapusalimiento, nunca lo usé así que a lo mejor estoy equivocado..


--
Sergio Gabriel Rodríguez
http://www.3trex.com.ar
Corrientes - Argentina


Federico

unread,
Jul 20, 2011, 8:29:23 PM7/20/11
to php...@googlegroups.com
No necesariamente. En el __set() podes poner cualquier restriccion que
vos quieras.
Por ejemplo, podes tener definidos en un array los atributos
permitidos. Incluso podrias definir reglas de validacion para cada uno
los attributos.

Tambien podrias tenerlos (el __set() y el __get()) en una clase
"padre" sobre la cual vos extendes.

Esto es muy comun en un ORM por ejemplo.

2011/7/20 Sergio Gabriel Rodriguez <sgrod...@gmail.com>:

Betos

unread,
Jul 21, 2011, 1:18:06 AM7/21/11
to Grupo PHP Argentina
Hola Cesar, como estas? mira por lo general los metodos de entrada/
salida se definen anteponiendo get/set para un mejor entendimiento de
lo que hace cada metodo, yendo al codigo... tenes 2 funciones una para
setear variables y otra para devolver los valores seteados, entonces
en la primer funcion "nombre()" solo haces las asignaciones y en la
segunda "muestra_nombre()" haces el return, esto quedaria asi:


<?php
class Practica{
var $nom;
var $ape;
public function nombre($nombre, $apellido){
$this->nom = $nombre;
$this->ape = $apellido;
}

public function muestra_nombre(){
return $this->nom." ".$this->ape;
}
}

?>
<?php
$obj = new Practica();
$obj->nombre("Cesar","Barcia");
echo $obj->muestra_nombre();
?>


[COMMENT]: estaria mas claro si reemplazas los nombres de las
funciones por set_nombre($params...); get_nombre();

espero te sirva. un abrazo.

Betos.

cesar barcia

unread,
Jul 21, 2011, 5:04:34 PM7/21/11
to php...@googlegroups.com
Gente muchas muchas gracias a todos por  sus ayudar y por ir un pocomas alla con sus respuesta mostrar algunas otras cosas tambien :) me a uedado mas claro y voy a empezar a estudiar sobre lo metodos magicos ..

una ultima consulta que me queda colgada sobre la raiz de lo que fue la pregunta, siguiendo una clase similar estaria bien esta forma de llamar un metodo a dentro de otro:


class Practica2{
   
    private $val1;
    private $val2;
   
    public function __construct($valor1, $valor2){
        $this->val1 = $valor1;
        $this->val2 = $valor2;   
    }
    public function getV1(){
        return $this->val1;   
    }
    public function getV2(){
        return $this->val2;   
    }
    public function __toString(){
        return "el primer valor es: ".$this->getV1()." y el segundo: ".$this->getV2();
    }
   

}

$p2 = new Practica2(2, 5);
echo $p2;


Que les parece es la forma de llamar al valor de un metodo de una clase para usarlo en otro metodo?

Sergio Gabriel Rodriguez

unread,
Jul 21, 2011, 5:12:07 PM7/21/11
to php...@googlegroups.com
Si, de hecho los talibanes de la oop recomiendan usar siempre los
getters/setters inclusive dentro de los metodos de la misma clase,
obviamente no siempre es practico.
Saludos

On 7/21/11, cesar barcia <cesa...@gmail.com> wrote:
> Gente muchas muchas gracias a todos por sus ayudar y por ir un pocomas alla
> con sus respuesta mostrar algunas otras cosas tambien :) me a uedado mas
> claro y voy a empezar a estudiar sobre lo metodos

> magicos<http://php.net/manual/es/language.oop5.magic.php>..


>
> una ultima consulta que me queda colgada sobre la raiz de lo que fue la
> pregunta, siguiendo una clase similar estaria bien esta forma de llamar un
> metodo a dentro de otro:
>
>
> class Practica2{
>
> private $val1;
> private $val2;
>
> public function __construct($valor1, $valor2){
> $this->val1 = $valor1;
> $this->val2 = $valor2;
> }
> public function getV1(){
> return $this->val1;
> }
> public function getV2(){
> return $this->val2;
> }
> public function __toString(){
> return "el primer valor es: ".$this->getV1()." y el segundo:
> ".$this->getV2();
> }
>
>
> }
>
> $p2 = new Practica2(2, 5);
> echo $p2;
>
>
> Que les parece es la forma de llamar al valor de un metodo de una clase para
> usarlo en otro metodo?
>

> --
> Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP
> Argentina" de Grupos de Google.

> Para ver este debate en la Web, visita
> https://groups.google.com/d/msg/php-arg/-/_k6WP8PXqPcJ.


> Para publicar una entrada en este grupo, envía un correo electrónico a
> php...@googlegroups.com.
> Para anular tu suscripción a este grupo, envía un correo electrónico a
> php-arg+u...@googlegroups.com
> Para tener acceso a más opciones, visita el grupo en
> http://groups.google.com/group/php-arg?hl=es.
>
>

Reply all
Reply to author
Forward
0 new messages