Lamentablemente no puedo hacerlo con tu método porque si tengo muchos edificios, y muchas ciudades, tendría que duplicar decenas de veces el mismo objeto, y aun así no podría cambiar ninguna propiedad del objeto padre desde alguna función de los objetos hijos. No obstante leyendo tu solución se me ocurrió una que si que he conseguido que funcione, quizás no sea demasiado bonita y un pelín enrevesada, pero consigo todo lo que necesito hacer.
Le paso el nombre del objeto padre al objeto hijo cuando lo creo, y después si dentro del objeto hijo declaro la variable del objeto padre como global puedo acceder a ella desde "fuera" pero desde el objeto hijo, es decir, puedo acceder a las propiedades y métodos públicos del padre desde dentro del hijo.
Aquí está el código nuevo funcionando, como se puede ver soy capaz de acceder a las propiedades del objeto ciudad1 (nombre y habitantes) desde el objeto hijo edificio1, y cambiarlas (cambio el número de habitantes de la ciudad1 con $ciudad1->edificio1->cambiarHabitantes(17000) )
Código PHP:
<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
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,$nombreVar){
$this->nombre=$nombreCity; //Guardo nombre ciudad
$this->edificio1= new Edificio1($nombreVar); //Instancio obj hijo Edificio1 pasando nombre obj padre
}
public function showhabitantes(){
echo 'Número de habitantes: '.$this->habitantes;
}
}
class Edificio1 {
public $parent;
public function __construct($parent){
$this->parent=$parent;
}
public function ciudad(){
global ${$this->parent};
echo 'Pertenezco a la ciudad: '.${$this->parent}->nombre;
}
public function cambiarHabitantes($newHabitantes){
global ${$this->parent};
${$this->parent}->habitantes=$newHabitantes;
}
}
$ciudad1= new Ciudad('Madrid','ciudad1');
$ciudad1->edificio1->ciudad();
echo '</br>';
$ciudad1->showHabitantes();
$ciudad1->edificio1->cambiarHabitantes(17000);
echo '</br>';
$ciudad1->showHabitantes();
?>
Muchisimas gracias por tu ayuda, sin ti no habria dado con la solución.