Professional Documents
Culture Documents
Indice de contenido
5. Constantes
1. Clases y objetos
class Coche {
public $color;
}
Para definir un método:
class Coche {
public function getColor()
{
// Contenido de la función
}
}
Para crear un objeto hay que instanciar una clase:
class Coche {
// Contenido de la clase
}
class Coche {
public $color;
public $potencia;
public $marca;
}
//...
echo 'Color del coche: ' . $miCoche->color; // Muestra Color del
coche: rojo
Ahora vamos a definir un método que devuelve una propiedad:
class Coche {
//...
//...
echo 'Color del coche: ' . $miCoche->getColor();
Las propiedades pueden tener valores por defecto:
class Coche {
public $color = 'rojo';
//...
}
De esta forma siempre que se instancie un objeto de la clase Coche,
éste será de color rojo a no ser que se modifique después. Ahora
creamos también el objeto $otroCoche y le ponemos otras
características:
class Coche {
class Coche {
function printCaracteristicas($cocheConcreto)
{
echo 'Color: '. $cocheConcreto->getColor();
echo "\n";
echo 'Potencia: '. $cocheConcreto->getPotencia();
echo "\n";
echo 'Marca: '. $cocheConcreto->getMarca();
}
printCaracteristicas($miCoche);
echo "\n";
printCaracteristicas($otroCoche);
La función printCaracteristicas() requiere un
argumento, $cocheConcreto, que es una instancia de la clase Coche que
mostrará las características del propio objeto.
class Coche {
//...
//...
if ($miCoche->elCocheElegidoEsMasRapido($otroCoche)) {
echo 'El ' . $otroCoche->marca . ' es más rápido';
} else {
echo 'El ' . $miCoche->marca . ' es más rápido';
}
$miCoche->elCocheElegidoEsMasRapido($otroCoche);
// En este caso el Audi ($miCoche) es más rápido que el BMW
($otroCoche)
Podemos comparar la igualdad entre dos objetos, con los operadores
de comparación (==) y de identidad (===):
Dos objetos serán iguales si tienen los mismos atributos y
valores, siendo instancias de la misma clase. En ejemplo anterior,
los atributos de los dos objetos deberían tener los mismos
valores, por ejemplo: verde, 100, audi.
class Coche {
//...
//...
$miCoche->setPotencia(120);
También deberemos de tener un getter para poder acceder al valor que
tiene establecido la propiedad:
//...
public function getPotencia()
{
return $this->potencia;
}
//...
Con esto conseguimos, entre otras cosas, que puedan definirse valores
limitados. En este caso, la propiedad $potencia queremos que pueda
ser sólo un número. Para ello, modificamos el setter anterior:
//...
public function setPotencia($potencia)
{
if(!is_numeric($potencia)){
throw new \Exception('Potencia no válida: '.
$potencia);
}
// Si $potencia no es un número, devolverá un error
$this->potencia = $potencia;
}
//...
Para entender las propiedades y métodos bajo la palabra reservada
protected, vamos a explicar primero las relaciones entre clases
mediante la herencia.
class Coche {
private $color = 'red';
protected $potencia = 120;
public $marca = 'audi';
}
class CocheDeLujo extends Coche {
class Coche {
protected $color;
public function setColor($color)
{
$this->color = $color;
}
public function getColor()
{
return $this->color;
}
public function printCaracteristicas()
{
echo 'Color: '. $this->getColor;
}
}
Añadimos otros métodos en CocheDeLujo, y modificamos la herencia
de printCaracteristicas():
Private:
Protected:
Public:
class Coche {
final public function getColor()
{
echo "Rojo";
}
}
class CocheDeLujo extends Coche {
public function getColor()
{
echo "Azul";
}
} // Dará un error fatal, getColor() no puede sobreescribirse
También se puede impedir que la clase pueda heredarse mediante la
misma palabra:
4. Paamayim Nekudotayim
5. Constantes
class Coche {
const RUEDAS = 4;
}
// Obtener el valor mediante el nombre de la clase:
echo Coche::RUEDAS . "\n";
// Obtener el valor mediante el objeto:
$miCoche = new Coche();
echo $miCoche::RUEDAS . "\n";
class Coche {
public static $color = 'rojo';
class Coche {
public static function mostrarColor()
{
echo 'Rojo';
}
}
Coche::mostrarColor(); // Muestra Rojo
$miCoche = new Coche;
$miCoche->mostrarColor(); // Muestra Rojo
7. Traits
Los traits son como clases que agrupan funcionalidades diseñadas para
ser reutilizadas en otras clases y así evitar las limitaciones de
la herencia simple. A diferencia de las clases, no se pueden
instanciar, tan sólo permiten utilizar sus funciones específicas en otras
clases. Los traits permiten relaciones horizontales entre clases evitando
así la verticalidad.
class Coche {
public function getMarca() {
echo 'Renault ';
}
}
trait Modelo {
public function getModelo() {
parent::getMarca();
echo 'Clio';
}
}
class Ventas extends Coche {
use Modelo;
}
$o = new Ventas();
$o->getMarca(); // Podemos obtener este método de la clase Coche
$o->getModelo(); // Podemos obtener este método del trait Modelo
Se pueden emplear múltiples traits añadiéndolos a la clase:
trait Coche {
public function getMarca() {
echo 'Renault ';
}
}
trait Modelo {
public function getModelo() {
echo 'Clio';
}
}
trait CocheModelo {
use Coche, Modelo;
}
class Venta {
use CocheModelo;
}
$o = new Venta();
$o->getMarca();
$o->getModelo();
Los traits también pueden incluir propiedades y métodos estáticos.
8. Type hinting
class Coche {
public function listadoCochesEnVenta(Venta $venta)
{
echo $venta->coche;
}
}
$venta = new Venta;
$coche = new Coche;
$coche->listadoCochesEnVenta($venta); // Devuelve Audi
Si se pusiera, por ejemplo $coche->listadoCochesEnVenta('Audi') daría
error, ya que no es una clase instanciada.
class Coche {
public function listadoCochesEnVenta(Array $listado)
{
foreach ($listado as $coche){
echo $coche . "\n";
}
}
}
$listaCoches = ['Audi', 'BMW'];
9. Métodos mágicos
class Coche {
public $color;
class Coche {
public $color;
class Post {
public $title;
public function setTitle($title)
{
$this->title = $title;
}
public function __toString()
{
return $this->title;
}
}