Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre uno de los pilares en cualquier lenguaje de programacion.

Anuncios

La herencia es como su nombre lo indica es la capacidad de pasar elementos de una clase a otra, ya sea tanto las propiedades como los metodos, esto nos brinda la posibilidad de poder crear varias clases que compartan elementos entre si y nos faciliten algunas tareas, la herencia se hace a traves de la palabra extends, veamos su sintaxis:

class nombreClase extends claseMaestra
{
    ... instrucciones ...
}
Anuncios

El uso es muy simple donde primero crearemos la clase como siempre pero la seguiremos de la palabra extends seguido del nombre de la clase que sera la original o maestra, despues el resto es como siempre pero con algunas sutiles diferencias, para entender este concepto vamos a crear un ejemplo simple y para ello haremos un nuevo archivo que llamaremos herencia.php y le agregaremos el siguiente codigo:

herencia.php

<?php

class animal
{
	public $nombre;
	public $sonido;

	public function hablar()
	{
		echo $this->nombre . " dice " . $this->sonido . "\n";
	}
}

class perro extends animal
{
	public $nombre = "Arturo";
	public $sonido = "Guau, Guau!";
}

$perro = new perro();
$perro->hablar();

?>
Anuncios
Anuncios

Esto es lo mas basico en herencia donde primero crearemos una clase que sera nuestra base o maestra llamada animal, en esta tenemos dos propiedades para almacenar el nombre y sonido que emita el animal, esta clase a su vez posee un metodo llamado hablar que nos mostrara un mensaje indicando el nombre del animal y el sonido que emite, nuestra siguiente clase sera perro y esta sera heredera de animal pero en esta definiremos los valores de nombre y sonido, observen que tambien debemos designarlos como publico de lo contrario nos devolvera un error porque necesitamos mantener el mismo tipo de acceso en las variables, por ultimo creamos un nuevo objeto del tipo perro y desde este llamaremos a hablar para ver esta funcion en accion, veamos su salida:

Anuncios
Nota: 
En general cuando no informamos el tipo de acceso puede asumir public o private pero tambien un valor interno del lenguaje, por esta razon debemos informar el public en el heredero.
tinchicus@dbn001vrt:~/lenguajes/PHP$ php herencia.php 
Arturo dice Guau, Guau!
tinchicus@dbn001vrt:~/lenguajes/PHP$
Anuncios

Como podran darse cuenta perro heredo no solo las propiedades sino que tambien pudimos acceder al metodo de la clase maestra, vamos a tomar este codigo y lo modificaremos de la siguiente manera:

<?php

class animal
{
	public $nombre;
	public $sonido;

	public function __construct($nombre, $sonido)
	{
		$this->nombre = $nombre;
		$this->sonido = $sonido;
	}

	public function hablar()
	{
		echo $this->nombre . " dice " . $this->sonido . "\n";
	}
}

class perro extends animal
{
	public function __construct()
	{
		parent::__construct("Arturo", "Guau!! Guau!!");
	}
}

$perro = new perro();
$perro->hablar();

?>
Anuncios
Anuncios

En este caso tomamos el codigo anterior y le agregamos el constructor para recibir dos valores e iniciarlos en el objeto creado a partir de la clase tanto heredera como base, el resto de la clase sigue igual, la otra diferencia la tenemos en la clase hija donde no definimos a las variables sino que tenemos un constructor y desde este llamamos al constructor padre (parent) seguido del operador de resolucion de rango (::) para decirle que llame al constructor de la clase base o parent, como en la clase definimos al constructor para que reciba dos valores en este le enviamos dichos valores, luego volvemos a crear el objeto y usamos el metodo hablar, probemos para ver su salida:

tinchicus@dbn001vrt:~/lenguajes/PHP$ php herencia.php 
Arturo dice Guau!! Guau!!
tinchicus@dbn001vrt:~/lenguajes/PHP$
Anuncios

Como pueden ver siguio funcionando y pudimos trabajar con un metodo de la clase base directamente sin necesidad de pasar por el objeto, en comparacion es muy similar a cuando usamos super en java para indicar que el metodo a utilizar es el de la clase base o maestra, vamos a ver el siguiente tema y para ello modificaremos el codigo de la siguiente manera:

<?php

class animal
{
	public $nombre;
	public $sonido;

	public function __construct($nombre, $sonido)
	{
		$this->nombre = $nombre;
		$this->sonido = $sonido;
	}

	public function hablar()
	{
		echo $this->nombre . " dice " . $this->sonido . "\n";
	}
}

class perro extends animal
{
	public function __construct()
	{
		parent::__construct("Arturo", "Guau!! Guau!!");
	}
}

class gato extends animal
{
	public $edad = 10;
	public $tipo = "gato";
	public function __construct()
	{
		parent::__construct("Invisible", "Miauuuuu!!!");
	}

	public function datos()
	{
		echo $this->nombre . " es un " . $this->tipo . 
			" y tiene " . $this->edad . " años de edad.\n";
	}
}

$perro = new perro();
$gato = new gato();

$perro->hablar();
$gato->hablar();
$gato->datos();

?>
Anuncios

Este codigo sigue trabajando de la misma forma a la anterior pero las unicas diferencias que tenemos son esta nueva clase:

class gato extends animal
{
	public $edad = 10;
	public $tipo = "gato";
	public function __construct()
	{
		parent::__construct("Invisible", "Miauuuuu!!!");
	}

	public function datos()
	{
		echo $this->nombre . " es un " . $this->tipo . 
			" y tiene " . $this->edad . " años de edad.\n";
	}
}
Anuncios

En la cual primero agregaremos dos nuevas propiedades para la edad y el tipo de animal, en este caso indicaremos que es solo un gato, luego crearemos un constructor para iniciar el constructor maestro y sus respectivos datos, tal como hicimos con perro, y despues agregamos un nuevo metodo llamado datos el cual nos devolvera el nombre del gato, el tipo y su edad, nuestra siguiente modificacion sera en la creacion de un nuevo objeto de tipo gato, y a este nuevo objeto le diremos que use el metodo hablar y datos, veamos su salida:

tinchicus@dbn001vrt:~/lenguajes/PHP$ php herencia.php 
Arturo dice Guau!! Guau!!
Invisible dice Miauuuuu!!!
Invisible es un gato y tiene 10 años de edad.
tinchicus@dbn001vrt:~/lenguajes/PHP$
Anuncios

Observen como no solamente pudo acceder a los elementos de la clase animal sino que a su vez tiene sus propios elementos que no interfieren con el resto pero que sucede si animal intenta acceder a los elementos de gato? prueben de crear un objeto de tipo animal y llamar a la funcion datos, les debera devolver el siguiente error:

PHP Fatal error:  Uncaught Error: Call to undefined method animal::datos()
Anuncios

Esto es debido a que la herencia es siempre hacia abajo y no en ambas direcciones, lo que no se defina en la clases maestras o superiores no podran ser accedidas en sus hijas, en cambio sus hijas siempre podran acceder a sus padres, y a su vez poseen la capacidad de tener sus elementos propios, cuando aprendan a usarlo se convierte en una herramienta fundamental para trabajar, con esto cubrimos herencia pasemos a hablar sobre el siguiente tema como es lo estatico.

Anuncios

static

La palabra clave static nos brinda la posibilidad de poder acceder a metodos de una clase sin necesidad de instanciarlos a traves de un objeto creado del mismo, como vimos hasta ahora, es decir que esto nos brinda la posibilidad de crear una clase contenedora de metodos que podemos acceder libremente en cualquier momento del codigo porque la palabra static le indica al lenguaje que ese metodo siempre estara en el mismo lugar con los mismos permisos, para entender el concepto vamos a tomar el codigo de herencia.php y le haremos una pequeña modificacion:

herencia.php

<?php

class animal
{
	public $nombre;
	public $sonido;

	public function __construct($nombre, $sonido)
	{
		$this->nombre = $nombre;
		$this->sonido = $sonido;
	}

	public function hablar()
	{
		echo $this->nombre . " dice " . $this->sonido . "\n";
	}

	public static function info()
	{
		echo "Este metodo es de la clase base\n";
	}
}

class perro extends animal
{
	public function __construct()
	{
		parent::__construct("Arturo", "Guau!! Guau!!");
	}
}

class gato extends animal
{
	public $edad = 10;
	public $tipo = "gato";
	public function __construct()
	{
		parent::__construct("Invisible", "Miauuuuu!!!");
	}

	public function datos()
	{
		echo $this->nombre . " es un " . $this->tipo . 
			" y tiene " . $this->edad . " años de edad.\n";
	}
}

$perro = new perro();
$gato = new gato();

$perro->hablar();
$gato->hablar();
$gato->datos();

animal::info();

?>
Anuncios

La unica modificacion en el codigo sera este bloque o metodo:

	public static function info()
	{
		echo "Este metodo es de la clase base\n";
	}
Anuncios

Para poder ser accedido siempre le informamos que sea public seguido de static y despues definimos a la funcion como siempre y en este caso nos informara que el metodo es de la clase base, el resto del codigo es tal cual como lo vimos anteriormente pero ahora al final del codigo agregamos la siguiente linea:

animal::info();
Anuncios

No es otra cosa que la llamada al metodo directo pero le indicamos que debe buscarlo dentro de la clase animal, sin necesidad de crear el objeto, si lo probamos veremos la siguiente salida:

tinchicus@dbn001vrt:~/lenguajes/PHP$ php herencia.php 
Arturo dice Guau!! Guau!!
Invisible dice Miauuuuu!!!
Invisible es un gato y tiene 10 años de edad.
Este metodo es de la clase base
tinchicus@dbn001vrt:~/lenguajes/PHP$
Anuncios

Como pueden ver funciono correctamente sin afectar a ninguno de los otros metodos disponibles ni tampoco a sus objetos.

Anuncios

En resumen, hoy hemos hablado sobre herencia, como es, como nos beneficia, como podemos sacar un buen provecho, en que sentido trabaja, como seguimos siendo independientes a pesar de la heremcia, y por ultimo hemos visto que son los metodos estaticos y para que se usan principalmente, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50