Во-первых, вы должны различать статические и переменные экземпляра. Статические переменные являются общими для всех экземпляров класса, переменные экземпляров - нет.
Если вы хотите, чтобы у каждого экземпляра Foo и Bar был один и тот же экземпляр SomethingElse-Instance, вы должны сделать $ кое-что статичным:
общедоступная статическая $ someelse
и вам следует изменить композиционную функцию Foo:
function composition() {
self::$somethingelse = new SomethingElse();
}
Для доступа к этому статическому полю вы можете сделать следующее:
$ foo = new Foo (); // Я Фу
$ Foo-> композиция (); // я другой класс
Foo: $ somethingelse-> тест (); // Я метод в классе SomethingElse
$ bar = new Bar (); // Я Бар, мой родитель Foo
Bar :: $ somethingelse-> тест (); // Я метод в классе SomethingElse
Если вы хотите, чтобы у каждого экземпляра Foo и Bar был свой экземпляр SomethingElse, вы можете использовать свой код, но вам нужно добавить
$ бар-> композиция ()
перед $ bar-> somethingelse-> test ();
Это потому, что с
$ bar = new Bar ();
вы создали совершенно новый экземпляр Bar, и этот экземпляр имеет свойство $thingelse, но оно еще не установлено. Поэтому вам нужно вызвать состав (), чтобы установить его.
Если у каждого Foo и Bar должен быть один и тот же экземпляр SomethingElse, вам следует вместо этого использовать статическую версию, поскольку она уменьшает необходимую память.
Надеюсь, это поможет вам. В противном случае я очень рад объяснить это дальше.