2010-12-04 28 views
32

Soy de un fondo 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?¿Cómo uso las clases internas en PHP?

<?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 utiliza para un MoveClass (como en hacer un movimiento) de un juego de tarjeta 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.

Edit:

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

Respuesta

20

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 envoke un método de formar la clase padre, haciendo referencia a la clase misma; En PHP puede hacer esto con la palabra clave parent. Entonces, para referirnos a un método en el contexto de una clase en lugar de un objeto, usamos :: en contraposición a ->.

+6

Veo ... pero la herencia no tiene sentido para lo que estoy haciendo, realmente no seguiría la regla "es una". Podría pasar los miembros necesarios o la clase externa o mantener una referencia a la clase externa. ¡Gracias por la respuesta! – Lindz

5

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

un rasgo es similar a una clase, pero sólo la intención de funcionalidad de grupo de una forma de grano fino y consistente. No es posible crear una instancia de un rasgo por sí mismo. Es una adición a la herencia tradicional y permite la composición horizontal del comportamiento; es decir, la aplicación de los miembros de la clase sin requerir herencia.

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

2

Como se mencionó en los comentarios a this answer de another question, la versión de PHP de esta funcionalidad se ha añadido en PHP 7. No parece proporcionar exactamente lo que está 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 mencionó en los comentarios de la otra respuesta, buscar en la página de RFC para "anidado" para ver un ejemplo de anidar dentro de una clase externa.

+0

Lamentablemente, parece que no puede usar clases anónimas como un valor al igual que las funciones anónimas. Solo puedes usarlo para crear instancias de objetos. –

Cuestiones relacionadas