2011-06-16 11 views
25

Duplicar posible:
interface vs abstract class¿Cuál es la ventaja si uso la clase abstracta en php?

¿Cuáles son las ventajas si uso clase abstracta en php?

¿Cuál es el objetivo si uso abstract clase o interfaces?

Ambos están simplemente creando Defenition nombres con el cuerpo hacia fuera

+1

más: http://stackoverflow.com/search?q=abstract+class+interface+php – Gordon

+0

Ya lo entiendo ... me gustaría cerrar la pregunta – Sreeraj

+4

Bah, después de pasar diez minutos escribiendo una respuesta? :( –

Respuesta

63

¿Cuáles son la ventaja si uso la clase abstracta en php? No puedo encontrar nada bueno en eso. Creo que puedo trabajar fácilmente sin usar la clase abstracta.

Podría, naturalmente. Sin embargo, si hay muchos objetos que son del mismo tipo, podría ayudar a extraer la funcionalidad común en una clase "base", lo que significa que no tiene que duplicar esa lógica.

En realidad, hay dos razones. La primera razón, para mí, sería que todos los descendientes de su clase abstracta tienen el mismo tipo , y ambos se adhieren a la misma interfaz exacta. Eso significa que un documento PDF, por ejemplo, tendrá la misma interfaz que un documento docx, y el código del cliente no tiene que importar qué objeto está manejando. Ejemplo corto (en PHP).

<?php 
abstract class Document { 
    protected $author; 

    public function __construct($author) { 
     $this->author = $author; 
    } 

    abstract public function render(); 

    public function author() { 
     return $this->author; 
    } 
} 

class PdfDocument extends Document { 
    public function render() { 
     // do something PDF specific here. 
    } 
} 

class DocxDocument extends Document { 
    public function render() { 
     // do something DOCX specific here. 
    } 
} 


class DocumentHandler { 
    public function handle(Document $document) { 
     $this->log('Author has been read ' . $document->author()); 
     return $document->render(); 
    } 
} 

Primero de todos; Tenga en cuenta el hecho de que la clase DocumentHandler no tiene conocimiento de qué tipo de documento está realmente manejando. Ni siquiera le importa. Es ignorante Sin embargo, es sabe saber qué métodos se pueden invocar, porque la interfaz entre los dos tipos de documentos es la misma. Esto se llama polimorfismo , y podría lograrse fácilmente con la implementación de una interfaz de documento.

La segunda parte es; si todos y cada uno de los documentos tiene un autor, y ese autor siempre se solicita, puede copiar el método en el documento PdfDocument y DocxDocument, pero se estaría duplicando. Por ejemplo, si decides que quieres que el autor esté escrito con mayúsculas, y cambiarías el retorno $ this-> author a ucwords ($ this-> author), tendrías que hacerlo tantas veces como tú. he copiado ese método. Usando una clase abstracta, puede definir el comportamiento, mientras marca la clase como incompleta. Esto es muy útil.

Espero que ayude.

+0

Gracias Berry. – Sreeraj

+1

¡Explicación impresionante, gracias! –

+1

Explicación agradable – Mirko

2

No toda la clase abstracta métodos deben estar vacíos, puede haber algunos métodos básicos (y propiedades) a trabajar. Por ejemplo, tiene y e-shop y desarrolla una clase abstracta para importar productos. La clase tiene un método para guardar productos a db, para generar la URL del producto y un método abstracto para recuperar productos de algún lugar (que, por lo tanto, debe implementarse en la clase extendida). La interfaz solo tiene métodos en blanco y no tiene propiedades (aunque puede tener constantes), por lo que puede no haber lógica real, solo constantes de método, nombres de métodos y sus modificadores de acceso.

10

Las clases abstractas te ayudan cuando tienes muchas clases que tienen los mismos métodos.

Ejemplo:

abstract class Foo { 
    public function foo1() { 
    //Do something 
    } 

    public abstract class foo2(); 
} 

class Bar extends Foo { 
    public class foo2() { 
    //Do something 
    } 
} 

class Baz extends Foo { 
} 

¿Qué pasará:

  • No se puede utilizar new Foo();, Foo es abstracto.
  • Podrá usar Bar.foo1() y Baz.foo1(), ellos harán lo mismo.
  • Tendrá un error, porque Baz no implementa el método abstact foo2.

Ejemplo donde es muy útil:

abstract class Shape { 
    public function display() { /* ... */ } 
    //... 
} 

class Circle extends Shape { 
    //... 
} 

class Rectangle extends Shape { 
    //... 
} 

//... 

usted quisiera que cada clase sea capaz de display(), pero no hay tal cosa como "Shape" por sí mismo.

1

Como su nombre lo indica, el propósito de una interfaz es declarar explícitamente la interfaz a los datos y métodos proporcionados por una clase y las instancias, sin la necesidad de codificar esos métodos de inmediato. El ejemplo clásico es el de las formas geométricas. una interfaz de este tipo podría definir un método que produce la zona de una forma tal:

interface Shape { 
    public function getArea(); 
} 

Podría haber un número de diferentes clases que implementan esta interfaz como Circle y Square que proporcionaría diferentes implementaciones para el método getArea(). A continuación, podría implementar una función que muestra información en cualquier forma geométrica:

function displayInformation(Shape $shape) { 
    echo "The area of this shape is: " . $shape->getArea(); 
} 

Se podía pasar cualquier objeto implementado la interfaz de Shape a esta función, y las garantías de interfaz que el método getArea() está presente.

Por supuesto, estos conceptos pueden ser más útiles en lenguajes de programación que están escritos con mayor fuerza que PHP.

Cuestiones relacionadas