2011-07-27 6 views
6

Estoy tratando de hacer algo que pensé que sería bastante simple, pero como soy relativamente nuevo en OOP en PHP, estoy teniendo algunos problemas.Cambie el valor de una variable protegida para la clase secundaria

Aquí está mi código:

<?php 
class MyClass 
{ 
    protected $variable = 'DEFAULT'; 

    function __construct($newVariable) 
    { 
     $this->variable = $newVariable; 
     echo $this->variable; 
    } 
} 
class OtherClass extends MyClass 
{ 
    function __construct() 
    { 
     echo $this->variable; 
    } 
} 

$foo = new MyClass('MODIFIED'); // Output : MODIFIED 
$bar = new OtherClass(); // Output : DEFAULT 
?> 

busqué un montón de diferentes hilos y sitios web, pero no han encontrado cómo podría pasar el valor de $ redefinido variable a la clase hija. ¿Alguien puede guiarme a través de él? Si hay una manera.

Gracias de antemano.

EDITAR Aclarar lo que está sucediendo realmente en el guión que estoy teniendo este problema: tengo una clase que crea un formulario, y en esa clase hay varias variables que dicen las funciones en lo que Environnement somos: si es una forma multilenguaje o no, si quiero una forma simple o una estructurada, parámetros como ese. Y algunas de estas variables de entorno se modifican mediante la ejecución de la clase, por sus funciones.

Ahora, debido a las necesidades de mi página, tengo una clase infantil dedicada a crear campos "seleccionar". Hereda la función central de la clase principal para crear campos y tal, pero la clase hija toma varios parámetros más. La cosa es que, me gustaría que la clase seleccionada herede los parámetros de entorno de la clase principal, en el estado en que se encuentran.

Mientras escribo esto me doy cuenta de que la forma en que lo abordo puede no ser la manera correcta de hacerlo, porque cuando miro mi código creo que podría haber otra manera de hacerlo. En mi código tengo dos objetos donde necesitaría que sea solo uno, pero realmente no sé cómo lo pondré en realidad.

+1

No está redefiniendo la variable, sólo estás de colocarlo en la constructora padres. Llámalo como si tuvieras lo que necesitas. – hakre

+0

OOP aquí es solo una herencia de funciones y sus variables predeterminadas. No está uniendo mágicamente dos objetos. Tristemente. –

Respuesta

2

No está redefiniendo la variable, solo la está configurando en el constructor de los padres. Llámalo y tienes lo que necesita (ver el comentario en el código, que es sólo una línea):

<?php 
class MyClass 
{ 
    protected $variable = 'DEFAULT'; 

    function __construct($newVariable) 
    { 
     $this->variable = $newVariable; 
     echo $this->variable; 
    } 
} 
class OtherClass extends MyClass 
{ 
    function __construct() 
    { 
     parent::__construct(); # <<--- do this 
     echo $this->variable; 
    } 
} 

$foo = new MyClass('MODIFIED'); // Output : MODIFIED 
$bar = new OtherClass(); // Output : MODIFIED 
?> 

Incluso si usted tiene dos clases de definición, la instancia concreta siempre será de una clase. Esa clase puede heredar de una clase principal, pero si anula los métodos (como lo hizo con el constructor), el método de clase de padres no se llamará porque se ha anulado. Sin embargo, con la palabra clave parent puede acceder al método de un padre desde dentro del niño.

+0

Bueno, el problema es que lo que me interesa aquí es el valor 'MODIFICADO'. Si vuelvo a llamar al padre :: _ construct tendré que especificar $ newVariable. Y así sea lo que sea que ponga, no será el valor que primero se transfirió a MyClass. En general, tienen un montón de variables que necesito para pasar a la clase infantil, las variables que a veces han sido modificados por funciones internas de MiClase, pero estoy empezando a preguntarse si es realmente posible. –

+0

@Maxime: Eso es solo herencia. El miembro principal y el secundario pueden acceder al miembro protegido, pero siempre es la misma variable, por lo tanto, independientemente de si el código hijo o principal lo cambia, ambos acceden siempre a la misma variable. Debes decir más acerca de lo que realmente quieres lograr porque lo que has comentado no puedo ver en tu pregunta. Hay muchas maneras de lidiar con la herencia, así que mejor diga lo que le gustaría lograr. Redefinir como lo acuñó no tiene lugar. – hakre

+0

Aquí, agregué el contexto a la publicación principal, pero todas esas respuestas indicaron que probablemente solo tomé un enfoque equivocado de lo que quiero hacer. –

1

El constructor de MyClass se reemplaza en OtherClass. El constructor padre hace no ejecutar implícitamente automáticamente. Si también desea ejecutar el constructor principal, llame al parent::__construct() en OtherClass::__construct.

Usted, por supuesto, tienen un problema aquí, ya que MyClass::__construct espera un parámetro mientras OtherClass::__construct no tiene uno. Poniéndolo así, ¿cómo esperabas que cambiara el valor ...?

0

es necesario agregar una llamada a parent en la clase hija:

function __construct() 
{ 
    parent::__construct(); 
    echo $this->variable; 
} 

Usted puede hacer eso con cualquier función:

function doSomethingAWESOME() 
{ 
    parent::doSomethingAWESOME(); 
    echo "I think that was awesome"; 
} 

Y, básicamente, las cifras de los estados a "Usted sabe ¿Todo lo que ibas a hacer en la clase de padres antes de que lo anulara? Sí, haz eso aquí ".

También cool:

function doSomethingAWESOME() 
{ 
    echo "NEVER!!!"; 
} 

function parentSomethingAwesome() 
{ 
    // calls the parent class's definition of some doSomethingAWESOME 
    parent::doSomethingAWESOME(); 
} 
1

La clase niño sólo hereda métodos y predeterminado variables. No hereda las propiedades de la clase raíz si se inicia una nueva instancia, porque $foo y $bar son dos diferentes objetos.

Tendrá que hacer $bar = new OtherClass("MODIFIED"); y luego, agregar parent::__construct($newVariable) a la segunda __construct, también. (y el parámetro respectivo)

Básicamente, no puede esperar que una nueva instancia (que sea paralela a $ foo one) herede "mágicamente" una modificación del $ foo original. Tienes que encontrar una manera de pasarlo (por lo tanto, llamar al constructor padre).

0

Lo que quiere hacer no es posible tal y como son: $ foo y $ bar son instancias de clases para que no haya vínculos entre ellos.

Para usar la analogía de la construcción, sus dos clases son como la construcción de planes: el plan de una casa, y el plan de una casa con un garaje. Lo que estamos tratando de hacer es como construir una casa (instancia de una clase), poner algún tipo de cama en ella (establecer algunas variables) y cuando se genera otra casa con un garaje desea que la misma cama en ella. No va a pasar.

Cuestiones relacionadas