Pues definitivamente te gusta hacer las cosas mal, no tenías la necesidad de rebuscar una solución que además es frágil.
Mira, acabo de corregir tu código usando el mismo concepto que te expliqué anteriormente:
Código PHP:
Ver original<?php
class Ciudad {
public $nombre; //Nombre de la ciudad (Madrid, Barcelona, ...)
public $habitantes=15000; //Codigo postal ciudad
public $edificio1; //Edificio1 de la ciudad
public function __construct($nombreCity){
$this->nombre=$nombreCity; //Guardo nombre ciudad
$this->edificio1= new Edificio1($this); //Instancio obj hijo Edificio1 pasando nombre obj padre
// ¿por qué pasar el nombre y no la instancia en su lugar? ¿no te parece absolutamente fuera de sentido?
}
public function showhabitantes(){
echo 'Número de habitantes: '.$this->habitantes;
}
}
class Edificio1 {
public $parent;
public function __construct($parent){
$this->parent=$parent;
}
public function ciudad(){
echo 'Pertenezco a la ciudad: '.$this->parent->nombre;
}
public function cambiarHabitantes($newHabitantes){
$this->parent->habitantes=$newHabitantes;
}
}
$ciudad1= new Ciudad('Madrid');
$ciudad1->edificio1->ciudad();
echo '</br>';
$ciudad1->showHabitantes();
$ciudad1->edificio1->cambiarHabitantes(17000);
echo '</br>';
$ciudad1->showHabitantes();
?>
Funciona exactamente igual que lo que hiciste tu pero sin la fragilidad de las variables globales ¿cómo se te ocurrió tan mala solución?
Además incluso ahorré bytes de código, no había razón para usar globales ni nada de estilo, con el sólo paso de referencias era suficiente.
Al final en tu solución terminabas pasando el "nombre de la variable global" con el objetivo de poder acceder a ella posteriormente, dentro de la instancia "edificio1" sin embargo es absolutamente innecesario.
¿Que no es más fácil pasar la referencia del objeto que solo el nombre si al final terminas accediendo a la instancia?
Por favor consulta una referencia de OOP.