Moja sytuacja jest najlepiej opisane z kawałkiem kodu:PHP na podklasy
class Foo {
function bar() {
echo "called Foo::bar()";
}
}
class SubFoo extends Foo {
function __call($func) {
if ($func == "bar") {
echo "intercepted bar()!";
}
}
}
$subFoo = new SubFoo();
// what actually happens:
$subFoo->bar(); // "called Foo:bar()"
// what would be nice:
$subFoo->bar(); // "intercepted bar()!"
wiem, że mogę uzyskać to do pracy poprzez przedefiniowanie bar()
(i wszystkie inne odpowiednie metody) w pod- klasa, ale dla moich celów byłoby dobrze, gdyby funkcja __call
mogła sobie z nimi poradzić. To sprawi, że rzeczy będą łatwiejsze i łatwiejsze w zarządzaniu.
Czy to możliwe w PHP?
To. Musisz postępować zgodnie ze wzorem Fasady. Posiadaj klasę opakowania, która "jest właścicielem" obiektu, który chcesz zastąpić wszystkimi tymi funkcjami. Użyj funkcji __call(), aby w razie potrzeby przekazać metody, wykonując dodatkową pracę. Nie marnuj wydajności, chyba że Twój kod jest ciągle wywoływany, a twoja aplikacja ma ograniczoną moc obliczeniową (prawie nigdy tak nie jest) - czas pracy programisty jest prawie zawsze ważniejszy niż wydajność przy podejmowaniu decyzji o tego rodzaju kompromisach. –