2010-03-21 20 views
9

¿Es abstract function xxx?¿Cuál es el equivalente de las funciones virtuales de C++ en PHP?

Acabo de hacer una prueba que parece indicar que un método privado también es virtual?

class a { 
private function test() 
{ 
    echo 1; 
} 
} 

class b extends a { 
private function test() 
{ 
    echo 2; 
} 
public function call() 
{ 
    $this->test(); 
} 
} 

$instance = new b; 
$instance->call(); 

La salida es 2

Respuesta

18

En PHP todas las funciones privadas ninguno son virtuales así que no hay necesidad de declarar explícitamente como virtual.

Declarar una función de miembro como abstract simplemente significa que la clase base no puede proporcionar una implementación, pero todas las clases derivadas deberían. Definir el método abstracto es lo mismo que hacer lo siguiente en C++

virtual void foo() = 0; 

que simplemente significa que las clases derivadas deben aplicar foo();

EDITAR: cuanto a la pregunta editado

b::call() no puede acceder a::test(). Por esta razón, al llamar a funciones privadas, solo se llamará al de la clase desde la que se llamó.

EDITAR: En cuanto al comentario:

(De Wikipieda)

En la programación orientada a objetos, una función virtual o método virtual es una función o un método cuyo comportamiento puede ser anulado dentro de una clase heredada por una función con la misma firma.

Debido a la idea de declarar explícitamente lo que paga en C++, debe declarar las funciones como virtuales para permitir que las clases derivadas anulen una función.

class Foo{ 
public: 
    void baz(){ 
     std::cout << "Foo"; 
    } 
}; 
class Bar : public Foo{ 
public: 
    void baz(){ 
     std::cout << "Bar"; 
    } 
}; 

int main(){ 
    Foo* f = new Bar(); 
    f->baz(); //baz is not virtual in Foo, so the output is Foo 
} 

Cambio Baz a ser virtual

class Foo{ 
public: 
    virtual void baz(){ 
     std::cout << "Foo"; 
    } 
}; 
//Same Bar declaration 

int main(){ 
    Foo* f = new Bar(); 
    f->baz(); //baz is virtual in Foo, so the output is Bar as it will call the derived function 
} 

Nota, si la variable f en el ejemplo anterior fue de tipo Bar* o Bar no importaría si Foo::baz() era virtual o no como el tipo previsto es conocido (El programador lo suministró explícitamente)

+0

Gracias por la demo, entiendo lo que significa virtuales pueden now.But también lo pruebas con PHP?Porque parece que en PHP es imposible convertir un objeto a la clase base, en otras palabras, no existe un concepto como virtual en PHP. – user198729

+2

No existe el concepto virtual en php. O al revés, todos los métodos son virtuales ya que la implementación real se busca en el tiempo de ejecución. – VolkerK

+0

Creo que es mejor pensar que no hay un concepto virtual en PHP, ya que es imposible hacerlo en este lenguaje: 'Foo * f = new Bar();' – user198729

4

El ejemplo no muestra un patrón de especialización típico donde b no necesita conocer los detalles de implementación de call() pero puede especificar ify cómo se debe hacer test(). Y devuelve 1 desafortunadamente. Sin embargo, al declarar la función protegida en lugar de privada, funcionará como se espera.

class a { 
    protected function test() 
    { 
     echo 1; 
    } 
    public function call() { 
     $this->test(); 
    } 
} 

class b extends a { 
    protected function test() 
    { 
     echo 2; 
    } 
} 

$instance = new b(); 
$instance->call(); 
1

el uso de palabras clave estática (PHP 5.4) no $ this-> metanfetamina() pero estática :: metanfetamina()

Cuestiones relacionadas