Pregunta ¿Cómo uso las clases internas en PHP?


Soy de origen Java y quiero usar una clase interna en php. Sin embargo, cada vez que pongo la clase interna, obtengo un error de sintaxis. ¿Es esto posible con PHP? Además, ¿cómo hago referencia a la clase externa? ¿Tengo acceso a TODOS sus miembros de datos?

<?php

class OuterClass {
    var $x = 15;
    function __construct() {

    }

    class InnerClass {                  // error when InnerClass is static
        function __construct() {        // error when InnerClass is static
            echo $x;
        }
    }
}

?>

Esto se usa para un MoveClass (como hacer un movimiento) de un juego de cartas específico. Creo que sería un buen diseño armar estas clases porque no tienen sentido aparte. Además, MoveClass necesita saber sobre algunos miembros de datos de la clase Game. ¿Por qué no hacerlo funcionar? Es simplemente demasiado grande.

Editar:

¿Qué pasa con las clases anidadas? Por lo que entiendo, ¿esos deben ser estáticos? O_o


32
2017-12-04 03:32


origen


Respuestas:


PHP no permite clases internas. Si desea acceder a todos los miembros de datos de la clase principal, le sugiero que emplee la herencia.

Una posible alternativa:

class OuterClass {
    var $x = 15;
    function __construct() {

    }
}
class ChildClass extends OuterClass {
    function __construct() {
        parent::__construct();
    }
}

Puede invocar un método de la clase principal consultando la clase en sí; En PHP puedes hacer esto con el parent palabra clave. Entonces, para referirnos a un método en el contexto de una clase en lugar de un objeto que usamos :: Opuesto a ->.


20
2017-12-04 03:41



en PHP 5.4 o posterior, puede usar Rasgos de PHP que están diseñados más para herencia múltiple, pero pueden adaptarse a sus necesidades. De la documentación de PHP:

Un Rasgo es similar a una clase, pero solo está destinado a agruparse   funcionalidad en una forma fina y consistente. No es posible   para crear una instancia de un Rasgo por sí mismo. Es una adición a la tradición   herencia y permite la composición horizontal del comportamiento; es decir,   la aplicación de miembros de la clase sin requerir herencia.

http://php.net/manual/en/language.oop5.traits.php


5
2018-05-31 16:42



Como se menciona en los comentarios a esta respuesta de otra pregunta, la versión PHP de esta funcionalidad se ha agregado en PHP 7. Parece que no proporciona exactamente lo que estás pidiendo. Sin embargo, debe proporcionarle un patrón de diseño similar.

Aquí está el RFC que describe cómo funciona: https://wiki.php.net/rfc/anonymous_classes 

Como se menciona en los comentarios de la otra respuesta, busque en la página RFC "anidado" para ver un ejemplo de anidación dentro de una clase externa.


2
2017-08-25 00:24



Es posible que desee utilizar un stdClass en su lugar. Aquí hay una pregunta ASÍ: ¿Qué es stdClass en PHP?


1
2017-12-04 04:50



No puedes anidar clases como esa.

Mira la sección "extiende" de el manual.


0
2017-12-04 03:35