2011-09-19 8 views
12

necesito una clase padre para tener acceso a sus propiedades secundarias:Acceso propiedad secundaria del ámbito padre

class Parent { 
    private $_fields = null; 

    public function do_something() { 
    // Access $_fields and $child_var here 
    } 
} 

class Child extends Parent { 
    private $child_var = 'hello'; 
} 

$child = new Child(); 
$child->do_something(); 

Cuando $_fields se modifica desde el ámbito secundario, sigue siendo null en el ámbito padre. Al intentar acceder a $ child_var desde el alcance principal utilizando $this->child_var, por supuesto no está definido.

No he encontrado nada parecido a un "conjunto de funciones" que simplemente se copia en la clase hija ...

+4

Es posible que desee hacer 'propiedades protected' en lugar de' private'. –

Respuesta

9

Tome un vistazo a un artículo sobre visibility.

Básicamente, no se puede acceder a las propiedades/métodos del padre private ni el padre puede acceder a su hijo. Sin embargo, puede declarar su propiedad/método protected en su lugar.

class Parent { 
    protected $_fields = null; 

    public function do_something() { 
     // Access $_fields and $child_var here 
    } 
} 

class Child extends Parent { 
    protected $child_var = 'hello'; 
} 

$child = new Child(); 
$child->do_something(); 
+0

¡Gracias! Eso era exactamente lo que estaba buscando. Parece que no leí esa documentación lo suficiente. –

6

Intentar acceder a valores secundarios desde la clase base (principal) es un mal diseño. ¿Qué sucede si en el futuro alguien crea otra clase basada en su clase principal, olvide crear esa propiedad específica a la que está intentando acceder en su clase principal?

Si necesita hacer algo como eso se debe crear la propiedad en una clase padre y, a continuación, establecer en los niños:

class Parent 
{ 
    protected $child_var; 

    private $_fields = null;  
    public function do_something() 
    {  
     // Access $_fields and $child_var here 
     //access it as $this->child_var 
    } 
} 
class Child extends Parent 
{ 
    $child_var = 'hello'; 
} 

$child = new Child(); 
$child->do_something(); 

Básicamente en los padres no se debe hacer referencia a un contenido específico en los niños, porque no puedo estar seguro de que estará allí!

Si es necesario, se debe utilizar la abstracción:

PHP Abstraction

+0

Bueno, sé que es una mala práctica, pero es un caso muy específico que realmente lo requiere. Gracias por su respuesta de todos modos. –

+0

Entiendo el problema, pero esta solución todavía me parece arriesgada. ¿Cómo podemos hacer cumplir la clase de niños para definir una determinada propiedad? Tengo una función concreta en la clase principal abstracta que requiere cierta propiedad. En este momento estoy usando $ this-> childProperty en la clase principal y se ejecuta, pero el mismo problema que ha resaltado. –

+0

Puede hacer que el resumen '$ child_var'. esto obligaría a los niños a implementarlo realmente. –

Cuestiones relacionadas