2.1. Clases y objetos
Supongamos que tenemos una clase llamada Fruit
. Una fruta puede tener propiedades como nombre, color, peso, etc. Podemos definir variables como $nombre, $color y $peso para contener los valores de estas propiedades.
Cuando se crean los objetos individuales (manzana, plátano, etc.), heredan todas las propiedades y comportamientos de la clase, pero cada objeto tendrá diferentes valores para las propiedades.
Definir una clase
Una clase se define usando la palabra clave class
, seguida del nombre de la clase y un par de llaves ({}
). Todas sus propiedades y métodos van dentro de las llaves:
<?php
class Fruit {
//...
}
?>
A continuación, declaramos una clase llamada Fruit
que consta de dos propiedades ($name y $color) y dos métodos set_name()
y get_name()
para establecer y obtener la propiedad $name:
<?php
class Fruit {
// Propiedades
public $name;
public $color;
// Métodos
function set_name($name) {
$this->name = $name;
}
function get_name() {
return $this->name;
}
}
?>
En una clase, las variables se llaman propiedades y las funciones se llaman métodos.
Definir objetos
Para utilizar las clases debemos crear objetos. Podemos crear múltiples objetos de una clase. Cada objeto tiene todas las propiedades y métodos definidos en la clase, pero tendrán diferentes valores de propiedad.
Los objetos de una clase se crean utilizando la palabra clave new
. En el siguiente ejemplo, $manzana y $banana son instancias de la clase Fruit
:
$apple = new Fruit();
$banana = new Fruit();
$apple->set_name('Apple');
$banana->set_name('Banana');
echo $apple->get_name();
echo "<br>";
echo $banana->get_name();
Modificadores de acceso
Las propiedades y los métodos pueden tener modificadores de acceso que controlan dónde se pueden acceder a ellos.
Hay tres modificadores de acceso:
- public: se puede acceder a la propiedad o método desde cualquier lugar. Esta es la opción por defecto.
- protected: se puede acceder a la propiedad o método dentro de la clase y por clases derivadas de esa clase
- private: Solo se puede acceder a la propiedad o método dentro de la clase.
En el siguiente ejemplo, hemos agregado tres modificadores de acceso diferentes a tres propiedades (nombre, color y peso). Aquí, si se intenta establecer la propiedad de nombre, funcionará bien (porque la propiedad de nombre es pública y se puede acceder desde cualquier lugar). Sin embargo, si intenta establecer la propiedad de color o peso, se producirá un error fatal (porque las propiedades de color y peso están protegidas y son privadas):
<?php
class Fruit {
public $name;
protected $color;
private $weight;
}
$mango = new Fruit();
$mango->name = 'Mango'; // OK
$mango->color = 'Yellow'; // ERROR
$mango->weight = '300'; // ERROR
?>
En el siguiente ejemplo añadimos unos métodos con tres modificadores de acceso diferentes.
En este caso se podrá acceder a la función set_name
perfectamente pero no a las funciones de set_color
y set_weight
porque son protected
y private
.
<?php
class Fruit {
public $name;
public $color;
public $weight;
function set_name($n) { // a public function (default)
$this->name = $n;
}
protected function set_color($n) { // a protected function
$this->color = $n;
}
private function set_weight($n) { // a private function
$this->weight = $n;
}
}
$mango = new Fruit();
$mango->set_name('Mango'); // OK
$mango->set_color('Yellow'); // ERROR
$mango->set_weight('300'); // ERROR
?>
En el caso de que tengamos las propiedades protegidas o privadas y queremos hacerlas accesibles podemos utilizar los métodos. Ejemplo:
<?php
class Fruit {
public $name;
protected public $color;
private public $weight;
function set_color($n) { // a public function
$this->color = $n;
}
function set_weight($n) { // a public function
$this->weight = $n;
}
}
$mango = new Fruit();
$mango->name = 'Mango'; // OK
$mango->set_color('Yellow'); // OK
$mango->set_weight('300'); // OK
?>
Al no poner ningún identificador se supone el identificador por defecto, el public.
Palabra clave $this
La palabra clave $this
se refiere al objeto actual y solo está disponible dentro de los métodos de la clase.
<?php
class Fruit {
public $name;
function set_name($name) {
$this->name = $name;
}
}
$apple = new Fruit();
$apple->set_name("Apple");
echo $apple->name;
?>
Palabra clave $insteof
Puede usar la palabra clave instanceof
para verificar si un objeto pertenece a una clase específica:
<?php
$apple = new Fruit();
var_dump($apple instanceof Fruit);
?>