Pregunta

Estoy tratando de obtener el siguiente para el trabajo, pero estoy en una pérdida ...

class Foo {
    public $somethingelse;

    function __construct() {
        echo 'I am Foo';
    }
    function composition() {
        $this->somethingelse =& new SomethingElse();
    }
}
class Bar extends Foo {
    function __construct() {
        echo 'I am Bar, my parent is Foo';
    }
}
class SomethingElse {
    function __construct() {
        echo 'I am some other class';
    }
    function test() {
        echo 'I am a method in the SomethingElse class';
    }
}

Lo que me gustaría hacer es crear una instancia de la clase somethingelse dentro de la clase Foo. Esto funciona mediante =&. Pero cuando extiendo clase Foo con la clase de bar, pensé que el niño hereda todos los atributos y métodos de datos de la clase padre. Sin embargo, parece que $this->somethingelse no funciona en la clase hija de barras:

$foo = new Foo(); // I am Foo
$foo->composition(); // I am some other class
$foo->somethingelse->test(); // I am a method in the SomethingElse class

$bar = new Bar(); // I am Bar, my parent is Foo
$bar->somethingelse->test(); // Fatal error: Call to a member function test() on a non-object

Por lo tanto, no es posible heredar de tal manera? Y debería crear una nueva instancia de la clase somethingelse desde dentro de la clase bar si quiero utilizarlo allí? O me estoy perdiendo algo?

Gracias de antemano por su ayuda.

¿Fue útil?

Solución

  

pensé que el niño hereda todos los atributos de datos y métodos de la clase padre.

Esto es cierto - la clase hija hereda las variables estáticas y métodos estáticos de la clase padre. Además, cualquier objetos secundarios heredarán las variables y métodos estáticos y de instancia.

Una posibilidad para conseguir lo que quiera con su estructura de clases existente es la siguiente:

$bar = new Bar();
$bar->composition();// here you are calling the parent method, sets instance var $somethineelse
$bar->somethingelse->test();// now you can call methods

Otra manera de lograr heredar una variable (en este caso un objeto) en los casos niño sería de esta manera:

class Foo {
    protected $somethingelse;
    public function __construct() {
        $this->somethingelse = new SomethingElse();
    }
}

class Bar extends Foo {
    public function __construct() {
        parent::__construct();
        // now i've got $somethingelse
    }
 }

Para obtener una muy buena visión de conjunto de clases y objetos en PHP 5, echar un vistazo aquí: http://php.net/manual/en/language.oop5.php Asegúrese de leer todo esto, los tiempos tal vez un par de si OO es nuevo para usted.

Otros consejos

bar tiene una variable miembro llamada somethingelse, que se hereda de foo.

usted está mezclando objeto y alcance de clase.

si realmente quiere lograr el efecto descrito, usted tiene que hacer su variable estática, por lo que su contexto se basa la clase

En primer lugar, hay que distinguir entre las variables estáticas y de instancia. Las variables estáticas son compartidos entre todas las instancias de una clase, variables de instancia no lo son.

Si quieres todas las instancias de Foo y Bar tener exactamente el mismo somethingelse-Instancia que tiene que hacer $ somethingelse estática:

$ somethingelse pública estática

y se debe cambiar la composición de la función Foo:

function composition() {
    self::$somethingelse = new SomethingElse();
}

Para acceder a este campo estático se puede hacer lo siguiente: $ Foo = new Foo (); // Estoy Foo $ Foo> composición (); // Estoy alguna otra clase Foo: $ somethingelse-> test (); // Soy un método en la clase somethingelse

$ bar = nueva barra (); // Estoy Bar, mi padre es Foo Bar :: $ somethingelse-> test (); // Soy un método en la clase somethingelse

Si quieres todas las instancias de Foo y Bar tiene su propia instancia somethingelse puede utilizar su código, pero hay que añadir

$ bar-> composición ()

Antes de $ bar-> somethingelse-> test ();

Esto se debe a

$ bar = nueva barra ();

Ha creado una nueva instancia de bar y esa instancia tiene una propiedad de $ somethingelse, pero no se ha establecido aún. Así que hay que llamar a la composición () para configurarlo.

Si todos los Foo y bar deben tener exactamente el mismo somethingelse instancia, debe utilizar la versión estática en su lugar, ya que reduce la memoria necesaria.

Espero que esto puede ayudar. De lo contrario me siento muy feliz de explicar más a fondo.

Al decir que clases de atributos compartir no significa que los objetos comparten valores de atributo .

Como otros han señalado, son confusas clases con instancias.

Nota, se obtendría el mismo error si lo hizo:

$foo = new Foo(); // I am Foo
$foo->composition(); // I am some other class
$foo->somethingelse->test(); // I am a method in the SomethingElse class

$foo2 = new Foo(); // I another Foo
$foo2->somethingelse->test(); // Fatal error: Call to a member function test() on a non-object

Piense en las clases menos abstracta. Por ejemplo, es posible que tenga una clase, "Persona", que es una clase padre de "libre".

A continuación, si lo hizo:

$ Me = new Persona ();    $ Mí-> Nombre = "Thomas"

$ princeCharles = new libre ();

Usted no quiere $ princeCharles tener la primerNombre un atributo igual a "Thomas," y si desea establecer $ princeCharles-> primerNombre, no hacer eso para cambiar el valor del atributo primerNombre de $ mí .

Tanto mi $ y $ princeCharles tienen un atributo 'primerNombre', pero que no comparten la valor de ese atributo.

Creo que su problema será resuelto si en el constructor de la clase derivada llamará al constructor de la clase padre. Esto no ocurre por defecto en PHP por lo que tenerlo en cuenta cuando se tiene problemas con la herencia de los miembros de datos.

clase de barra se extiende Foo {     __construct función pública () {         parent :: __ construct ();

}

}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top