Desarrollo de aplicaciones web con PHP y MySQL
Clases y Objetos en PHP
Sergio Sáez y José Luis Poza
© 2015 Sergio Sáez y José Luis Poza

1. Introduccion

Wikipedia
La programación orientada a objetos (OOP) es un paradigma de programación que usa los objetos en sus interacciones, para diseñar aplicaciones y programas informáticos.

Está basado en varias técnicas, incluyendo herencia, cohesión, abstracción, polimorfismo, acoplamiento y encapsulamiento.

<?php
class ClaseSimple {
  
// Declaración de una propiedad
  
public $var 'Un valor inicial';

  
// Declaración de un método
  
function muestraVar() {
    echo 
"Dentro: " $this->var "\n";
  }
}

$obj= new ClaseSimple;

$obj->muestraVar();
echo 
"Fuera: " $obj->var "\n";
?>
Dentro: Un valor inicial
Fuera: Un valor inicial

2. Creación de objetos

<?php
class UnaClase {
  public 
$var"Un valor inicial";
  static public function 
getNew() {
    return new static;
  }
}

// Con el nombre de la clase
$obj1= new UnaClase;
var_dump($obj1);

// A partir de otro objeto
$obj2= new $obj1;
var_dump($obj2);

// Con un método estático
$obj3UnaClase::getNew();
var_dump($obj3);
?>
object(UnaClase)#1 (1) {
  ["var"]=>
  string(16) "Un valor inicial"
}
object(UnaClase)#2 (1) {
  ["var"]=>
  string(16) "Un valor inicial"
}
object(UnaClase)#3 (1) {
  ["var"]=>
  string(16) "Un valor inicial"
}
  • Se utiliza la palabra clave new para crear instancias u objetos de una clase dada.
<?php
class UnaClase {
  public 
$var;
  function 
__construct($val) {
    
$this->var"Valor: $val";
  }
  static public function 
getNew($val) {
    return new static(
$val);
  }
}
$i0;

$obj1= new UnaClase($i++);
var_dump($obj1);

$obj2= new $obj1($i++);
var_dump($obj2);

$obj3UnaClase::getNew($i++);
var_dump($obj3);
?>
object(UnaClase)#1 (1) {
  ["var"]=>
  string(8) "Valor: 0"
}
object(UnaClase)#2 (1) {
  ["var"]=>
  string(8) "Valor: 1"
}
object(UnaClase)#3 (1) {
  ["var"]=>
  string(8) "Valor: 2"
}
  • Se puede inicializar el objeto con un método __construct.
  • El constructor puede recibir parámetros.

3. Herencia

<?php
class ClaseExtendida extends ClaseSimple {
    
// Redefine el método del padre
    
function muestraVar()
    {
        echo 
"Clase extendida\n";
        
parent::muestraVar();
    }
}

$extendida = new ClaseExtendida();
$extendida->muestraVar();
?>
Clase extendida
Dentro: Un valor inicial

4. Atributos y visibilidad

<?php
class UnaClase {
  const       
STAT 'CONST';
  static     
$stat 'Static';
  public     
$publ 'Public';
  protected  
$prot 'Protected';
  private    
$priv 'Private';

  public function 
muestraAtributos( ){
    echo 
'self::STAT: 'self::STAT;
    echo 
'<br>self::$stat: 'self::$stat;
 
// echo '<br>$this->stat: '. $this->stat;
 // No se puede acceder con $this a $stat
    
echo '<br>$this->priv: '$this->priv;
    echo 
'<br>$this->prot: '$this->prot;
    echo 
'<br>$this->publ: '$this->publ;
  }
}
$obj = new UnaClase();
$obj->muestraAtributos();
?>
self::STAT: CONST
self::$stat: Static
$this->priv: Private
$this->prot: Protected
$this->publ: Public
<?php
class ClaseExtendida extends UnaClase {
  public function 
muestraAtributos( ){
    echo 
'self::STAT: '  self::STAT;
    echo 
'<br> self::$stat: ' self::$stat;
    echo 
'<br>$this->priv: '  $this->priv;
    echo 
'<br>$this->prot: '  $this->prot;
    echo 
'<br>$this->publ: '  $this->publ;
  }
}
$obj = new ClaseExtendida();
$obj->muestraAtributos();
?>
self::STAT: CONST
self::$stat: StaticPHP Notice: Undefined property: ClaseExtendida::$priv in - on line 23
$this->priv:
$this->prot: Protected
$this->publ: Public

5. Métodos

<?php
abstract class ClaseAbstracta {
    abstract protected function 
obtenerValor();

    public function 
imprimirValor() {
        echo 
$this->obtenerValor() . "\n";
    }
}
class 
ClaseConcreta extends ClaseAbstracta {
    protected function 
obtenerValor() {
        return 
"Un valor";
    }
}
$obj= new ClaseConcreta();
$obj->imprimirValor();
echo 
$obj->obtenerValor(); // Fatal error. No se puede acceder
?>
Un valor
PHP Fatal error:  Call to protected method ClaseConcreta::obtenerValor() from context '' i

6. Carga automática de clases

<?php
function mi_cargador_de_clases($class) {
    include 
'classes/' $class '.class.php';
}

spl_autoload_register('mi_cargador_de_clases');

// O usando las funciones anónimas de PHP 5.3
spl_autoload_register(function ($class) {
    include 
'classes/' $class '.class.php';
});

$obj  = new MiClase(); // Carga el fichero 'classes/MiClase.class.php'
?>

7. Métodos mágicos

<?php
// __set se ejecuta cuando se intenta escribir en un atributo inaccesible
public void __set string $namemixed $value );
// __get se ejecuta cuando se intenta leer un atributo inaccesible
public mixed __get string $name );
// __isset se ejecuta cuando se invoca isset() o empty() sobre
//   un atributo inaccesible
public bool __isset string $name );
// __unset se ejecuta cuando se invoca __unset sobre un atributo inaccesible
public void __unset string $name );
// __call se ejecuta cuando se invoca un método inaccesible
public mixed __call string $name , array $arguments );
<?php
class ConjuntoDePropiedades {
  private 
$data = array();

  public function 
__set($name$value) {
    echo 
"Magic set: $name$value;\n";
    
$this->data[$name] = $value;
  }
  public function 
__get($name) {
    if (
array_key_exists($name$this->data)) {
      echo 
"Magic get: $name;\n";
      return 
$this->data[$name];
    }
    return 
null;
  }
}
$obj = new ConjuntoDePropiedades;

$obj->"Hola mundo";
echo 
$obj->"\n";
Magic set: a= Hola mundo;
Magic get: a;
Hola mundo

8. Invocación y creación por nombre

<?php
class ClaseSimple {
  
// Declaración de una propiedad
  
public $var 'Un valor inicial';

  
// Declaración de un método
  
function muestraVar() {
    echo 
$this->var "\n";
  }
}

$clase"ClaseSimple";
$obj= new $clase;

$metodo"muestraVar";
$obj->$metodo();
?>
Un valor inicial