Ich habe eine Idee für das Ereignissystem, das ich für mein benutzerdefiniertes Framework entwickle.Können wir noch mehr Zeilen in eine Funktion einfügen, indem wir sie um PHP erweitern?
Stellen Sie sich eine Pseudofunktion wie diese vor.
class Test
{
public function hi()
{
Event::add(__FUNCTION__ . 'is about to run.');
return "hi";
}
}
Stellen Sie sich vor, Sie müssen dasselbe für einige weitere Funktionen tun. (Vielleicht möchten Sie protokollieren, welche Funktionen zur Laufzeit ausgeführt wurden und diese in einer separaten Datei protokollieren möchten.)
Anstatt dies zu tun und Ereignisse manuell in Funktionen einzufügen, können wir so etwas tun?
class Test
{
public function hi()
{
return "hi";
}
}
// events.php (It's a pseudo code so may not work.)
// Imagine extend's purpose is to inject codes into target function
Event::bind('on', $className, $methodName, function() use ($className, $methodName)
{
return $className->$methodName->extend('before', Event::add(__FUNCTION__ . 'is about to run.'));
});
Die Idee ist hi()
Funktion, die innerhalb Test class
ist zu injizieren und Injizieren, was wir von außen in extend
Funktion übergeben. 'before'
bedeutet, dass die Injektion in der ersten Zeile der Zielfunktion erfolgen muss.
Schließlich werden die Ereignisse und Ereignisbindungen vollständig abstrahiert von den Funktionen entfernt. Ich möchte in der Lage sein, benutzerdefinierte Dinge zu binden, ohne die Funktionen zu ändern.
Ich habe das Gefühl, dass wir dies tun können, indem wir mit eval()
herumhacken oder mit call_user_func()
spielen. Ich bin mir jedoch nicht sicher. Die Verwendung von eval()
klingt schon ziemlich schlecht.
Meine Frage ist;
- Ist es eine mögliche Sache mit PHP zu tun?
- Hat es einen Namen in OOP/OOP Principles, so kann ich weiter lesen?
- Macht es Sinn oder ist es eine schlechte Idee?
Ich dachte, der ganze Sinn der Verwendung von Klassen war, sie wiederzuverwenden? –
Nicht sicher. Ein Proxy vielleicht? –
[Dependency Injection] (http://en.wikipedia.org/wiki/Dependency_injection)? Fowler ist immer eine gute Ressource, wenn es um Designmuster geht. http://www.martinfowler.com/articles/injection.html. ** Vermeiden Sie 'eval' **. – ficuscr