Saltar la navegación

1.2.1.- Creación de clases (I).

Imagen de un dibujo con un diagrama de rectángulos de distintos colores y encima un portaángulos y una escuadra.
Everaldo Coelho (YellowIcon) (GNU/GPL)

Uno de los motivos para crear atributos privados es que su valor forma parte de la información interna del objeto y no debe formar parte de su interface. Otro motivo es mantener cierto control sobre sus posibles valores.

Por ejemplo, no quieres que se pueda cambiar libremente el valor del código de un producto. O necesitas conocer cuál será el nuevo valor antes de asignarlo. En estos casos, se suelen definir esos atributos como privados y además se crean dentro de la clase métodos para permitirnos obtener y/o modificar los valores de esos atributos. Por ejemplo:

private $codigo;
public function setCodigo($nuevo_codigo) {
    if (noExisteCodigo($nuevo_codigo)) {
        $this->codigo = $nuevo_codigo;
        return true;
    }
    return false;
}
public function getCodigo() { return $this->codigo; }

Aunque no es obligatorio, el nombre del método que nos permite obtener el valor de un atributo suele empezar por get, y el que nos permite modificarlo por set, y a continuación el nombre del atributo con la primera letra en mayúsculas.

Debes conocer

En PHP5 se introdujeron los llamados métodos mágicos, entre ellos __set y __get. Si se declaran estos dos métodos en una clase, PHP los invoca automáticamente cuando desde un objeto se intenta usar un atributo no existente o no accesible. Por ejemplo, el código siguiente simula que la clase Producto tiene cualquier atributo que queramos usar.

class Producto {
    private $atributos = array();
    public function __get($atributo) {
        return $this->atributos[$atributo];
    }
    public function __set($atributo, $valor) {
        $this->atributos[$atributo] = $valor;
    }
}

En la documentación de PHP tienes más información sobre los métodos mágicos.

Métodos mágicos.

Autoevaluación

Pregunta

En lugar de programar un método set para modificar el valor de los atributos privados en que sea necesario, puedo utilizar el método mágico __set.

Respuestas

Verdadero.

Falso.

Retroalimentación