Jeśli chodzi o przechowywanie właściwości obiektu, to raczej nie lubię tablic. Trudno się w nich połapać i sensownie je kontrolować - chociaż oczywiście to tylko moje zdanie. Znacznie bardziej preferuje obiekty. Czyli np. grupowanie podobnych wlasnosci w obiekt. W ten sposób mogę narzucać kontrolę parametrów wejściowych - żeby np. cena była jako liczba z danego zakresu itp. Przykładowo produkt wygląda u mnie np. tak
objPrice - obiekt ceny, czyli cena netto, stawka vat itd.
objFeaturesCollection - kolekcja cech produktu
objPromotion - informacje na temat promocji produkt- kiedy się zaczyna, kiedy kończy, opis, warunki itp.
Tablice też mają swoje plusy, zresztą też często je stosuje - wszystko zależy od sytuacji.
Co do metody __get - oj tak, też ją lubie

Choć wolałbym aby wprowadzono Properties tak jak w C#
Wracając jednak do tematu. Przekazanie tablicy jako parametru wejściowego jest kłopotliwe - łatwo o błędy. Zawsze się wkurzam, gdy pracuje nad takim większym obiektem bo usuwanie literówek i różnic w nazwach parametrów zajmuje mi sporo czasu

Z drugiej strony inicjowanie wszystkiego ręcznie też jest upierdliwe... Może ktoś zna sposób w jaki można to zautomatyzować.