Jestem w stanie tylko pomóc w zakresie punktu nr 5.
Polecam przeczytanie tego artykułu:
Object Oriented php - jeśli tylko znasz angielski
To co napiszę, będzie tłumaczeniem jednego z akapitów tego artykułu.
Asocjacja jest poprostu powiązaniem dwóch klas. A agregacja jest typem asocjacji więc chyba chodziło Ci o porównanie dwóch typów asocjacji: agregacji i kompozycji.
Mamy klasę A i klasę B. Jeśli klasa A korzysta z metod klasy B to już mamy asocjację. Jeśli klasa B nie wie nic o klasie A, czyli nie korzysta z jej metod a tylko daje się wykorzystywać przez klasę A to mamy do czynienia z asocjacją jednokierunkową. Klasa A jest świadoma istnienia klasy B i korzysta z jej metod. Jeśli zarówno klasa A korzysta z metod klasy B i klasa B korzysta z metod klasy A (czyli klasa B jest świadoma istnienia klasy A) - to asocjacja jest obustronna.
Generalnie należy dążyć do minimalizowania asocjacji obustronnych. W OOP ważne jest kapsułkowanie/hermetyzacja obiektów, więc chodzi o to żeby dana klasa skupiała się tylko na swoich zadaniach i wiedziała o otaczającym świecie tylko tyle ile musi, dzięki takiemu podejściu łatwo jest potem dany element zmienić, wymienić czy cokolwiek innego

- a o to w globalnym kontekście właśnie chodzi
Ale się rozpisałem, no ale to nie wszystko.
Agregacja - występuje wtedy, gdy klasa A zawiera w sobie i korzysta z metod klasy B. Jeśli obiekt klasy A przestaje istnieć nie oznacza to końca istnienia klasy B. Jako przykład w kodzie php:
[php:1:437971f28a]
<?php
// klasa dostepu do bazy danych
$objDatabase = new DatabaseLayer();
// jakiś inny obiekt
$objCar = new Car($objDatabase);
// tutaj coś się dzieje w obiekcie $objCar
// niszczymy obiekt
unset($objCar);
// obiekt $objDatabase nadal istnieje i można go używać
?>
[/php:1:437971f28a]
Kompozycja - występuje wtedy, gdy klasa A zawiera w sobie i korzysta z metod klasy B. Jeśli obiekt klasy A przestaje istnieć oznacza to koniec istnienia klasy B. Klasa A jest odpowiedzialna za stworzenie i zniszczenie obiektu klasy B. Jako przykład w kodzie php:
[php:1:437971f28a]
<?php
// konstruktor klasy Car tworzy i przypisuje do wlasciwosci $engine obiekt klasy Engine
$objCar = new Car();
// tutaj coś się dzieje w obiekcie $objCar
// niszczymy obiekt
// destruktor obiektu Car niszczy najpierw obiekt klasy Engine
unset($objCar);
?>
[/php:1:437971f28a]
W przypadku kompozycji widać, że samodzielny obiekt klasy Engine na nic by nam sie nie przyadł, dlatego tworzony jest przez obiekt klasy Car i używany jest tylko przez niego po czym jest niszczony w momencie, kiedy obiekt Car przestaje istnieć.
Huh.....
Powiem tylko jeszcze, że przydałaby się weryfikacja tego co napisałem - niech jakiś OOP spec się wypowie, bo nie jestem do końca pewien czy nie napisałem bzdur