PHP: clases anidadas

Me preguntaba si había una manera de llamar a clases desde dentro de una clase. Como a continuación, por ejemplo:

$class->subclass->func(); 

Cualquier ayuda sería muy apreciada.

Dale un vistazo: ¿Cómo hacer una clase anidada PHP o métodos nesteds?

Primero, corrijamos tu terminología. Parece que estás preguntando por objetos, no por clases.

Puede asignar un objeto a una propiedad de otro objeto, pero esto está completamente separado de la herencia.

Entonces lo que escribiste está mejor escrito:

 $object->memberObject->methodOfMemberObject(); 

Si objectObject y memberObject están relacionados por herencia es completamente irrelevante.

Desafortunadamente no es posible:

 clase Oele {
   function bla () {
     // hacer cosas aquí

     clase Tiny {// error de syntax
       nombre público $;
       público $ edad;
       público $ etc;
       function __construct ($ name, $ age, $ etc) {
         $ this-> name = $ name;
         // y así
       }
       función calculateSomething () {
         // devolver algo útil
       }
     }

     $ something = array (
       nuevo Tiny ('bla', 25, nulo),
       nuevo Tiny ('oele', 24, nulo),
       nuevo Tiny ('adoeuf', 41, nulo)
     );
   }
 }

Sin embargo, es posible definir funciones dentro de los métodos de clase:

 clase Oele {
   function bla () {
     $ data = ...
     function doSomething ($ obj) {
       return $ obj-> algo * $ obj-> cosa;
     }
     $ data2 = array_map ('doSomething', $ data);
   }
 }

Una subclase es solo una clase normal, por lo que la llamas de la manera en que llamas a algo:

  $subclass = new SubClass(); 

En cuanto a tu código de ejemplo:

  $class->subclass->func(); 

Lo que me parece es que tiene un objeto de algún tipo, que tiene una propiedad pública llamada “$ subclass” que contiene otro objeto (presumiblemente de otro tipo). Esa propiedad de clase tiene un método público llamado func() que está llamando.

Necesitamos tener claro su significado aquí, porque podría estar confundido. La palabra “subclase” tiene un significado específico: significa que ha definido una clase y desea usarla como plantilla para crear una clase similar con más funcionalidades.

Por ejemplo, supongamos que tiene una clase principal llamada ParentClass, que se ve así:

 class ParentClass { public function sayHello() { echo "Hello!"; } } 

Digamos que querías otra clase que haga todo lo que hace ParentClass, pero también dice Adiós. Puede crear una clase ChildClass “extendiendo” (es decir, heredando de) ParentClass:

 class ChildClass extends ParentClass { public function sayGoodbye() { echo "Goodbye!"; } } 

Debido a que hereda de ParentClass, obtiene “todo” (hay restricciones, pero ignórelas por el momento) de ParentClass y también implementa todo lo que se define como parte de ChildClass. Así que ChildClass termina luciendo así:

 child ChildClass { public function sayHello() { echo "Hello!"; } public function sayGoodbye() { echo "Goodbye!"; } } 

Ahora, esto podría ser lo que quiere decir con “subclase” en su código, pero fácilmente podría estar hablando de una propiedad.

Una propiedad es solo una variable almacenada como parte de una clase en particular. No tiene que ser un objeto (es decir, una instancia de una clase particular). Es simplemente una variable normal, pero definida para usar con o dentro de un objeto de un tipo particular.