2011-10-29 14 views
22

El siguiente código tendrá PHP infeliz que customMethod() sea privado. ¿Por qué es este el caso? ¿La visibilidad está determinada por dónde se declara algo en lugar de definirse?Funciones privadas abstractas

Si quisiera hacer CustomMethod solo visible para el código repetitivo en la clase de Plantilla y evitar que se invalide, ¿lo haría de forma alternativa protegido y final?

template.php:

abstract class Template() { 
    abstract private function customMethod(); 

    public function commonMethod() { 
     $this->customMethod(); 
    } 
} 

CustomA.php:

class CustomA extends Template { 
    private function customMethod() { 
     blah... 
    } 
} 

main.php

... 
$object = new CustomA(); 
$object->commonMethod(); 
.. 

Respuesta

41

Los métodos abstractos no pueden ser privados, porque por definición deben ser implementados por una clase derivada. Si no desea que sea public, debe ser protected, lo que significa que puede ser visto por clases derivadas, pero nadie más.

The PHP manual on abstract classes le muestra ejemplos de cómo usar protected de esta manera.

+9

Esto difiere de cómo C++ (y creo que Java) se comporta. C++ permite que las funciones virtuales puras (su equivalente a funciones abstractas) sean privadas. Esto es bueno porque permite que la clase derivada especifique y controle QUÉ hacer, al tiempo que impone que solo la clase base pueda elegir CUÁNDO hacerlo. Las funciones abstractas protegidas no pueden ofrecerle la misma garantía ya que la clase derivada puede crear libremente una función pública que llame a la implementación protegida y rompa la encapsulación. – Aaron

+0

Solución alternativa: puede agregar la palabra clave 'final' a la función protegida en la definición de clase abstracta (es decir,' función protegida final my_function() '). Esto evitará que las clases secundarias anulen la función, aunque la clase hija puede llamar a la función por sí misma (algo que no puede suceder con la función privada de un padre). Si esto derrota el propósito de definir una clase abstracta es una discusión filosófica para otro día. (Alternativamente, podría definir una nueva clase que amplíe la clase abstracta y defina la función de forma privada allí). – Slicktrick

1

del método abstracto son públicos o protegidos. Es un requisito.

Cuestiones relacionadas