Diferencia entre revisiones de «Plantilla:PHP/SintasixPHPOOPBase»
De WikiEducator
(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: | ||
| − | == | + | == 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 | + | ;En PHP las clases tienen métodos y propiedades |
| − | # | + | # '''Propiedades''': son los atributos o características de la clase. |
| − | # | + | # '''Métodos''': representan el comportamiento de la clase. |
| − | + | ;Definir una clase en PHP | |
| − | + | <source lang="php"> | |
| − | ;Definir una clase en | + | class NombreClase { |
| − | <source lang=php> | + | // propiedades |
| − | class NombreClase{ | + | // métodos |
| − | //propiedades | + | |
| − | //métodos | + | |
} | } | ||
</source> | </source> | ||
| − | *'''''NombreClase''''' es un identificador válido | + | |
| − | <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> | ||
| − | * | + | * Se recomienda que el nombre de las clases comience con mayúscula. |
| − | *Los nombres de las clases no son sensibles a | + | * Los nombres de las clases '''no son sensibles a mayúsculas/minúsculas''', aunque es buena práctica tratarlos como si lo fueran. |
| − | *Es | + | * 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'''. |
| − | + | ||
| − | + | ||
| − | + | ||
{{MRM_Ejemplo| | {{MRM_Ejemplo| | ||
| − | Vamos a crear una clase llamada | + | Vamos a crear una clase llamada '''Fecha'''. |
| − | *Atributos de la clase | + | *Atributos de la clase: ''dia, mes, year''. |
| − | * | + | *Método ''verFecha()'': obtiene la fecha como una cadena de caracteres. |
| − | *Método ''validarFecha'' | + | *Método ''validarFecha()'': verifica si una fecha es correcta o no. |
}} | }} | ||
| − | |||
| − | ===Declaramos la clase=== | + | === Declaramos la clase === |
| − | *Utilizaremos | + | * Utilizaremos siempre un fichero con el mismo nombre que la clase. |
| − | <source lang=php> | + | <source lang="php"> |
| − | class Fecha{ | + | class Fecha { |
} | } | ||
</source> | </source> | ||
| − | ====Los | + | ==== 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. | ||
| − | |||
| − | |||
| − | |||
{{MRM_Puntos clave| | {{MRM_Puntos clave| | ||
| − | *La encapsulación es uno de los pilares de la | + | * La '''encapsulación''' es uno de los pilares de la POO. |
| − | ; | + | ;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 | + | * Permite especificar desde qué ámbito se tiene acceso a un determinado elemento. |
| − | #Desde la propia clase | + | * Básicamente tenemos tres niveles: |
| − | #Desde | + | # Desde la propia clase. |
| − | #Desde otra | + | # 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''' | ||
| − | + | {{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. | |
| − | {{Tip| | + | |
| − | *En el caso de los atributos hay que | + | |
| − | * | + | |
| − | + | ||
}} | }} | ||
| + | ;'''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'''. | |
| − | *Los elementos | + | |
| − | *En | + | |
| − | + | {{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: |
| − | + | <source lang="php"> | |
| − | + | 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; | ||
| + | } | ||
} | } | ||
</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"> | |
| − | + | class Fecha { | |
| − | + | // Declaración de atributos | |
| − | + | private int $dia; | |
| − | + | private int $mes; | |
| − | ;Siguiendo con nuestro ejemplo de | + | private int $year; |
| − | + | ||
| − | <source lang=php> | + | |
| − | class Fecha{ | + | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
} | } | ||
</source> | </source> | ||
| − | |||
| − | + | ==== 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 |
| − | $ | + | <source lang="php"> |
| − | $ | + | 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 | + | ;En este código aparecen dos conceptos importantes: |
| − | * la seudovariable '''''$this''''' | + | # La seudovariable '''$this''' |
| − | * | + | # 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. | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
{{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; | ||
| − | + | public function __construct(string $n, string $a) { | |
| − | + | // ERROR: asignación a variables locales, no a atributos | |
| − | + | ||
| − | + | ||
| − | public function __construct( string $n, | + | |
| − | // | + | |
| − | + | ||
$nombre = $n; | $nombre = $n; | ||
$apellido = $a; | $apellido = $a; | ||
} | } | ||
} | } | ||
| − | $p = new Persona ("María", " | + | |
| − | + | $p = new Persona("María", "Ruiz"); | |
| − | echo "<h1>Nombre | + | echo "<h1>Nombre: $p->nombre</h1>"; |
| − | echo "<h1> | + | echo "<h1>Apellido: $p->apellido</h1>"; |
</source> | </source> | ||
| + | |||
<hr /> | <hr /> | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| + | *Forma correcta:* | ||
| + | <source lang="php"> | ||
| + | public function __construct(string $n, string $a) { | ||
| + | $this->nombre = $n; | ||
| + | $this->apellido = $a; | ||
| + | } | ||
</source> | </source> | ||
| − | |||
}} | }} | ||
| − | |||
| − | |||
| + | {{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 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. | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | *En | + | |
| − | * | + | |
| − | + | ||
| − | En | + | === 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). | ||
| − | + | [[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). | ||
| − | |||
| − | |||
;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 | + | * 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. |
| + | |||
<source lang="php"> | <source lang="php"> | ||
| − | class Clase1{ | + | 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"; | ||
| + | </source> | ||
Última revisión de 19:47 5 nov 2025
Contenido
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
- Propiedades: son los atributos o características de la clase.
- 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.
Ejemplo
| |
|
Vamos a crear una clase llamada Fecha.
|
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.
|
- Visibilidad
- Implementa el principio de encapsulación.
- Permite especificar desde qué ámbito se tiene acceso a un determinado elemento.
- Básicamente tenemos tres niveles:
- Desde la propia clase.
- 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
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.
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
- La seudovariable $this
- 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.
<?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>";
public function __construct(string $n, string $a) { $this->nombre = $n; $this->apellido = $a; }
|
|
- 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).
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";
