Ja to widzę tak:
Cytat
1. W większości skryptów do operowania na zmiennych z klasy są metody setZmienna() getZmienna() - po co to robić skoro można prościej $obiek -> zmienna ?
2. Przy założeniu że jest to potrzebne to zamiast setek metod set() i get() można wyłapywać wszystko w __call() i __set() jednak nie widziałem w klasach takiego rozwiązania.
Można i tak i tak - tzn settery i gettery można jednak dodatkowo obudować o wywołania innych funkcji, modyfikowanie wartości. Można też np odmówić dostępu do zmiennej z jakichś przyczyn.
Osobiście wolę tradycyjne set i get niż funkcje magiczne - nie mam na razie do nich zaufania (ich działanie jest niekiedy dość tajemnicze). To też kwestia przyzwyczajenia.
Cytat
3. Interfejsy - służą one do czegoś oprócz 'wymuszania' zawarcia danych metod w klasie? Jeśli nie to czemu one służą skoro można je oszukać wstawiając puste metody? Lepiej by było gdyby można było w nich zawrzeć jakieś instrukcje, wtedy nie trzeba by było tworzyć klasy w której by było upakowane wszystko a następnie kazać wszystkim innym dziedziczyć po niej.
Interfejs wzbogaca klasę o dodatkowy typ. Np.
<?php
class A {}
class B extends A implements executable,chainable {}
$obiekt=new B();
?>
Obiekt B jest klasą typu B, A oraz executable i chainable. Można to wykorzystać do wymuszania typu obiektu.
Osobiście takie interfejsy planuję użyć do konfigurowania obiektów akcji ; p
Widzisz więc, że nie chodzi tylko o to, żeby wymusić metody. To co piszesz o upakowywaniu... od tego są klasy bazowe.
Popatrz na interfejs
Iterator dostępny w php. Wymusz on metody
current()
key()
next()
rewind()
valid()
Widząc, że klasa implementuje taki interfejs wiesz, że takie metody możesz wywołać. Skoro takie metody są zawarte, to klasa może (ale nie musi, bo to zależy od intencji programisty) służyć do przeglądania czegoś.
Cytat
4. Wyjątki - jest to wygodne, ale czym się one różnią w użyciu od die(); ? Tu i tu jest przerywane działanie skryptu więc teoretycznie mogę stworzyć funkcję exception($line, $file, $message); i używać jej ze stałymi __LINE__ i __FILE__
Tym się różnią, że wyjątki nie muszą kończyć działania aplikacja jak robi to die(), czy exit(), tylko przerzucają wykonywany skrypt w inne miejsce, w którym możesz zadecydować. Przykład:
<?php
class A {
function test($file){
print 'ok'; //inne opreacje }
else {
throw new Exception('Brak pliku');
}
}
function uprzejmaFunkcja(Exception $e){
print "Nie było pliku, więc sie wykonałam<br /> aha - koleżanka test() dokładnie powiedziała powiedziała: <br />"; print $e->getMessage().'<br />'; print 'Teraz zapytam ją jeszcze raz, ale zmienię nazwę pliku'; $this->test('innaNazwaPliku.txt'); // może się uda
(uwaga - tu musi być osobny blok try-catch) }
}
$obj=new A();
try {
$obj->test('plikaa.txt');
}
catch (Exception $e){
$obj->uprzejmaFunkcja($e);
}
?>
Mam nadzieję, że pomogłem. Pozdrawiam.