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.

clasesobj

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;
  }
}
?>
Nota

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
?>
Public

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);
?>