Diferencia entre revisiones de «Plantilla:PHP/SintasixPHPOOPBase»

De WikiEducator
Saltar a: navegación, buscar
(Página creada con «==OPP En php== *PHP no se diseñó como lenguaje orientado a objetos, por lo que muchas de las características de este paradigma se han ido incorporando en las últimas ve...»)
 
(OPP En php)
 
Línea 1: Línea 1:
==OPP En php==
+
== OOP en PHP ==
*PHP no se diseñó como lenguaje orientado a objetos, por lo que muchas de las características de este paradigma se han ido incorporando en las últimas versiones, especialmente a partir de la versión 5.3.
+
*PHP Almacena el valor de un objeto como una referencia (dirección de memoria), no guarda el valor.
+
*Esto implica que si queremos pasar un objeto a través de la red, debemos '''''serializarlo''''', para que ''viaje'' también el valor del mismo y no solo la dirección de memoria que en destino carecería de sentido. Veremos este concepto más adelante.
+
  
<!--1 -->
+
* PHP no se diseñó originalmente como un lenguaje orientado a objetos, por lo que muchas de las características de este paradigma se han ido incorporando en las últimas versiones, especialmente a partir de la versión 5.3. 
 +
* PHP almacena el valor de un objeto como una '''referencia''' (dirección de memoria), no como una copia del valor. 
 +
* Esto implica que, si queremos pasar un objeto a través de la red, debemos '''''serializarlo''''', para que ''viaje'' también el valor del mismo y no solo la dirección de memoria (que en destino carecería de sentido). Veremos este concepto más adelante.
  
;En php las clases tienen métodos y propiedades
+
;En PHP las clases tienen métodos y propiedades
#propiedades: son los atributos o características de la clase.
+
# '''Propiedades''': son los atributos o características de la clase.
#métodos: representas el comportamiento de la misma.
+
# '''Métodos''': representan el comportamiento de la clase.
  
<!--1 -->
+
;Definir una clase en PHP
 
+
<source lang="php">
;Definir una clase en php
+
class NombreClase {
<source lang=php>
+
    // propiedades
class NombreClase{
+
    // métodos
//propiedades
+
//métodos
+
 
}
 
}
 
</source>
 
</source>
*'''''NombreClase''''' es un identificador válido con la siguiente expresión regular
+
 
<source lang=bash>
+
* '''''NombreClase''''' es un identificador válido según la siguiente expresión regular:
 +
<source lang="bash">
 
^[a-zA-Z_][a-zA-Z0-9_]*$
 
^[a-zA-Z_][a-zA-Z0-9_]*$
 
</source>
 
</source>
*El nombre de las clases se recomienda que empiece por mayúsculas
+
* Se recomienda que el nombre de las clases comience con mayúscula. 
*Los nombres de las clases no son sensibles a los casos (sensitive-case), pero es muy recomendado utilizarlo como si lo fuera.-
+
* Los nombres de las clases '''no son sensibles a mayúsculas/minúsculas''', aunque es buena práctica tratarlos como si lo fueran.
*Es '''''muy recomendable''''' guardar las clases en ficheros cuyo nombre sea el propio de la clase, esto permitirá la autocarga de estos ficheros y forma parte de las buenas prácticas de programación
+
* Es '''muy recomendable''' guardar las clases en ficheros cuyo nombre coincida con el de la clase; esto permite la '''autocarga''' y forma parte de las '''buenas prácticas de programación'''.
 
+
<!--1 -->
+
 
+
  
 
{{MRM_Ejemplo|
 
{{MRM_Ejemplo|
Vamos a crear una clase llamada fecha
+
Vamos a crear una clase llamada '''Fecha'''. 
*Atributos de la clase (dia, mes, year)
+
*Atributos de la clase: ''dia, mes, year''. 
*Métodos ''verFecha'' (obtener la fecha como una cadena de caracteres)
+
*Método ''verFecha()'': obtiene la fecha como una cadena de caracteres
*Método ''validarFecha''' (verifica si una fecha es correcta o no)
+
*Método ''validarFecha()'': verifica si una fecha es correcta o no.
 
}}
 
}}
*Vamos a utilizar este ejemplo para introducir los conceptos
 
  
===Declaramos la clase===
+
=== Declaramos la clase ===
*Utilizaremos siempre un fichero con el mismo nombre que la clase.
+
* Utilizaremos siempre un fichero con el mismo nombre que la clase.
<source lang=php>
+
<source lang="php">
class Fecha{
+
class Fecha {
  
 
}
 
}
 
</source>
 
</source>
  
====Los Atributos====
+
==== Los atributos ====
*A la hora de declarar los atributos aparece un concepto que se llama '''''visibilidad''''' o alcance del atributo, es decir desde dónde va a poser ser visto el valor de ese atributo.
+
* Al declarar los atributos, aparece un concepto importante: la '''visibilidad''' o alcance del atributo, es decir, desde dónde puede verse o modificarse su valor.
 +
 
 +
;Encapsulación: acceso a los componentes
 +
* Al definir tanto las propiedades como los métodos, especificamos su nivel de acceso. 
 +
* Es una buena práctica no permitir acceso directo a los atributos, sino hacerlo a través de métodos específicos.
  
;Encapsulación: Acceso a los componentes
 
*A la hora de definir tanto las propiedades como los métodos, especificaremos el nivel de acceso que se tiene a ese elemento
 
*Es una buena práctica de programación no dejar acceso directo a los atributos de una clase, sino acceder a ellos a través de los métodos
 
 
{{MRM_Puntos clave|
 
{{MRM_Puntos clave|
*La encapsulación es uno de los pilares de la programación orientada a objetos
+
* La '''encapsulación''' es uno de los pilares de la POO. 
;permite o restringe la visibilidad de sus componentes
+
;Permite o restringe la visibilidad de los componentes de una clase.
 
}}
 
}}
 
 
  
 
;Visibilidad
 
;Visibilidad
*Implementa el principio de encapsulación.
+
* Implementa el principio de encapsulación.
*Permite especificar desde qué ámbito se tiene acceso a un determinado elemento. Básicamente tenemos tres tipos de ámbitos desde lo que podemos querer acceder.
+
* Permite especificar desde qué ámbito se tiene acceso a un determinado elemento.
#Desde la propia clase
+
* Básicamente tenemos tres niveles:
#Desde otra sección de código (otra clase sin ninguna relación de herencia o en el programa dónde se está usando un objeto de esa clase.
+
# Desde la propia clase
#Desde otra clase que se ha extendido (dónde hay una relación de herencia
+
# Desde otras clases no relacionadas o desde el programa principal.
 +
# Desde clases que extienden a otra (herencia). 
  
 +
* Por tanto, existen tres tipos de visibilidad:
 +
# '''public''' 
 +
# '''private''' 
 +
# '''protected'''
  
*Por lo tanto, son tres los tipos de visibilidad que podemos especificar:
+
{{Tip|
#public
+
* '''public''': tipo de visibilidad asignada por defecto a los métodos (si no se especifica).
#private
+
* En el caso de los atributos hay que declararla de forma explícita.
#protected
+
* El uso de la palabra reservada '''var''' está '''depreciado'''; antes se usaba para declarar atributos públicos.
{{Tip|'''''public'''''  tipo de visibilidad asignada por defecto a los '''''métodos''''',  en caso de no especificarla.
+
*En el caso de los atributos hay que declararlo de forma explícita.
+
*Las funciones podemos no declararlo tomando el valor por defecto '''public'''
+
*Por herencia podemos usar la palabra reservada '''var''' para declarar los atributos en cuyo caso son public, pero su uso está depreciado
+
 
}}
 
}}
  
 +
;'''public'''
 +
* Los elementos públicos pueden ser accesibles desde cualquier ámbito en el que exista una referencia al objeto.
  
;public
+
;'''private'''
*Los elementos públicos pueden ser accesibles desde cualquier ámbito dónde se pueda acceder al objeto
+
* Los elementos con este modificador solo son accesibles desde el interior de la propia clase (ni siquiera desde clases heredadas).
;private
+
* En POO es habitual hacer todos los atributos '''privados''' y acceder a ellos mediante los métodos '''getter''' y '''setter'''.
*Los elementos especificado con este modificador de acceso hace que su visibilidad se reduzca al interior de la clase, no pudiendo acceder a ellos desde fuera (ni siquiera desde clases que sean una herencia, o clases heredadas).
+
*En OOP es una tendencia hacer todos los atributos privados y acceder a ellos por los métodos '''''setter''''' and '''''getter'''''.
+
  
    {{Tip| A un elemento '''''private''''' de una clase, tampoco podrá acceder desde clases que deriven de ésta, pero en php, dentro de una clase, se puede acceder a los elementos privados de otro objeto de la misma clase.
+
{{Tip|
<source lang=php>
+
A un elemento '''private''' de una clase tampoco se puede acceder desde clases derivadas,
class A{
+
pero en PHP sí se puede acceder a los atributos privados de otro objeto de la misma clase:
  private $foo
+
<source lang="php">
 
+
class A {
.........
+
    private $foo;
 
+
  public function compara (A $b){
+
    //Voy a acceder directamente a un atributo privado del objeto $b
+
    //Como este objeto es de la clase A, sí que puedo hacerlo
+
    //Esto ocurre en php
+
        if $this->foo ==$b->foo
+
  }
+
.....
+
 
+
}
+
  
 +
    public function compara(A $b) {
 +
        // Se puede acceder directamente al atributo privado $foo de otro objeto de la misma clase
 +
        if ($this->foo == $b->foo) {
 +
            return true;
 +
        }
 +
        return false;
 +
    }
 
}
 
}
 
</source>
 
</source>
 +
}}
  
 +
;'''protected'''
 +
* Este tipo de visibilidad permite el acceso solo desde la propia clase y desde clases derivadas (herencia).
  
  }}
+
;Siguiendo con nuestro ejemplo de '''Fecha''', declaramos los atributos:
 
+
<source lang="php">
;protected
+
class Fecha {
*Este tipo de visibilidad implica que los elementos así especificados solo son accesible por la propia clase y por las clases derivadas, con  las que se establezca una relación de herencia.
+
    // Declaración de atributos
*Para ello hay que ver la herencia que veremos más adelante dónde propondremos un ejemplo
+
    private int $dia;
 
+
    private int $mes;
;Siguiendo con nuestro ejemplo de fecha, ahora delcaramos los atributos
+
    private int $year;
 
+
<source lang=php>
+
class Fecha{
+
  //declaracion de atributos
+
  private int dia;
+
  private int mes;
+
  private int year;
+
 
+
 
+
 
}
 
}
 
</source>
 
</source>
====Los métodos====
 
  
*Es la forma de especificar el comportamiento de la clase
+
==== Los métodos ====
*Es lo que el objeto va a saber hacer dentro del programa
+
*Los métodos de detallan usando la palabra reservada '''''function'''''
+
*En php dentro de la programación orientada a objetos tenemos una serie o tipo  de métodos que es muy importante conocer y se llaman [[#métodos mágicos]], que posteriormente estudiaremos.
+
*Los métodos mágicos son métodos de la clase que son invocados de manera implícita cuando ocurre alguna circunstancia concreto.
+
*Por ejemplo como vamos a ver en el párrafo siguiente, cuando se instancia un objeto se invoca (si está implementado), al método mágico __construct. a continuación se explica.
+
   
+
;Métodos contructor y destructor
+
*En php, a diferencia de  Java, no podemos tener un método con el mismo nombre que la clase (Versiones anteriores a la 7.4 sí que se podía, pero actualmente genera un error).
+
*El constructor en php corresponde a un [[#método mágico]] llamado '''''__construct()'''' que es invocado y ejecutado siempre que se instancie un nuevo objeto de la clase (si lo hemos escrito en la clase). En este caso no se ejecutará el método con el nombre de la case si es que existiera.
+
*El igual que tenemos un método que se ejecuta cuando instanciamos un objeto de la clase, '''''__construct()'''', existe otro [[#método mágico]] que se ejecuta siempre que se destruya una instancia de una clase u objeto, y es el método  '''''__destruct()'''''
+
*Las implementaciones de estos dos métodos, lógicamente son  libre para cada clase,
+
*Su invocación es transparente para el programador (esto es cómo ocurre en todos los [[#métodos mágicos]] y se realiza siempre respectivamente al crear el objeto, y cuando este es destruido,
+
*En el caso de '''''__construct''''', podemos pasarle argumentos, que serían los valores que aportamos al construir un objeto de la case
+
  
;Construyendo nuestra clase
+
* Es la forma de especificar el '''comportamiento''' de la clase: lo que el objeto sabe hacer dentro del programa. 
<source lang=php>
+
* Los métodos se definen usando la palabra reservada '''function'''. 
class Fecha{
+
* En PHP orientado a objetos existen métodos especiales llamados [[#métodos mágicos]], que se ejecutan automáticamente cuando ocurre un evento concreto (por ejemplo, al crear o destruir un objeto).
  //declaracion de atributos
+
  private int dia;
+
  private int mes;
+
  private int year;
+
  
public function __construct(int d, int m,int y){
+
;Métodos constructor y destructor
 +
* En PHP, a diferencia de Java, no podemos usar un método con el mismo nombre que la clase (desde PHP 7.4 genera error). 
 +
* El constructor se define con el método mágico '''__construct()''' y se ejecuta automáticamente al instanciar un objeto. 
 +
* De forma similar, el método '''__destruct()''' se ejecuta al destruir un objeto. 
 +
* Ambos son opcionales y su invocación es '''transparente''' para el programador. 
 +
* En '''__construct()''' podemos pasar parámetros para inicializar los atributos del objeto.
  
     $this->dia = d;
+
;Ejemplo: construyendo nuestra clase
     $this->mes = m;
+
<source lang="php">
     $this->year = y;
+
class Fecha {
}
+
     private int $dia;
 +
     private int $mes;
 +
     private int $year;
  
 +
    public function __construct(int $d, int $m, int $y) {
 +
        $this->dia = $d;
 +
        $this->mes = $m;
 +
        $this->year = $y;
 +
    }
 
}
 
}
 
</source>
 
</source>
  
;En este código aparecen dos conceptos que hay que estudiar y entendr:
+
;En este código aparecen dos conceptos importantes:
* la seudovariable '''''$this'''''
+
# La seudovariable '''$this''' 
* el operador de indireccion '''''->'''''
+
# El operador de indirección '''->'''
 +
 
 +
==== $this y el operador de indirección -> ====
 +
* Para acceder a los atributos o métodos de un objeto dentro de la clase usamos la seudovariable '''$this'''. 
 +
* '''$this''' hace referencia al '''objeto actual''' (la instancia sobre la que se está ejecutando el método). 
 +
* Si dentro de un método se omite '''$this->''', PHP interpretará las variables como locales y no como atributos de la clase.
  
====$this y el operador de indireccion ->====
 
*Para poder acceder a los atributos, o métodos  de un objeto en una clase usaremos<span style='r'> la  seudovariable '''$this'''</span>.
 
*'''''$this'''''  es una seudovariable que referencia al objeto del ámbito en el cual se está usado.
 
*Se utiliza dentro de la definición de la propia clase y hará referencia a un objeto concreto en un momento dado;
 
*Cuando en un método de una clase se quiere acceder a un atributo de la misma, hay que usar la $this, ya que en caso contrario estaría accediendo a una variable local al método
 
 
{{MRM_Actividad|Title=Observa el siguiente código|
 
{{MRM_Actividad|Title=Observa el siguiente código|
<source lang=php>
+
<source lang="php">
 
<?php
 
<?php
 +
class Persona { 
 +
    public $nombre;
 +
    public $apellido;
  
class Persona{ 
+
     public function __construct(string $n, string $a) {
    public  $nombre;
+
         // ERROR: asignación a variables locales, no a atributos
    public  $apellido;
+
   
+
     public function __construct( string $n, string $a){
+
         //No estoy asignando los valores a los atributos
+
        //Sino a unas variables locales a este método
+
 
         $nombre = $n;
 
         $nombre = $n;
 
         $apellido = $a;
 
         $apellido = $a;
 
     }
 
     }
 
}
 
}
$p = new Persona ("María", "Ruíz");
+
 
//Los atributos no tienen valor
+
$p = new Persona("María", "Ruiz");
echo "<h1>Nombre -$p->nombre-</h1>";
+
echo "<h1>Nombre: $p->nombre</h1>";
echo "<h1>Apelido -$p->apellido-</h1>";
+
echo "<h1>Apellido: $p->apellido</h1>";
 
</source>
 
</source>
 +
 
<hr />
 
<hr />
*La forma correcta  de escribir el constructor
 
<source lang=php>
 
    public function __construct( string $n,  string $a){
 
        //Ahora sí que asigno los  valores a los atributos de la clase
 
        $this->nombre = $n;
 
        $this->apellido = $a;
 
    }
 
  
 +
*Forma correcta:*
 +
<source lang="php">
 +
public function __construct(string $n, string $a) {
 +
    $this->nombre = $n;
 +
    $this->apellido = $a;
 +
}
 
</source>
 
</source>
 
 
}}
 
}}
{{MRM_Puntos clave|
 
*La lectura de la seudovariable '''''$this''''' sería :  '''cuando exista una instancia de objeto  de esta clase, quiero acceder a la propiedad o atributo  '''''atributo_x'''''  o ejecutar el método  '''''metodo_y''''' de ese objeto'''.
 
  
 +
{{MRM_Puntos clave|
 +
* '''$this''' se lee como: ''“cuando exista una instancia de esta clase, accede al atributo o método de ese objeto”''.
 
}}
 
}}
;El operador de indirección
 
En php los objetos internamente se manejan como direcciones de memoria, por ese motivo, cuando queremos acceder a un elemento del objeto, tendremos que indireccionar su posición a partir de la dirección base del propio objeto, por lo que se utiliza el operador de indireccion ->, como ya venimos haciendo en este tema.
 
Es la forma que tiene php para especificar a qué elemento del objeto queremos acceder de todos los que tiene (atributos y métodos).
 
  
=== Declarando objetos: Operador '''''new'''''===
+
;El operador de indirección '''->'''
*Permite crear instancias de un objeto en memoria.
+
* En PHP los objetos se manejan internamente como referencias en memoria
*Una clase describe la estructa común de determinados objetos, su composición o podríamos verlo como una plantilla .
+
* Para acceder a sus elementos se usa el operador '''->''', que “indirecciona” hacia el atributo o método deseado.  
*Las clases en principio no se usan durante la ejecución, salvo si queremos acceder a '''métodos o propiedades estáticas''' como veremos un poco más adelante
+
* Es la forma que tiene PHP de especificar a qué elemento concreto de un objeto se quiere acceder.
*En un programa crearemos  '''''objetos''''' (instancias de la clase).
+
*Para ''instanciar'' objetos de las clases usaremos  el operador '''new'''
+
*Una vez '''instanciando''' ya tenemos la referencia del objeto  y lo podemos utilizar.
+
*En php los objetos internamente se manejan como direcciones de memoria, por ese motivo, cuando queremos acceder a un elemento del objeto, tendremos que indireccionar su posición a partir de la dirección base del propio objeto, por lo que se utiliza el operador de indireccion '''''->''''', como ya venimos haciendo en este tema.
+
*Hay que ser consciente que en memoria tenemos  '''toda''' la estructura del la clase por cada objeto  (es decir si tengo un método concreto y 5 objetos, tendré en memoria los 5 métodos, uno por cada objeto, y cada método pertenece a su objeto.
+
[[Archivo:Objetos4.png]]
+
  
En nuestro programa principal escribiremos el código
+
=== Declarando objetos: operador '''new''' ===
<source lang=php>
+
* Permite crear instancias (objetos) en memoria. 
require "Fecha.php"
+
* Una clase describe la estructura común de un conjunto de objetos, su composición o ''plantilla''. 
 +
* En un programa, crearemos '''objetos''' (instancias) a partir de las clases mediante el operador '''new'''. 
 +
* Una vez instanciado, tenemos una referencia al objeto y podemos usarlo. 
 +
* Recordemos que cada objeto ocupa su propio espacio en memoria (con sus propios atributos y métodos).
  
$f1 = new Fecha(10,2,1998);
+
[[Archivo:Objetos4.png]]
  
 +
Ejemplo en el programa principal:
 +
<source lang="php">
 +
require "Fecha.php";
 +
 +
$f1 = new Fecha(10, 2, 1998);
 
</source>
 
</source>
  
 +
=== Acceso al contenido del objeto ===
 +
* Para acceder a un elemento de un objeto usamos los operadores '''->''' o '''::''' (este último para elementos estáticos). 
  
===Acceso al contenido del objeto===
 
*Ya hemos visto que para acceder a un elemento de un objeto usamos operadores '''''->''''' o bien '''''::'''''
 
 
;Operador de indirección <span style="color: green; font-size:150%;">-></span>
 
;Operador de indirección <span style="color: green; font-size:150%;">-></span>
*Este operador es un operador de indirección
+
* Este operador permite acceder al contenido de un objeto a través de su referencia.
*Los objetos son direcciones de memoria, cuando se quiere acceder al contenido de una dirección de memoria se usa un operador de '''indirección''', que en el caso de php como en otros muchos lenguajes es '''''-> '''''.
+
* Cuando se usa dentro de la clase, suele acompañarse de '''$this'''
*Observar que se suele acompañar de una variable objeto o de la seudovariable '''''$this''''' , por ese motivo si se quiere acceder a una propiedad del objeto, ya no hay que especificar el '''''$''''' en el nombre de la propiedad
+
cuando se usa fuera, de una variable objeto.
 +
 
 
<source lang="php">
 
<source lang="php">
class Clase1{
+
class Clase1 {
public $propiedad1;
+
    public $propiedad1;
....
+
public function __construct($valor){
+
//la variable o propiedad de la clase no lleva $ al acceder a ella.
+
      $this->propiedad1 = $valor;  
+
  
}
+
    public function __construct($valor) {
....
+
        // No se usa $ delante del nombre de la propiedad
$obj1 = new Clase1("verde");
+
        $this->propiedad1 = $valor;
$obj1->propiedad1 ="azul";
+
    }
...
+
}
 +
 
 +
$obj1 = new Clase1("verde");
 +
$obj1->propiedad1 = "azul";
 +
</source>

Última revisión de 19:47 5 nov 2025

OOP en PHP

  • PHP no se diseñó originalmente como un lenguaje orientado a objetos, por lo que muchas de las características de este paradigma se han ido incorporando en las últimas versiones, especialmente a partir de la versión 5.3.
  • PHP almacena el valor de un objeto como una referencia (dirección de memoria), no como una copia del valor.
  • Esto implica que, si queremos pasar un objeto a través de la red, debemos serializarlo, para que viaje también el valor del mismo y no solo la dirección de memoria (que en destino carecería de sentido). Veremos este concepto más adelante.
En PHP las clases tienen métodos y propiedades
  1. Propiedades: son los atributos o características de la clase.
  2. Métodos: representan el comportamiento de la clase.
Definir una clase en PHP
class NombreClase {
    // propiedades
    // métodos
}
  • NombreClase es un identificador válido según la siguiente expresión regular:
^[a-zA-Z_][a-zA-Z0-9_]*$
  • Se recomienda que el nombre de las clases comience con mayúscula.
  • Los nombres de las clases no son sensibles a mayúsculas/minúsculas, aunque es buena práctica tratarlos como si lo fueran.
  • Es muy recomendable guardar las clases en ficheros cuyo nombre coincida con el de la clase; esto permite la autocarga y forma parte de las buenas prácticas de programación.



Icon casestudy.gif
Ejemplo

Vamos a crear una clase llamada Fecha.

  • Atributos de la clase: dia, mes, year.
  • Método verFecha(): obtiene la fecha como una cadena de caracteres.
  • Método validarFecha(): verifica si una fecha es correcta o no.



Declaramos la clase

  • Utilizaremos siempre un fichero con el mismo nombre que la clase.
class Fecha {
 
}

Los atributos

  • Al declarar los atributos, aparece un concepto importante: la visibilidad o alcance del atributo, es decir, desde dónde puede verse o modificarse su valor.
Encapsulación
acceso a los componentes
  • Al definir tanto las propiedades como los métodos, especificamos su nivel de acceso.
  • Es una buena práctica no permitir acceso directo a los atributos, sino hacerlo a través de métodos específicos.



Icon key points.gif

Puntos clave

  • La encapsulación es uno de los pilares de la POO.
Permite o restringe la visibilidad de los componentes de una clase.



Visibilidad
  • Implementa el principio de encapsulación.
  • Permite especificar desde qué ámbito se tiene acceso a un determinado elemento.
  • Básicamente tenemos tres niveles:
  1. Desde la propia clase.
  2. Desde otras clases no relacionadas o desde el programa principal.
  3. Desde clases que extienden a otra (herencia).
  • Por tanto, existen tres tipos de visibilidad:
  1. public
  2. private
  3. protected
Icon present.gif
Tip:
  • public: tipo de visibilidad asignada por defecto a los métodos (si no se especifica).
  • En el caso de los atributos hay que declararla de forma explícita.
  • El uso de la palabra reservada var está depreciado; antes se usaba para declarar atributos públicos.


public
  • Los elementos públicos pueden ser accesibles desde cualquier ámbito en el que exista una referencia al objeto.
private
  • Los elementos con este modificador solo son accesibles desde el interior de la propia clase (ni siquiera desde clases heredadas).
  • En POO es habitual hacer todos los atributos privados y acceder a ellos mediante los métodos getter y setter.
Icon present.gif
Tip:

A un elemento private de una clase tampoco se puede acceder desde clases derivadas, pero en PHP sí se puede acceder a los atributos privados de otro objeto de la misma clase:

class A {
    private $foo;
 
    public function compara(A $b) {
        // Se puede acceder directamente al atributo privado $foo de otro objeto de la misma clase
        if ($this->foo == $b->foo) {
            return true;
        }
        return false;
    }
}


protected
  • Este tipo de visibilidad permite el acceso solo desde la propia clase y desde clases derivadas (herencia).
Siguiendo con nuestro ejemplo de Fecha, declaramos los atributos
class Fecha {
    // Declaración de atributos
    private int $dia;
    private int $mes;
    private int $year;
}

Los métodos

  • Es la forma de especificar el comportamiento de la clase: lo que el objeto sabe hacer dentro del programa.
  • Los métodos se definen usando la palabra reservada function.
  • En PHP orientado a objetos existen métodos especiales llamados #métodos mágicos, que se ejecutan automáticamente cuando ocurre un evento concreto (por ejemplo, al crear o destruir un objeto).
Métodos constructor y destructor
  • En PHP, a diferencia de Java, no podemos usar un método con el mismo nombre que la clase (desde PHP 7.4 genera error).
  • El constructor se define con el método mágico __construct() y se ejecuta automáticamente al instanciar un objeto.
  • De forma similar, el método __destruct() se ejecuta al destruir un objeto.
  • Ambos son opcionales y su invocación es transparente para el programador.
  • En __construct() podemos pasar parámetros para inicializar los atributos del objeto.
Ejemplo
construyendo nuestra clase
class Fecha {
    private int $dia;
    private int $mes;
    private int $year;
 
    public function __construct(int $d, int $m, int $y) {
        $this->dia = $d;
        $this->mes = $m;
        $this->year = $y;
    }
}
En este código aparecen dos conceptos importantes
  1. La seudovariable $this
  2. El operador de indirección ->

$this y el operador de indirección ->

  • Para acceder a los atributos o métodos de un objeto dentro de la clase usamos la seudovariable $this.
  • $this hace referencia al objeto actual (la instancia sobre la que se está ejecutando el método).
  • Si dentro de un método se omite $this->, PHP interpretará las variables como locales y no como atributos de la clase.



Icon activity.jpg
Observa el siguiente código
<?php
class Persona {  
    public $nombre;
    public $apellido;
 
    public function __construct(string $n, string $a) {
        // ERROR: asignación a variables locales, no a atributos
        $nombre = $n;
        $apellido = $a;
    }
}
 
$p = new Persona("María", "Ruiz");
echo "<h1>Nombre: $p->nombre</h1>";
echo "<h1>Apellido: $p->apellido</h1>";

  • Forma correcta:*
public function __construct(string $n, string $a) {
    $this->nombre = $n;
    $this->apellido = $a;
}





Icon key points.gif

Puntos clave

  • $this se lee como: “cuando exista una instancia de esta clase, accede al atributo o método de ese objeto”.



El operador de indirección ->
  • En PHP los objetos se manejan internamente como referencias en memoria.
  • Para acceder a sus elementos se usa el operador ->, que “indirecciona” hacia el atributo o método deseado.
  • Es la forma que tiene PHP de especificar a qué elemento concreto de un objeto se quiere acceder.

Declarando objetos: operador new

  • Permite crear instancias (objetos) en memoria.
  • Una clase describe la estructura común de un conjunto de objetos, su composición o plantilla.
  • En un programa, crearemos objetos (instancias) a partir de las clases mediante el operador new.
  • Una vez instanciado, tenemos una referencia al objeto y podemos usarlo.
  • Recordemos que cada objeto ocupa su propio espacio en memoria (con sus propios atributos y métodos).

Objetos4.png

Ejemplo en el programa principal:

require "Fecha.php";
 
$f1 = new Fecha(10, 2, 1998);

Acceso al contenido del objeto

  • Para acceder a un elemento de un objeto usamos los operadores -> o :: (este último para elementos estáticos).
Operador de indirección ->
  • Este operador permite acceder al contenido de un objeto a través de su referencia.
  • Cuando se usa dentro de la clase, suele acompañarse de $this;

cuando se usa fuera, de una variable objeto.

class Clase1 {
    public $propiedad1;
 
    public function __construct($valor) {
        // No se usa $ delante del nombre de la propiedad
        $this->propiedad1 = $valor; 
    }
}
 
$obj1 = new Clase1("verde");
$obj1->propiedad1 = "azul";