2011-01-13 17 views
5

Estoy tratando de mejorar mi conocimiento de OOP en PHP y he estado investigando clases e interfaces abstractas.Ejemplos de Real World de funciones avanzadas de OOP para PHP

Lo que he aprendido

  • Ambos son clases que no se pueden crear instancias sí mismos, sino olny se pueden extender (implementado en el caso de las interfaces)
  • Las clases abstractas proporcionan métodos y propiedades para otras clases que los extienden
  • Si una clase usa un método abstracto, la clase en sí misma también debe ser abstracta.
  • Si se define un método abstracto dentro de una clase abstracta, todas las clases secundarias deben definir los detalles de ese método. Los métodos no definidos como abstractos se pueden usar de la misma manera que los métodos normales.
  • Las interfaces definen qué métodos debe tener una clase que implemente. La funcionalidad de los métodos no está definida en la interfaz, la interfaz solo ofrece una lista de métodos que deben incluirse en la clase secundaria.
  • Una interfaz no define ninguna propiedad.
  • Las clases pueden implementar tantas interfaces como quieren pero tienen que definir un método para cada una de las interfaces que implementan

Creo que cubre los conceptos básicos. Por favor, siéntase libre de agregar a eso si cree que hay algo que me he perdido.

Lo que me gustaría saber es si hay ejemplos del mundo real de implementación de estas clases, especialmente la clase de interfaz. ¿Alguien sabe de alguna aplicación de código abierto que los use que pueda navegar para comprenderlos mejor y ver dónde y cuándo se usan con eficacia? He encontrado ejemplos de libros que usan animales que no demuestran la importancia de estas clases.

Respuesta

1

No es un ejemplo del mundo real como tal, pero un patrón de diseño donde normalmente se encuentran interfaces y clases abstractas es el Command Pattern. Ver enlace por ejemplo código.

En general, la "programación contra una interfaz" se considera una buena práctica de OO, porque desacopla las implementaciones concretas y le permite cambiarlas más fácilmente para otras implementaciones, p.en vez de pedir una clase específica

public function fn(ConcreteClass $obj) 
{ 
    $obj->doSomething() 
} 

sólo pide que proporciona un cierto conjunto de métodos

public function fn(MyInterface $obj) 
{ 
    $obj->doSomething() 
} 

Interfaces también ayudan burlas estructuras de herencia, aparte de gran tamaño. Dado que PHP sólo es compatible con herencia simple, a menudo se ve jerarquías de la siguiente manera:

BaseClass -> Logger -> Auth -> User 

donde cada uno de ellos contiene aspectos específicos que se utilizan dentro de estas clases. Con una interfaz, que acaba de hacer

User implements Loggable, Authenticable 

y luego incluir ese código específico a través de patrones de estrategia o Composición/agregación, que en definitiva es mucho más fácil de mantener.

Para obtener una lista de las interfaces predefinidas en PHP ver mi respuesta a:

2

PHP viene con algunas interfaces de predefinded por defecto: http://www.php.net/manual/en/reserved.interfaces.php

PHP también contiene Standard PHP Library (SPL), que define más:

Zend Framework es también un muy buen ejemplo donde tales conceptos son usado. http://framework.zend.com/

+0

También, trabajo en progreso de ZF2 wiki: http://framework.zend.com/wiki/display/ZFDEV2 – joksnet

+0

@Gordon: busque por ejemplo en ese: http://www.php.net/manual/en /class.splheap.php – vartec

+1

@Gordon, editado la respuesta – vartec

0

Podemos decir que la interfaz es puramente clase 100% abstracta pero abstracta no lo es. Porque muchas veces definimos la función en clase abstracta. Pero en la clase de interfaz siempre declaramos la función.

1

La palabra clave final impide la clase que se extendieron por otras clases, ejemplo:

class Parent 
{ 
} 

class Mother extends Parent 
{ 
} 

final class Brother extends Mother /* - This class cannot be extended - */ 
{ 
} 

class Pet extends Brother 
{ 
} 

La clase de mascotas arrojará un error que indica: Fatal error: Class Pet may not inherit from final class (Brother)

Esto también está disponible para los métodos, así que si lo hace No desea permitir que los métodos se hereden, lo que hace que la clase secundaria tenga el mismo método que actúa como una anulación.

http://php.net/manual/en/language.oop5.final.php

Yo usado que le gustaría algunos ejemplos del mundo real de lo que las interfaces pueden utilizarse para, además de una capa de abstracción de base de datos

Tienes 1 clase base que proporciona los métodos básicos para iterar a su base de datos datos, pero que usarían una subclase para el tipo de base de datos, como MySql, MsSql, etc., cada tipo de base de datos tendría su propia clase, pero para la clase base para asegurarse de que tiene estos métodos, todos implementarían el mismo interfaz.

Ejemplo

interface IDatabaseLayer 
{ 
    public function connect(); 
    public function query(); 
    public function sanitize(); 
    //... 
} 

Así la clase base sabe que MySQL y MsSql tienen los métodos anteriores, reduciendo así los errores y ser más organizado.

Al pasar objetos a las clases, quiere asegurarse de que el objeto sea de un tipo determinado, PHP5 le permite definir qué tipo de objeto se debe pasar a los métodos como params.

Digamos que tiene 3 clases

  • DatabaseCredentials
  • DatabaseConnection
  • DatabaseQuery

puede definir específicamente en el constructuin de DatabaseConnection que necesita una clase DatabaseCredentials así:

class DatabaseConnection implements Connectable 
{ 
    public function __construct(DatabaseCredentials $ConnectionDetails) 
    { 
     $this->Connect($ConnectionDetails->BuildDSN()); 
    } 
} 

Una buena manera de empezar realmente es leer aquí:


Otra característica de PHP5 es posible que desee tener en cuenta es espacios de nombres, esto permitirá usted para mantener su código organizado, tener múltiples objetos con el mismo nombre, hace que la carga automática sea más eficiente

Pequeño Ejemplo:

namespace Database\MySql 
{ 
    class Database{} 
} 

namespace Database\MsSql 
{ 
    class Database{} 
} 

Y sólo se puede utilizar como:

use Database; 
$Database = new MySql\Database(); 
+0

He leído que el espacio de nombres char es \. Estoy un poco perdido, ¿es/o? – Aif

+0

No es su derecho, solo pseudo código – RobertPitt

1

puede seguir las "PHP patterns" series por Giorgio Sironi en DZone o directamente en his blog, muy interesante si estás patrones interesados ​​y programación orientada a objetos.

También podría echar un vistazo al Best PHP programming book en stackoverflow si necesita un buen libro de PHP.

Cuestiones relacionadas