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() {
}
}