Fundamentos de programación orientada a objetos en PHP. PHP - POO o enfoque procedimental

" Será útil tanto para principiantes completamente novatos como para aquellos que ya son bastante buenos escribiendo código no orientado a objetos y quieren descubrir por qué todavía se necesita la programación orientada a objetos.

Lo que me hizo escribir varios artículos sobre programación orientada a objetos en php fue el hecho de que no encontré artículos sobre este tema que me satisficieran. Hay manuales o artículos oficiales aburridos y aburridos que presentan esencialmente los mismos manuales solo que con ejemplos más detallados, y también hay mucha información desactualizada sobre este tema en Internet.

¿Por qué necesitas programación orientada a objetos?

La popularidad y simplicidad de PHP lleva al hecho de que la mayor parte del código escrito en este lenguaje es de calidad muy dudosa. Con tan solo un poco de tiempo libre aprendiendo este lenguaje y un poco de perseverancia, aunque no estés familiarizado con la programación, podrás empezar a escribir aplicaciones web. A medida que aprendas PHP, podrás hacerlos más funcionales. Sin embargo, si no ha dedicado tiempo a diseñar, pronto agregar funciones adicionales a la aplicación, depurarla y probarla se vuelve más complicado y para agregar alguna cosita hay que remover una cantidad cada vez mayor de código, se vuelve cada vez más incomprensible y Confuso, otros desarrolladores, después de leer su código, comenzarán a maldecir y criticar duramente.

Ilustración del libro “Código Limpio” - Robert Martin

Entonces, ¿cuál es el problema? ¿Por qué el proyecto que tienes en mente, cuando se expande, puede convertirse tan rápidamente en un montón de código confuso con una nube de errores? El hecho es que los principiantes escriben código que hace solo lo que se le requiere en una situación específica y no implica realizar ningún cambio. Este enfoque no es aceptable, especialmente para las aplicaciones web, que inevitablemente tendrán que crecer y desarrollarse si, por supuesto, se vuelven populares. Tarde o temprano, usted, y tal vez otros desarrolladores, necesitarán volver al código escrito anteriormente y realizar cambios en él, y cuanto más fácil sea hacerlo, más rápido se desarrollará su aplicación y ganará popularidad.

El enfoque de programación orientado a objetos, por supuesto, no es una panacea para todos los males y por sí solo no mejorará su código, pero su uso le permitirá presentar el código no como un montón de funciones y variables, sino como una colección de objetos que interactúan entre sí, lo cual es mucho más claro. Los datos no estarán tirados en ningún lado, sino que se almacenarán en objetos, protegiéndolos del uso indebido. Las funciones (en programación orientada a objetos se llaman métodos) no solo realizarán acciones con variables, sino que describirán el comportamiento de los objetos. En esencia, esto implica modelar entidades reales, como un usuario, una publicación, un comentario, etc.

Además, en la programación orientada a objetos, los llamados patrones de diseño son comunes: patrones para resolver un problema que surge constantemente en la programación. El uso de estas plantillas le permitirá, en primer lugar, conocer la solución a un determinado problema antes de que surja y, en segundo lugar, la solución al problema será clara para otros desarrolladores que estén familiarizados con la plantilla que utilizó.

Conceptos básicos

POO es una metodología de programación (método, enfoque) según la cual un producto de software se representa en forma de objetos que interactúan. No estoy de acuerdo con que la programación orientada a objetos siempre implique el uso de clases; js, por ejemplo, es un lenguaje orientado a objetos, pero no tiene clases. Sin embargo, cuando se aplica a php, la programación orientada a objetos siempre implica el uso de clases.

Bajo objeto Por lo general, se entiende como una determinada entidad con nombre que almacena datos y tiene su propio comportamiento. El comportamiento de un objeto y la estructura de los datos que almacena, así como la forma en que se accede a estos datos, describen la clase a la que pertenece el objeto. Clase Esta es una descripción de objetos relacionados algo similares que generalmente almacenan el mismo conjunto de datos y tienen el mismo comportamiento. Un objeto que pertenece a una clase particular se llama Copiar. Un ejemplo es una clase que describe a un usuario. Esta clase describe la estructura de datos que almacenará cada instancia de esta clase. Deje que estos datos sean su nombre de usuario y contraseña. Un objeto de clase que almacena valores de inicio de sesión y contraseña específicos será una instancia de esta clase.

Tres pilares de la programación orientada a objetos


La POO se basa en tres principios, a menudo llamados los tres pilares de la POO, estos son:

  • encapsulación
  • polimorfismo
  • herencia

Encapsulación es el principio según el cual los datos se combinan y almacenan en objetos, y también están protegidos contra un uso incorrecto.

Puede parecerle extraño que un programador se limite a sus derechos de lectura o modificación de datos, pero a menudo sucede que es muy difícil rastrear y comprender completamente cómo funciona el código y, por lo tanto, vale la pena evitar situaciones que obviamente son erróneo.
Un ejemplo de uso indebido de datos sería un intento de asignar una edad negativa a una instancia de la clase Persona. Naturalmente, un intento de este tipo, con un código bien escrito, no debería tener éxito, de lo contrario se violaría el principio de encapsulación.
En la práctica, el principio de encapsulación es que se accede a los datos mediante métodos que pueden filtrar o ajustar los valores de los datos que intentamos cambiar.

Herencia es el proceso por el cual un tipo de objeto (clase) adquiere ciertas propiedades de otro tipo de objeto.

A menudo sucede que la descripción de un tipo de objeto, es decir, una clase, cae completamente dentro de la descripción de otro tipo de objeto. Por ejemplo, una clase que describe a un administrador también podría describir a un usuario, excepto que el usuario no tiene derechos de acceso. En este caso, tiene sentido crear una clase que describa a los administradores, descendiente clase que describe a los usuarios. Al mismo tiempo, en la clase que describe a los administradores, no tenemos que describir los datos y el comportamiento que ya están descritos en la clase “usuario” solo necesitamos describir los datos que serán los encargados de otorgar los derechos de acceso; En este caso la clase "usuario" será antepasado clase “administrador”, que puede tener su propio hijo, y ese niño puede tener el suyo propio, etc. La cadena de herencia puede ser tan larga como se desee. Además, un antepasado puede tener varios descendientes, cada uno de los cuales adquirirá completamente las propiedades de su antepasado y les agregará algo propio; de lo contrario, la herencia no tiene sentido.

Polimorfismo es el uso del mismo nombre de método para resolver varios problemas similares.

Es natural utilizar el mismo nombre de método para la misma acción con diferentes tipos de objetos de la misma cadena de herencia. La implementación de este método puede diferir en cada clase y al llamar al método no lo sabremos CómoÉl está haciendo algo, pero lo sabremos. Qué lo hace basándose en su nombre. Volvamos a nuestro ejemplo con el usuario y el administrador. Tanto el administrador como el usuario pueden iniciar sesión y, naturalmente, elegir un nombre de método para esta acción, por ejemplo iniciar sesión. Su implementación específica en estas clases puede diferir, por ejemplo, durante la autorización registramos los derechos de acceso del administrador a la sesión, pero no los del usuario. Al escribir código que procesa datos recibidos del formulario de código, después de crear una instancia de la clase, no nos importará si inicia sesión un usuario simple o un administrador; para una instancia de cualquiera de estas dos clases, llamaremos a método con el mismo nombre.

Ya basta de teoría aburrida. La próxima vez escribiré sobre cómo describir clases, crear instancias de clases, acceder a datos (campos) y métodos de instancia.

Para muchos programadores PHP, la programación orientada a objetos es un concepto desalentador, lleno de sintaxis compleja y otros obstáculos. Como se detalla en mi libro PHP profesional y jQuery, aprenderás los conceptos programación orientada a objetos(OOP): un estilo de codificación en el que las actividades relacionadas se agrupan en clases para facilitar la escritura de código más compacto y eficiente.

Comprender la programación orientada a objetos

La programación orientada a objetos es un estilo de codificación que permite a los desarrolladores agrupar tareas similares en clases. Esto ayuda a mantener el código coherente con el principio No repetirse (DRY) y fácil de mantener.

"La programación orientada a objetos es un estilo de codificación que permite a los desarrolladores agrupar tareas similares en clases».

Una de las principales ventajas de la programación DRY es que si un dato cambia en su programa, Normalmente sólo se requiere un cambio para actualizar el código. Una de las mayores pesadillas para los desarrolladores es mantener un código que declara datos una y otra vez, lo que significa que cualquier cambio en el programa se convierte en un juego sin fin. ¿Dónde está Waldo??

La programación orientada a objetos resulta intimidante para muchos desarrolladores porque introduce una nueva sintaxis y, a primera vista, parece mucho más compleja que un simple código de procedimiento o en línea. Sin embargo, tras una inspección más cercana, la programación orientada a objetos es en realidad un enfoque de programación muy visual y, en última instancia, más simple.

Comprender objetos y clases

Antes de poder profundizar en las complejidades de la programación orientada a objetos, es necesario un conocimiento básico de las diferencias entre objetos Y clases. Esta sección analizará los componentes básicos de las clases, sus diversas capacidades y algunos de sus usos.

Conozca las diferencias entre objetos y clases.

Fotos de Instant Jefferson y John Wardell

Cuando los desarrolladores empiezan a hablar de objetos y clases, parecen intercambiables. Aunque en realidad esto no es así.

De inmediato nos confundimos con la programación orientada a objetos: los desarrolladores experimentados comienzan a hablar de objetos y clases, y parecen intercambiables. Esto no es así, aunque la diferencia es difícil de discernir a primera vista.

Una clase, por ejemplo, es como proyecto de casa. Define la forma de la casa sobre el papel, y las relaciones entre las distintas partes de la casa están claramente definidas y planificadas, aunque la casa aún no exista.

Entonces el objeto es como casa real construido de acuerdo con este plan. Los datos almacenados en un objeto son como la madera, los cables y el hormigón que componen una casa: sin estar montado según un plano, es sólo un montón de cosas. Sin embargo, cuando todo se junta, se convierte en un hogar organizado y útil.

Las clases forman una estructura de datos y acciones, que luego utilizan esta información para crear objetos.
Al mismo tiempo se puede construir más de un objeto a partir de la misma clase, cada uno de los cuales es independiente de los demás. Siguiendo con nuestra analogía de construcción, es similar a cómo se podría construir una subdivisión completa con el mismo diseño: 150 casas diferentes que lucen iguales pero tienen diferentes

familias y decoraciones en el interior.

Clases estructurantes

La sintaxis para crear una clase es bastante simple: declare una clase usando la palabra clave class seguida del nombre de la clase y un conjunto de llaves (()):

Una vez creada una clase, se puede crear una nueva instancia y almacenarla en una variable usando la nueva palabra clave:

$obj = nueva MiClase;

Para ver el contenido de una clase, use var_dump():

Var_dump ($obj);

Pruebe este proceso colocando todo el código anterior en un nuevo archivo test.php en la carpeta de prueba [local]:

Cargue la página en su navegador en http://localhost/test.php y debería aparecer lo siguiente en su pantalla:

Objeto(MiClase)#1 (0) ( )

En su forma más simple, acaba de completar su primer script de programación orientada a objetos.

Definición de propiedades de clase Para agregar datos a una clase use o variables de clase. Funcionan exactamente igual que las variables regulares, excepto que están vinculadas a un objeto y, por lo tanto, solo el objeto puede acceder a ellas.

Para agregar una propiedad a MyClass, agregue el siguiente código a su secuencia de comandos:

La palabra clave pública determina la visibilidad de la propiedad, algo que aprenderá más adelante en este capítulo. Luego, la propiedad se asigna utilizando la sintaxis de variable estándar y se le asigna un valor (aunque las propiedades de clase no requieren un valor inicial).

Eco $obj->prop1;

Debido a que pueden existir varias instancias de una clase, si no se hace referencia a un solo objeto, el script no podrá determinar de qué objeto leer la propiedad. El uso de una flecha (->) es una construcción orientada a objetos que accede a las propiedades y métodos contenidos de un objeto determinado.

prop1; // Salida de la propiedad?>

¡Soy una propiedad de clase!

Definición de métodos de clase

Métodos son funciones específicas de clase. Las acciones individuales que puede realizar un objeto se definen dentro de la clase como métodos.

Por ejemplo, para crear métodos que establezcan y obtengan el valor de la propiedad de clase $prop1, agregue lo siguiente a su código:

prop1 = $nuevovalor;
) función pública getProperty() ( devuelve $this->prop1 . "

"; ) ) $obj = nueva MiClase; echo $obj->prop1; ?> Nota

. La programación orientada a objetos permite que los objetos se refieran a sí mismos usando $this. Cuando trabaje dentro de un método, use $this de la misma manera que usaría el nombre de un objeto fuera de la clase.

prop1 = $nuevovalor;
Para utilizar estos métodos, llámelos de la misma manera que las funciones normales, pero primero proporcione una referencia al objeto al que pertenecen. Lea una propiedad de MyClass, cambie su valor y léala nuevamente con los siguientes cambios:

"; ) ) $obj = new MyClass; echo $obj->getProperty(); // Obtener el valor de la propiedad $obj->setProperty("¡Soy un nuevo valor de propiedad!"); // Establece uno nuevo echo $obj->getProperty(); // ¿Leerlo nuevamente para mostrar el cambio?>

Reinicie su navegador y verá lo siguiente:

¡Soy una propiedad de clase! ¡Soy una propiedad de nuevo valor!
"El poder de la programación orientada a objetos se hace evidente cuando se utilizan múltiples instancias

prop1 = $nuevovalor;
"; ) ) // Crea dos objetos $obj = new MyClass; $obj2 = new MyClass; // Obtiene el valor de $prop1 de ambos objetos echo $obj->getProperty(); echo $obj2->getProperty(); // Establece nuevos valores para ambos objetos $obj->setProperty("¡Soy un nuevo valor de propiedad!"); $obj2->setProperty("¡Pertenezco a la segunda instancia!"); // Generar ambos objetos" $prop1 valor echo $obj->getProperty(); echo $obj2->getProperty(); ?>

Cuando cargue los resultados en su navegador, mostrarán lo siguiente:

¡Soy una propiedad de clase! ¡Soy una propiedad de clase! ¡Soy un nuevo valor de propiedad! ¡Pertenezco a la segunda instancia!

Como se puede ver, La programación orientada a objetos almacena objetos como entidades separadas, lo que facilita la separación de diferentes fragmentos de código en paquetes pequeños y cohesivos.

Métodos mágicos en programación orientada a objetos

Para hacer que los objetos sean más fáciles de usar, PHP también proporciona una serie de metodos magicos o métodos especiales llamados cuando ocurren ciertas acciones comunes dentro de los objetos. Esto permite a los desarrolladores realizar una serie de tareas útiles con relativa facilidad.

Usar constructores y destructores

Cuando se crea una instancia de un objeto, a menudo es deseable configurar varias cosas a la vez. Para solucionar esto, PHP proporciona un método mágico __construct() que se llama automáticamente cada vez que se crea un nuevo objeto.
se crea.

Para ilustrar el concepto de constructores, agregue un constructor a MyClass que imprimirá un mensaje cada vez que se cree una nueva instancia de la clase:

"; ) función pública setProperty($newval) ( $this->prop1 = $newval; ) función pública getProperty() ( return $this->prop1 . "
"; ) ) // Crea un nuevo objeto $obj = new MyClass; // Obtiene el valor de $prop1 echo $obj->
"; ?>

"; ) ) $obj = nueva MiClase; echo $obj->prop1; ?>. __CLASS__ devuelve el nombre de la clase en la que se llama; Esto es lo que se conoce como constante mágica. Hay varias constantes mágicas disponibles, sobre las cuales puedes leer en el manual de PHP.

¡Se inició la clase "MyClass"! ¡Soy una propiedad de clase! Fin del archivo.

Para llamar a una función cuando se destruye un objeto, el método mágico __destruct() está disponible. Esto es útil para limpiar una clase (por ejemplo, cerrar una conexión de base de datos).

Imprime un mensaje cuando un objeto es destruido definiendo un método mágico
__destruct() en MiClase:


"; ) función pública setProperty($newval) ( $this->prop1 = $newval; ) función pública getProperty() ( return $this->prop1 . "
"; ) ) // Crea un nuevo objeto $obj = new MyClass; // Obtiene el valor de $prop1 echo $obj->getProperty(); // Genera un mensaje al final del archivo echo "Fin del archivo.
"; ?>

Con un destructor definido, recargar el archivo de prueba produce el siguiente resultado:

¡Se inició la clase "MyClass"! ¡Soy una propiedad de clase! Fin del archivo. La clase "MiClase" fue destruida.

"Cuando se llega al final del archivo, PHP libera automáticamente todos los recursos".

Para llamar explícitamente a un destructor, puede destruir el objeto usando
función desarmar():

"; ) función pública __destruct() ( echo "La clase "", __CLASS__, "" fue destruida.
"; ) función pública setProperty($newval) ( $this->prop1 = $newval; ) función pública getProperty() ( return $this->prop1 . "
"; ) ) // Crear un nuevo objeto $obj = new MyClass; // Obtener el valor de $prop1 echo $obj->getProperty(); // Destruir el objeto unset($obj); // Enviar un mensaje en el final del archivo echo "Fin del archivo.
"; ?>

Ahora, cuando se cargue en su navegador, el resultado se verá así:

¡Se inició la clase "MyClass"! ¡Soy una propiedad de clase! La clase "MyClass" fue destruida. Fin del archivo.

Convertir a cadena

Para evitar un error si el script intenta generar MyClass como una cadena, se utiliza otro método mágico llamado __toString().

Sin __toString() intentar generar un objeto como una cadena produce un error fatal. Intentando usar echo para generar un objeto sin usar un método mágico:

"; ) función pública __destruct() ( echo "La clase "", __CLASS__, "" fue destruida.
"; ) función pública setProperty($newval) ( $this->prop1 = $newval; ) función pública getProperty() ( return $this->prop1 . "

"; ?>

Esto produce el siguiente resultado:

¡Se inició la clase "MyClass"! Error fatal detectable: el objeto de la clase MyClass no se pudo convertir en una cadena en /Applications/XAMPP/xamppfiles/htdocs/testing/test.php en la línea 40

Para evitar este error, agreguemos un método __toString():

"; ) función pública __destruct() ( echo "La clase "", __CLASS__, "" fue destruida.
"; ) función pública __toString() ( echo "Usando el método toString: "; return $this->getProperty(); ) función pública setProperty($newval) ( $this->prop1 = $newval; ) función pública getProperty( ) ( devuelve $this->prop1 . "
"; ) ) // Crea un nuevo objeto $obj = new MyClass; // Muestra el objeto como una cadena echo $obj; // Destruye el objeto unset($obj); // Muestra un mensaje al final del archivo echo "Fin del archivo.
"; ?>

En este caso, intentar convertir el objeto en una cadena resultará en una llamada al método getProperty(). Cargue el script de prueba en su navegador para ver el resultado:

¡Se inició la clase "MyClass"! Usando el método toString: ¡Soy una propiedad de clase! La clase "MyClass" fue destruida. Fin del archivo.

Consejo. Además de los métodos mágicos discutidos en esta sección, hay varios otros disponibles. Para obtener una lista completa de métodos mágicos, consulte la página de manual de PHP.

Usando herencia

Las clases pueden heredar métodos y propiedades de otra clase. usando la palabra clave extends. Por ejemplo, para crear una segunda clase que extienda MyClass y agregar un método, agregaría lo siguiente a su archivo de prueba:

"; ) función pública __destruct() ( echo "La clase "", __CLASS__, "" fue destruida.
"; ) función pública __toString() ( echo "Usando el método toString: "; return $this->getProperty(); ) función pública setProperty($newval) ( $this->prop1 = $newval; ) función pública getProperty( ) ( devuelve $this->prop1 . "
"; ) ) clase MyOtherClass extiende MyClass ( función pública newMethod() ( echo "De un nuevo método en " . __CLASS__ . ".
"; ) ) // Crea un nuevo objeto $newobj = new MyOtherClass; // Genera el objeto como una cadena echo $newobj->newMethod(); // Usa un método de la clase principal echo $newobj->getProperty() ?>

Después de recargar el archivo de prueba, su navegador muestra lo siguiente:

¡Se inició la clase "MyClass"! De un nuevo método en MyOtherClass. ¡Soy una propiedad de clase! La clase "MyClass" fue destruida.

Sobrescribir propiedades y métodos heredados

Para cambiar el comportamiento de una propiedad o método existente en una nueva clase, simplemente puede sobrescribirlo declarándolo nuevamente en la nueva clase:

"; ) función pública __destruct() ( echo "La clase "", __CLASS__, "" fue destruida.
"; ) función pública __toString() ( echo "Usando el método toString: "; return $this->getProperty(); ) función pública setProperty($newval) ( $this->prop1 = $newval; ) función pública getProperty( ) ( devuelve $this->prop1 . "
"; ) ) clase MyOtherClass extiende MyClass ( función pública __construct() ( echo "Un nuevo constructor en " . __CLASS__ . ".

"; ) ) // Crea un nuevo objeto $newobj = new MyOtherClass; // Genera el objeto como una cadena echo $newobj->newMethod(); // Usa un método de la clase principal echo $newobj->getProperty() ?>

Esto cambia la salida del navegador a:

Un nuevo constructor en MyOtherClass. De un nuevo método en MyOtherClass. ¡Soy una propiedad de clase! La clase "MyClass" fue destruida.

Preservar la funcionalidad original de un método al sobrescribir métodos

Para agregar nueva funcionalidad a un método heredado manteniendo intacto el método original, use la palabra clave principal con operador de resolución de alcance (::):

"; ) función pública __destruct() ( echo "La clase "", __CLASS__, "" fue destruida.
"; ) función pública __toString() ( echo "Usando el método toString: "; return $this->getProperty(); ) función pública setProperty($newval) ( $this->prop1 = $newval; ) función pública getProperty( ) ( devuelve $this->prop1 . "
"; ) ) clase MyOtherClass extiende MyClass ( public function __construct() ( parent::__construct(); // Llama al constructor de la clase principal echo "Un nuevo constructor en " . __CLASS__ . ".
"; ) función pública nuevoMetodo() ( echo "De un nuevo método en " . __CLASS__ . ".
"; ) ) // Crea un nuevo objeto $newobj = new MyOtherClass; // Genera el objeto como una cadena echo $newobj->newMethod(); // Usa un método de la clase principal echo $newobj->getProperty() ?>

Esto imprimirá el resultado tanto del constructor principal como del constructor de la nueva clase:

¡Se inició la clase "MyClass"! Un nuevo constructor en MyOtherClass. De un nuevo método en MyOtherClass. ¡Soy una propiedad de clase! La clase "MyClass" fue destruida.

Especificación de la visibilidad de propiedades y métodos.

Para un control adicional sobre los objetos, se puede dar visibilidad a los métodos y propiedades. Esto define cómo y desde dónde se puede acceder a las propiedades y métodos. Hay tres palabras clave: pública, protegida y privada. Además de su visibilidad, un método o propiedad se puede declarar estático, lo que permite acceder a él sin una instancia de la clase.

"Para un control adicional sobre los objetos, los métodos y propiedades reciben su visibilidad".

"; ) ) $obj = nueva MiClase; echo $obj->prop1; ?>. La visibilidad es una característica nueva en PHP desde la versión 5. Para conocer la compatibilidad de programación orientada a objetos con PHP 4, consulte la página de manual de PHP.

Propiedades y métodos públicos

Todos los métodos y propiedades que ha utilizado hasta ahora han sido públicos. Esto significa que se puede acceder a ellos desde cualquier lugar, tanto dentro como fuera del aula.

Propiedades y métodos protegidos

Si la propiedad o método se declara protegido, solo se puede acceder a él dentro de la propia clase o en clases descendientes(clases que amplían una clase que contiene un método protegido).

Declare el método getProperty() como protegido en MyClass e intente acceder a él directamente desde fuera de la clase:

"; ) función pública __destruct() ( echo "La clase "", __CLASS__, "" fue destruida.
"; ) función pública __toString() ( echo "Usando el método toString: "; return $this->getProperty(); ) función pública setProperty($newval) ( $this->prop1 = $newval; ) función protegida getProperty( ) ( devuelve $this->prop1 . "

"; ) función pública nuevoMetodo() ( echo "De un nuevo método en " . __CLASS__ . ".
"; ) ) // Crea un nuevo objeto $newobj = new MyOtherClass; // Intenta llamar a un método protegido echo $newobj->getProperty(); ?>

Cuando intenta ejecutar este script, recibe el siguiente error:

¡Se inició la clase "MyClass"! Un nuevo constructor en MyOtherClass. Error fatal: llamada al método protegido MyClass::getProperty() desde el contexto "" en /Applications/XAMPP/xamppfiles/htdocs/testing/test.php en la línea 55

Ahora cree un nuevo método en MyOtherClass para llamar al método getProperty():

"; ) función pública __destruct() ( echo "La clase "", __CLASS__, "" fue destruida.
"; ) función pública __toString() ( echo "Usando el método toString: "; return $this->getProperty(); ) función pública setProperty($newval) ( $this->prop1 = $newval; ) función protegida getProperty( ) ( devuelve $this->prop1 . "
"; ) ) clase MyOtherClass extiende MyClass ( función pública __construct() ( parent::__construct(); echo "Un nuevo constructor en " . __CLASS__ . ".
"; ) función pública nuevoMetodo() ( echo "De un nuevo método en " . __CLASS__ . ".
"; ) función pública callProtected() ( return $this->getProperty(); ) ) // Crea un nuevo objeto $newobj = new MyOtherClass; // Llama al método protegido desde dentro de un método público echo $newobj->callProtected( );

Esto producirá el resultado deseado:

¡Se inició la clase "MyClass"! Un nuevo constructor en MyOtherClass. ¡Soy una propiedad de clase! La clase "MyClass" fue destruida.

Propiedades y métodos privados.

Las propiedades o métodos declarados privados son accesibles solo dentro de la clase que los define. Esto significa que incluso si la nueva clase extiende la clase que define la propiedad privada, esta propiedad o método no estará disponible en la clase secundaria.

Para demostrar esto, declare getProperty() como privado en MyClass e intente llamar a callProtected() desde
Miotraclase:

"; ) función pública __destruct() ( echo "La clase "", __CLASS__, "" fue destruida.
"; ) función pública __toString() ( echo "Usando el método toString: "; return $this->getProperty(); ) función pública setProperty($newval) ( $this->prop1 = $newval; ) función privada getProperty( ) ( devuelve $this->prop1 . "

"; ) función pública nuevoMetodo() ( echo "De un nuevo método en " . __CLASS__ . ".
"; ) función pública callProtected() ( return $this->getProperty(); ) ) // Crea un nuevo objeto $newobj = new MyOtherClass; // Usa un método de la clase principal echo $newobj->callProtected(); ?>

Reinicie su navegador y aparecerá el siguiente error:

¡Se inició la clase "MyClass"! Un nuevo constructor en MyOtherClass. Error fatal: llamada al método privado MyClass::getProperty() desde el contexto "MyOtherClass" en /Applications/XAMPP/xamppfiles/htdocs/testing/test.php en la línea 49

Propiedades y métodos estáticos

Se puede acceder a un método o propiedad declarada estática sin crear una instancia de la clase; Simplemente proporcione el nombre de la clase, el operador de resolución de alcance y el nombre de la propiedad o del método.

"Una de las principales ventajas de utilizar propiedades estáticas es que conservan sus valores durante la vida del script".

Para demostrar esto, agregue una propiedad estática $count y un método estático llamado plusOne() a MyClass. Luego configure un bucle do... while para imprimir el valor incremental de $count siempre que el valor sea menor que 10:

"; ) función pública __destruct() ( echo "La clase "", __CLASS__, "" fue destruida.
"; ) función pública __toString() ( echo "Usando el método toString: "; return $this->getProperty(); ) función pública setProperty($newval) ( $this->prop1 = $newval; ) función privada getProperty( ) ( devuelve $this->prop1 . "
"; ) función estática pública plusOne() ( devuelve "El recuento es " . ++self::$count . ".
"; ) ) clase MyOtherClass extiende MyClass ( función pública __construct() ( parent::__construct(); echo "Un nuevo constructor en " . __CLASS__ . ".
"; ) función pública nuevoMetodo() ( echo "De un nuevo método en " . __CLASS__ . ".
"; ) función pública callProtected() ( return $this->getProperty(); ) ) do ( // Llamar a plusOne sin crear una instancia de MyClass echo MyClass::plusOne(); ) while (MyClass::$count< 10); ?>

"; ) ) $obj = nueva MiClase; echo $obj->prop1; ?>. Al acceder a propiedades estáticas, signo de dólar
($) va después del operador de permiso de alcance.

Cuando carga este script en su navegador, se muestra lo siguiente:

La cuenta es 1. La cuenta es 2. La cuenta es 3. La cuenta es 4. La cuenta es 5. La cuenta es 6. La cuenta es 7. La cuenta es 8. La cuenta es 9. La cuenta es 10.

En este tutorial aprenderá los conceptos básicos de la programación orientada a objetos en PHP. Aprenderá sobre los principios de la programación orientada a objetos en general y aprenderá a escribir scripts simples en PHP.

¡Bienvenido a la primera de una serie de lecciones sobre programación orientada a objetos en PHP! Al completar todas las lecciones de esta serie, aprenderá sobre los principios y conceptos básicos de la programación orientada a objetos y aprenderá cómo crear rápida y fácilmente aplicaciones útiles en PHP.

En este tutorial comenzaré a ponerte al día y te contaré los conceptos básicos de la programación orientada a objetos. Aprenderás:

  • ¿Qué es la programación orientada a objetos?
  • Cómo la programación orientada a objetos te ayudará a crear mejores scripts PHP
  • algunos conceptos básicos como clases, objetos, métodos, variables de clase
  • dónde empezar a escribir un script PHP

¿Estás listo para sumergirte en el mundo de los objetos PHP? ¡Entonces adelante!

¿Qué es la programación orientada a objetos?

Si alguna vez ha creado y utilizado funciones personalizadas en PHP, ha utilizado un estilo de programación procedimental. En la programación de procedimientos, normalmente se crean estructuras de datos: números, cadenas, matrices, etc. - almacenar algunos datos y luego procesar estas estructuras con funciones especiales que manipulan estos datos.

La programación orientada a objetos, u OOP, ha avanzado porque aquí almacenamos estructuras de datos y las funciones que las procesan en una única entidad llamada objeto. En lugar de procesar los datos con alguna función, carga esos datos en un objeto y luego llama a sus métodos para manipularlos y obtener el resultado deseado.

Muy a menudo, los objetos creados con programación orientada a objetos reflejan entidades reales. Por ejemplo, si está creando un foro para su sitio, crearía un objeto Miembro que almacenará información sobre cada miembro del foro (nombre, inicio de sesión, correo electrónico, contraseña, etc.), así como métodos que procesarán esta información ( registro, autorización, cierre de sesión, prohibición, etc.).

¿Por qué utilizar programación orientada a objetos?

Procedimental y orientado a objetos son dos formas diferentes de hacer la misma cosa. Esto no quiere decir que uno de ellos sea mejor que el otro: cada uno escribe como quiere, por lo que incluso puedes combinar fácilmente estos dos enfoques en un solo guión.

Sin embargo, aquí hay algunos beneficios de la programación orientada a objetos para los desarrolladores:

  • Es más fácil reflejar situaciones reales: como señalé anteriormente, los objetos reflejan entidades reales: personas, productos, mapas, artículos de blogs, etc. Esto simplifica enormemente la tarea cuando recién comienza a diseñar su aplicación, ya que el propósito de cada objeto Es como un objetivo: las relaciones entre objetos serán claras y comprensibles.
  • Es más fácil escribir programas modulares: la programación orientada a objetos implica escribir módulos. Al dividir su código en módulos, le resultará más fácil administrarlo, depurarlo y ampliarlo.
  • Es más fácil escribir código que se usará muchas veces: escribir código que se pueda usar más de una vez ahorrará tiempo al escribir una aplicación y, con el tiempo, incluso podrá crear una biblioteca completa de este tipo de módulos que podrá usar en muchas ocasiones. aplicaciones. Con la programación orientada a objetos, resulta comparativamente más fácil escribir dicho código, ya que las estructuras de datos y las funciones se encapsulan en un único objeto que se puede utilizar cualquier número de veces.

Algunos conceptos básicos

Antes de comenzar a escribir scripts, debe tener una buena comprensión de los conceptos de clase, objeto, variable de clase y método.

Clases

Una clase es un marco para un objeto. Este es un fragmento de código que define:

  • Tipos de datos que contendrán los objetos de clase creados
  • Funciones que contendrán estos objetos.

Cuando crea una aplicación OOP, generalmente creará varias clases que representarán los diferentes tipos de entidades en su aplicación. Por ejemplo, para crear un foro, puede crear las clases Foro, Tema, Publicación y Miembro.

Objetos

Un objeto es un tipo especial de variable que se crea a través de una clase. Contiene datos reales y funciones para manipularlos. Puedes crear tantos objetos como quieras a partir de una sola clase. Cada función de un objeto es independiente de otro objeto, incluso si están creados a partir de la misma clase.

Para comparación con entidades reales:

  • Una clase es el marco de un automóvil: define cómo se verá y actuará el automóvil, pero sigue siendo una entidad abstracta.
  • Un objeto es un coche real creado a partir de una estructura alámbrica: tiene propiedades reales (como la velocidad) y comportamiento (como la aceleración o el frenado).

Nota: Un objeto a menudo se denomina esencia de una clase y el proceso de creación de un objeto de una clase se denomina implementación.

Variables de clase

Los valores de datos que se almacenan en un objeto particular se escriben en variables especiales llamadas variables de clase. Las variables de clase están estrechamente asociadas con su objeto. Aunque todos los objetos de una clase tienen las mismas variables, sus valores pueden diferir.

Métodos

Las funciones definidas en una clase y utilizadas en objetos de esa clase se denominan métodos. No son muy diferentes de las funciones normales: puede pasarles valores, pueden contener variables locales y valores de retorno. Sin embargo, los métodos suelen funcionar con variables de objeto. Por ejemplo, el método login() para iniciar sesión en su foro podría establecer la variable de clase loggedIn en verdadero.

¿Cómo crear una clase en PHP?

Ahora que ya sabes qué son las clases, métodos, variables de clase y objetos, es hora de crear un par de clases y objetos en código PHP.

Primero, veamos cómo crear realmente una clase. Básicamente, el script para crear una clase se ve así:

Clase NombreClase ( // (definición de clase) )

Por ejemplo, si estás creando una clase de miembro para tu foro, escribirías esto:

Miembro de clase ( // (definición de clase) )

Es bastante simple. Naturalmente, esta clase no hará nada hasta que le agregue variables y métodos. Sin embargo, el código anterior crea una clase PHP válida que se puede utilizar.

Una buena regla general: coloque cada clase en un archivo separado con el mismo nombre que el nombre de la clase. Por ejemplo, coloque la clase Miembro en el archivo Member.php y guárdela en una carpeta, por ejemplo, clases.

¿Cómo crear objetos en PHP?

Puedes crear un objeto usando la nueva palabra clave:

Nuevo nombre de clase()

Este código creará un objeto de clase ClassName. Necesitará utilizar este objeto más adelante, por lo que deberá almacenarlo en una variable. Por ejemplo, creemos un objeto de la clase Miembro y almacenémoslo en la variable $miembro:

$miembro = nuevo miembro();

También podemos crear otro objeto de la misma clase:

$miembro2 = nuevo miembro();

Aunque creamos estos dos objetos a partir de la misma clase, las variables $miembro y $miembro2 son independientes entre sí.

Crear variables de clase

Ahora que ya sabemos cómo crear clases y objetos de clase, veamos cómo crear variables de clase. Hay 3 descriptores de acceso para variables de clase que se pueden agregar a una clase:

  • Variables de clase pública (públicas): accesibles, es decir se pueden leer y/o modificar - en cualquier parte del script, independientemente de dónde se encuentre este código - dentro o fuera de la clase
  • Variables de clase privadas (privadas): accesibles solo para métodos de clase. Es mejor hacer que las variables de clase sean privadas para separar los objetos del resto del código.
  • Variables de clase protegidas: Disponibles para métodos de tu propia clase, así como para métodos de clases heredadas (hablaremos de herencia más adelante).

Para crear una variable de clase, escriba la palabra clave pública, privada o protegida y luego ingrese el nombre de la variable:

Clase NombreClase ( público $nombrepropiedad; privado $nombrepropiedad; protegido $nombrepropiedad; )

Agreguemos una variable de clase pública a nuestra clase Miembro para almacenar el nombre de usuario:

Miembro de la clase ( public $nombre de usuario = ""; )

Observe que hemos inicializado nuestra variable de clase, su valor es la cadena vacía, "". Esto significa que cuando se crea un nuevo usuario, el nombre de usuario será la cadena vacía de forma predeterminada. Al igual que en el caso de las variables regulares en PHP, las variables de clase no necesitan inicializarse, pero es mejor no ser perezosos. Si no inicializa una variable de clase, su valor predeterminado es nulo.

Accediendo a variables de clase

Para obtener acceso a una variable de un objeto, use el operador ->:

$objeto->nombrepropiedad

Probémoslo. Escribamos un script que declare una clase Miembro y una variable de clase, cree un objeto de esta clase y luego establezca el valor de la variable de clase y lo muestre en la pantalla:

nombre de usuario = "Fred"; echo $miembro->nombre de usuario; // Imprimir "Fred" ?>

Ejecute este código, mostrará la cadena "Fred", el valor de la variable de clase $miembro->nombre de usuario. Como puede ver, opera con una variable de objeto como con una variable normal: puede establecerle un valor y leerlo.

Agregar métodos a una clase

¿Qué pasa con la creación de métodos? Como mencioné anteriormente, los métodos son simplemente funciones regulares que forman parte de una clase. Por lo tanto, es posible que no le sorprenda que se creen utilizando la misma palabra clave de función. La única diferencia con la creación de funciones normales es que también puedes agregar uno de los identificadores de acceso (público, privado, protegido) a su declaración. De esta forma, los métodos son similares a las variables de clase:

Clase Nombre de clase ( función pública Nombre de método() ( // (código) ) Función privada Nombre de método() ( // (código) ) Función protegida Nombre de método() ( // (código) ) )

Nota: al igual que en el caso de las variables de clase, los métodos públicos se pueden llamar desde cualquier lugar, los métodos privados solo se pueden llamar dentro de la clase y los métodos protegidos se pueden llamar desde la propia clase y su descendiente.

Intentemos agregar algunos métodos y variables de clase a nuestra clase:

  • Variable de clase privada $loggedIn para identificar al usuario, es decir. si entró o no,
  • método login(), que iniciará sesión en el foro estableciendo la variable de clase $loggedIn en verdadero,
  • método logout(), que cerrará la sesión del foro estableciendo la variable de clase $loggedIn en falso,
  • Método isLoggedIn(), que devolverá el valor de la variable de clase $loggedIn.

Aquí está nuestro código:

iniciado sesión = verdadero;

) función pública cerrar sesión() ( $this->loggedIn = false; ) función pública isLoggedIn() ( return $this->loggedIn; ) ) ?>

Es posible que hayas notado que utilizamos una nueva palabra clave $this. En el contexto de los métodos de un objeto, la variable especial $this se refiere al objeto mismo. Al usar $this en un método de objeto, el método puede acceder a cualquier variable de clase y método del objeto.

Por ejemplo, el método login() puede acceder a la variable de clase $loggedIn del objeto a través de $this->loggedIn.

Por cierto, nuestra variable de clase es privada, por lo que no se puede llamar desde ninguna parte del script, sino solo desde los métodos login(), logout() e isLoggedIn(). Este es un buen enfoque porque los aspectos internos del objeto (como cómo registra exactamente si el usuario ha iniciado sesión o no) están separados del resto del código. Siempre que sea posible, intenta utilizar variables de clase privada para que tus objetos sean autónomos, móviles y protegidos.

Nota: la variable de clase $username en nuestro ejemplo es pública. Hice esto sólo para demostrar cómo se puede acceder a las variables de clase de un objeto. En proyectos reales, preferiría hacer que esta variable sea privada y crear variables de clase pública especiales para establecer valores de nombre de usuario si es necesario.

Usando métodos

Para llamar a un método en un objeto, utilice el operador ->, con el que ya está familiarizado.

$objeto->nombremétodo()

Esto funciona igual que llamar a una función normal. Puede pasar argumentos entre paréntesis (asumiendo que toma algún argumento, por supuesto), y la llamada al método también puede devolver valores específicos que luego puede usar.
iniciado sesión = verdadero;
) función pública cerrar sesión() ( $this->loggedIn = false; ) función pública isLoggedIn() ( return $this->loggedIn; ) ) $miembro = nuevo miembro(); $miembro->nombre de usuario = "Fred"; echo $miembro->nombre de usuario. "es". ($miembro->
"; ?>

"; $miembro->login(); echo $miembro->nombre de usuario . " es " . ($miembro->isLoggedIn() ? "ha iniciado sesión": "desconectado") . "

"; $miembro->logout(); echo $miembro->nombre de usuario . " es " . ($miembro->isLoggedIn() ? "ha iniciado sesión": "desconectado") . "

Este script mostrará lo siguiente:

  1. Fred está desconectado Fred está conectado Fred está desconectado
  2. Luego llamamos al método $member->isLoggedIn() para determinar si el usuario ha iniciado sesión o no. Este método simplemente devuelve el valor de la variable de clase $loggedIn. Dado que el valor predeterminado de esta variable de clase es falso, el resultado de llamar a $member->isLoggedIn() será falso, por lo que se mostrará el mensaje "Fred ha cerrado sesión".
  3. Luego llamamos al método login(). Establecerá la variable de clase $loggedIn en verdadero.
  4. Ahora, al llamar al método $member->isLoggedIn(), devolverá verdadero y mostrará el mensaje "Fred ha iniciado sesión".
  5. Llamemos al método logout(), que establece el valor de la propiedad $loggedIn en falso.
  6. Llamemos al método $member->isLoggedIn() por tercera vez. Ahora devolverá falso porque la propiedad $loggedIn se establece nuevamente en falso. Entonces, se mostrará nuevamente el mensaje "Fred ha cerrado sesión".

Nota: en caso de que hayas visto esto primero: ?: es un operador ternario. Esta es una versión simplificada de los bloques if...else. Puedes aprender sobre este tipo de operadores.

Conclusiones

En este tutorial aprendiste los conceptos básicos de la programación orientada a objetos en PHP. Aprendiste sobre cosas como:

  • ¿Qué es la programación orientada a objetos y por qué es útil?
  • conceptos de clases, objetos, variables de clase y métodos
  • cómo crear clases y objetos
  • cómo crear y usar variables de clase
  • conceptos de identificadores de acceso público, privado, protegido
  • cómo crear y utilizar métodos de clase

Ya ha aprendido mucho al respecto y aprenderá mucho más en las siguientes lecciones. Sin embargo, si ha trabajado con todos los ejemplos que le he dado, tendrá una base sólida. Puede comenzar a crear aplicaciones usando programación orientada a objetos.

11 de marzo de 2010 a las 11:37

POO con ejemplos (parte 1)

  • Proceso educativo en TI.

Por voluntad del destino, tengo que leer un curso especial sobre patrones de diseño en una universidad. El curso especial es obligatorio, por eso los alumnos que vienen a mí son muy diferentes. Por supuesto, entre ellos también hay programadores en ejercicio. Pero, desafortunadamente, la mayoría de las personas tienen dificultades incluso para comprender los términos básicos de la programación orientada a objetos.

Para ello, intenté explicar los conceptos básicos de la POO (clase, objeto, interfaz, abstracción, encapsulación, herencia y polimorfismo) utilizando ejemplos más o menos vivos.

La primera parte a continuación trata sobre clases, objetos e interfaces.
ilustra la encapsulación, el polimorfismo y la herencia.

Conceptos básicos de programación orientada a objetos

Clase
Imagina que estás diseñando un coche. Ya sabes que un coche debe contener motor, suspensión, dos faros, 4 ruedas, etc. También sabes que tu coche debe poder acelerar y frenar, girar y dar marcha atrás. Y, lo más importante, sabrá exactamente cómo interactúan el motor y las ruedas, según qué leyes se mueven el árbol de levas y el cigüeñal, así como cómo están diseñados los diferenciales. Confías en tus conocimientos y empiezas a diseñar.

Describes todas las partes que componen tu automóvil, así como también cómo estas partes interactúan entre sí. Además, se describe lo que debe hacer el usuario para que el coche frene o encienda las luces altas. El resultado de tu trabajo será un boceto. Acabas de desarrollar lo que se llama en POO Clase.

Clase es una forma de describir una entidad que define un estado y un comportamiento que depende de este estado, así como reglas para interactuar con esta entidad (contrato).

Desde el punto de vista de la programación, una clase puede considerarse como un conjunto de datos (campos, atributos, miembros de la clase) y funciones para trabajar con ellos (métodos).

Desde el punto de vista de la estructura del programa, una clase es un tipo de datos complejo.

En nuestro caso, la clase mostrará una entidad: un automóvil. Los atributos de clase serán el motor, la suspensión, la carrocería, las cuatro ruedas, etc. Los métodos de clase serán "abrir la puerta", "pisar el acelerador" y también "bombear una porción de gasolina del tanque de gasolina al motor". Los dos primeros métodos están disponibles para que otras clases los ejecuten (en particular, la clase "Driver"). Este último describe interacciones dentro de la clase y no es accesible para el usuario.

De ahora en adelante, aunque la palabra “usuario” esté asociada al Solitario y a Microsoft Word, nos referiremos a los programadores que utilizan tu clase como usuarios, incluido tú mismo. Llamaremos desarrollador a la persona que es el autor de la clase.

Objeto
Hiciste un gran trabajo y las máquinas desarrolladas según tus planos están saliendo de la línea de montaje. Aquí están, parados en ordenadas filas en el patio de la fábrica. Cada uno de ellos repite exactamente tus dibujos. Todos los sistemas interactúan exactamente como usted los diseñó. Pero cada coche es único. Todos tienen números de carrocería y de motor, pero todos estos números son diferentes, los coches difieren en color y algunos incluso tienen piezas fundidas en lugar de ruedas estampadas. Estos coches son esencialmente objetos de tu clase.

Objeto (instancia) Es un individuo representante de una clase que tiene un estado y un comportamiento específicos que están enteramente determinados por la clase.

En términos simples, un objeto tiene valores de atributos específicos y métodos que operan sobre esos valores según las reglas definidas en la clase. En este ejemplo, si la clase es un automóvil abstracto del "mundo de las ideas", entonces el objeto es un automóvil concreto que se encuentra debajo de las ventanas.

Interfaz
Cuando nos acercamos a una máquina de café o nos ponemos al volante, iniciamos una interacción con ellos. Normalmente, la interacción se produce mediante un determinado conjunto de elementos: una ranura para aceptar monedas, un botón para seleccionar una bebida y un compartimento para dispensar un vaso en una máquina de café; volante, pedales, palanca de cambios en un coche. Siempre hay un conjunto limitado de controles con los que podemos interactuar.

Interfaz es un conjunto de métodos de clase que están disponibles para que los utilicen otras clases.

Obviamente, la interfaz de una clase será el conjunto de todos sus métodos públicos junto con un conjunto de atributos públicos. Esencialmente, una interfaz especifica una clase, definiendo claramente todas las acciones posibles sobre ella.
Un buen ejemplo de interfaz es el salpicadero de un coche, que permite activar métodos como acelerar, frenar, girar, cambiar de marcha, encender los faros, etc. Es decir, todas las acciones que otra clase (en nuestro caso, el conductor) puede realizar al interactuar con el coche.

Al describir una interfaz de clase, es muy importante lograr un equilibrio entre flexibilidad y simplicidad. Una clase con una interfaz sencilla será fácil de usar, pero habrá problemas que no podrá resolver. Al mismo tiempo, si la interfaz es flexible, lo más probable es que consista en métodos bastante complejos con una gran cantidad de parámetros que le permitirán hacer mucho, pero su uso estará plagado de grandes dificultades y el riesgo de cometer errores. un error, algo mezclado

Un ejemplo de interfaz sencilla sería un automóvil con transmisión automática. Cualquier rubia que haya realizado un curso de conducción de dos semanas podrá dominar su funcionamiento muy rápidamente. Por otro lado, para dominar el control de un avión de pasajeros moderno se necesitan varios meses, o incluso años, de duro entrenamiento. No me gustaría estar a bordo de un Boeing pilotado por alguien que tiene dos semanas de experiencia de vuelo. Por otro lado, nunca conseguirás un coche para despegar y volar de Moscú a Washington.




Arriba