usan qué que predefinidas parametros para otro llamar las funciones funcion ejemplos desde php inheritance abstraction

php - qué - Resumen funciones privadas



para que se usan las funciones en php (4)

El siguiente código tendrá a PHP descontento de que customMethod () es privado. ¿Por qué es este el caso? ¿La visibilidad está determinada por donde se declara algo en lugar de definirse?

Si quisiera que customMethod solo sea visible para el código de la plantilla en la clase de plantilla y evitar que se anule, ¿lo haría como alternativa protegido y definitivo?

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(); ..


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

El manual de PHP sobre clases abstractas le muestra ejemplos de uso protected de esta manera.


Los métodos abstractos son públicos o protegidos. Es un requisito.


Nada en PHP que sea privado en una clase secundaria es visible para una clase primaria. Nada que sea privado en una clase padre es visible para una clase hija.

Recuerde, la visibilidad debe fluir entre la clase secundaria hasta la clase principal cuando se usan métodos abstractos en PHP. El uso de la visibilidad private en este escenario con PHP encapsularía completamente CustomA::customMethod dentro de CustomA . Tus únicas opciones son visibilidad public o protected .

Como no puede crear una instancia de la Template clase abstracta, se mantiene la privacidad del código de cliente. Si usa la palabra clave final para evitar que las clases futuras CustomA , tiene una solución. Sin embargo, si debe extender CustomA , tendrá que vivir con cómo funciona PHP por el momento.


Si teme que se customMethod a customMethod fuera de la clase CustomA , puede hacer que la clase CustomA final .

abstract class Template{ abstract protected function customMethod(); public function commonMethod() { $this->customMethod(); } } final class CustomA extends Template { protected function customMethod() { } }