2010-04-01 22 views
72

¿Qué es una clase abstracta en php? ¿Dónde se puede usar?¿Qué es la clase abstracta en php?

+1

* (de referencia) * http://de2.php.net/manual/en/language.oop5.abstract.php – Gordon

+2

* (relacionado) * http: // stackoverflow.com/questions/2288467/what-is-the-purpose-of-abstract-class – Gordon

+4

@Gordon: A veces los documentos oficiales no son tan claros para algunas personas :( – Sarfraz

Respuesta

87

Una clase abstracta es una clase que contiene al menos un método abstracto, que es un método sin ningún código real, solo el nombre y los parámetros, y que se ha marcado como "abstracto".

El propósito de esto es proporcionar un tipo de plantilla para heredar y forzar a la clase heredada a implementar los métodos abstractos.

Una clase abstracta es algo entre una clase normal y una interfaz pura. También las interfaces son un caso especial de clases abstractas donde TODOS los métodos son abstractos.

Consulte this section del manual de PHP para más referencia.

+3

En [este hilo] (http://stackoverflow.com/questions/254514/php-and-enumerations), el resumen no contiene ningún método abstracto. – r0ng

+1

@ r0ng Sería más correcto decir que una clase abstracta * puede * contener métodos abstractos, y los métodos abstractos siempre deben estar dentro de una clase abstracta. Las características prácticas definitorias en mi mente son que no se puede crear una instancia de una clase abstracta, pero puede heredar y sobreescribir métodos, y los métodos estáticos de una clase abstracta se pueden usar normalmente. – Fx32

13

An abstract class is a class that is only partially implemented by the programmer. It may contain one or more abstract methods. An abstract method is simply a function definition that serves to tell the programmer that the method must be implemented in a child class.

hay una buena explicación de que here.

+0

@Sarfraz Por cierto, me gusta tu marcador mágico. ¿Alguna posibilidad de que funcione en Alemania? –

+0

@Pekka estoy bastante seguro de que tendrás tu tarjeta SIM autobloqueada después de n intentos falsos. – Gordon

+0

@Gordon mierda. Tenía muchas ganas de finalmente deshacerme de mis grilletes contractuales de 2 años :) Me gusta cómo ese artículo w como fechada * 27 de marzo * :) –

5

Enlace: Abstract Class in Php and oops

  • Resumen clase sólo contiene declarar la firma del método, que no pueden definir la aplicación.
  • La clase de abstracción se define utilizando la palabra clave abstract.
  • Resumen La clase no es posible implementar herencia múltiple.
  • La última versión de PHP 5 presenta clases y métodos abstractos.
  • clases definidas como abstracta, no somos capaces de crear el objeto (puede no instanciado)

http://www.codingslover.com/2015/07/abstract-class-in-php.html

56

Abstract classes are classes that contain one or more abstract methods. An abstract method is a method that is declared, but contains no implementation. Abstract classes may not be instantiated, and require subclasses to provide implementations for the abstract methods.

1. No se puede crear una instancia de clase abstracta: Clases definida como abstracta no puede ser instanciado, y cualquier clase que contenga al menos un método abstracto también debe ser abstracto.

Ejemplo a continuación:

abstract class AbstractClass 
{ 

    abstract protected function getValue(); 
    abstract protected function prefixValue($prefix); 


    public function printOut() { 
     echo "Hello how are you?"; 
    } 
} 

$obj=new AbstractClass(); 
$obj->printOut(); 
//Fatal error: Cannot instantiate abstract class AbstractClass 

2. Cualquier clase que contiene al menos un método abstracto también debe ser abstracta: clase abstracta puede tener métodos abstractos y no abstractos, pero debe contener al menos una método abstracto Si una clase tiene al menos un método abstracto, entonces la clase debe declararse abstracta.

Note: Traits support the use of abstract methods in order to impose requirements upon the exhibiting class.

Ejemplo a continuación:

class Non_Abstract_Class 
{ 
    abstract protected function getValue(); 

    public function printOut() { 
     echo "Hello how are you?"; 
    } 
} 

$obj=new Non_Abstract_Class(); 
$obj->printOut(); 
//Fatal error: Class Non_Abstract_Class contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Non_Abstract_Class::getValue) 

3. Un método abstracto no puede contener cuerpo: Métodos definidos como extracto simplemente declaran la firma del método - no pueden definir la aplicación. Pero un método no abstracto puede definir la implementación.

abstract class AbstractClass 
{ 
    abstract protected function getValue(){ 
    return "Hello how are you?"; 
    } 

    public function printOut() { 
     echo $this->getValue() . "\n"; 
    } 
} 

class ConcreteClass1 extends AbstractClass 
{ 
    protected function getValue() { 
     return "ConcreteClass1"; 
    } 

    public function prefixValue($prefix) { 
     return "{$prefix}ConcreteClass1"; 
    } 
} 

$class1 = new ConcreteClass1; 
$class1->printOut(); 
echo $class1->prefixValue('FOO_') ."\n"; 
//Fatal error: Abstract function AbstractClass::getValue() cannot contain body 

4. Cuando hereda de una clase abstracta, todos los métodos marcados resumen en declaración de la clase de los padres debe ser definido por el niño: Si hereda una clase abstracta que tiene que proporcionar implementaciones para todos los métodos abstractos en eso.

abstract class AbstractClass 
{ 
    // Force Extending class to define this method 
    abstract protected function getValue(); 

    // Common method 
    public function printOut() { 
     print $this->getValue() . "<br/>"; 
    } 
} 

class ConcreteClass1 extends AbstractClass 
{ 
    public function printOut() { 
     echo "dhairya"; 
    } 

} 
$class1 = new ConcreteClass1; 
$class1->printOut(); 
//Fatal error: Class ConcreteClass1 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractClass::getValue) 

5. Lo mismo (o una menos restringido) la visibilidad: Cuando hereda de una clase abstracta, todos los métodos marcados resumen en declaración de la clase de los padres debe ser definido por el niño; adicionalmente, estos métodos deben definirse con la misma (o menos restringida) visibilidad. Por ejemplo, si el método abstracto se define como protegido, la implementación de la función debe definirse como protegida o pública, pero no privada.

Note that abstract method should not be private.

abstract class AbstractClass 
{ 

    abstract public function getValue(); 
    abstract protected function prefixValue($prefix); 

     public function printOut() { 
     print $this->getValue(); 
    } 
} 

class ConcreteClass1 extends AbstractClass 
{ 
    protected function getValue() { 
     return "ConcreteClass1"; 
    } 

    public function prefixValue($prefix) { 
     return "{$prefix}ConcreteClass1"; 
    } 
} 
$class1 = new ConcreteClass1; 
$class1->printOut(); 
echo $class1->prefixValue('FOO_') ."<br/>"; 
//Fatal error: Access level to ConcreteClass1::getValue() must be public (as in class AbstractClass) 

6. Las firmas de los métodos abstractos deben coincidir: Cuando hereda de una clase abstracta, todos los métodos marcados resumen en declaración de la clase de los padres debe ser definido por el niño; las firmas de los métodos debe coincidir, es decir, las sugerencias de tipo y la cantidad de argumentos requeridos deben ser iguales. Por ejemplo, si la clase secundaria define un argumento opcional, donde la firma del método abstracto no lo hace, no hay conflicto en la firma.

abstract class AbstractClass 
{ 

    abstract protected function prefixName($name); 

} 

class ConcreteClass extends AbstractClass 
{ 


    public function prefixName($name, $separator = ".") { 
     if ($name == "Pacman") { 
      $prefix = "Mr"; 
     } elseif ($name == "Pacwoman") { 
      $prefix = "Mrs"; 
     } else { 
      $prefix = ""; 
     } 
     return "{$prefix}{$separator} {$name}"; 
    } 
} 

$class = new ConcreteClass; 
echo $class->prefixName("Pacman"), "<br/>"; 
echo $class->prefixName("Pacwoman"), "<br/>"; 
//output: Mr. Pacman 
//  Mrs. Pacwoman 

7. Clase abstracta no soporta herencia múltiple: Resumen lata clase extiende otra clase abstracta, la clase abstracta puede proporcionar la implementación de interface.But que no soporta la herencia múltiple.

interface MyInterface{ 
    public function foo(); 
    public function bar(); 
} 

abstract class MyAbstract1{ 
    abstract public function baz(); 
} 


abstract class MyAbstract2 extends MyAbstract1 implements MyInterface{ 
    public function foo(){ echo "foo"; } 
    public function bar(){ echo "bar"; } 
    public function baz(){ echo "baz"; } 
} 

class MyClass extends MyAbstract2{ 
} 

$obj=new MyClass; 
$obj->foo(); 
$obj->bar(); 
$obj->baz(); 
//output: foobarbaz 

Note: Please note order or positioning of the classes in your code can affect the interpreter and can cause a Fatal error. So, when using multiple levels of abstraction, be careful of the positioning of the classes within the source code.

ejemplo abajo hará que Fatal error: 'caballo' Clase no encontrada

class cart extends horse { 
    public function get_breed() { return "Wood"; } 
} 

abstract class horse extends animal { 
    public function get_breed() { return "Jersey"; } 
} 

abstract class animal { 
    public abstract function get_breed(); 
} 

$cart = new cart(); 
print($cart->get_breed()); 
6

Resumen Clase
1. Contiene un método abstracto
2. No puede ser inicializado directamente
3. No se puede crear un objeto de clase abstracta
4. Sólo se utiliza con fines de herencia

método abstracto
1. No puede contener un cuerpo
2. No se puede definir como
3. Clases infantiles privados han de definir los métodos declarados en la clase abstracta

Código Ejemplo:

abstract class A { 
    public function test1() { 
     echo 'Hello World'; 
    } 
    abstract protected function f1(); 
    abstract public function f2(); 
    protected function test2(){ 
     echo 'Hello World test'; 
    } 
} 

class B extends A { 
    public $a = 'India'; 
    public function f1() { 
     echo "F1 Method Call"; 
    } 
    public function f2() { 
     echo "F2 Method Call"; 
    } 
} 

$b = new B(); 
echo $b->test1() . "<br/>"; 
echo $b->a . "<br/>"; 
echo $b->test2() . "<br/>"; 
echo $b->f1() . "<br/>"; 
echo $b->f2() . "<br/>"; 

de salida:

Hello World 
India 
Hello World test 
F1 Method Call 
F2 Method Call 
+0

no se puede llamar al método padre protegido por el objeto clase infantil, puede llamar al método clase infantil por este objeto echo $ b-> test2(). "
"; –

Cuestiones relacionadas