Ich arbeite an einer Klasse, die über statische Funktionsaufrufe sowie Objektmethoden zugänglich sein muss. Eine Sache, die ich gefunden habe, ist, dass ich Logik über mehrere Funktionen vervielfältige.
Vereinfachtes Beispiel:
class Configurable{
protected $configurations = array();
protected static $static_configurations = array();
public function configure($name, $value){
// ...lots of validation logic...
$this->configurations[$name] = $value;
}
public static function static_configure($name, $value){
// ...lots of validation logic (repeated)...
self::$static_configurations[$name] = $value;
}
}
Ich habe eine Lösung für dieses Problem gefunden, aber es fühlt sich wirklich schmutzig:
class Configurable{
protected $configurations = array();
protected static $static_configurations = array();
public function configure($name, $value){
// ...lots of validation logic...
if (isset($this)){
$this->configurations[$name] = $value;
}
else{
self::$static_configurations[$name] = $value;
}
}
}
ich die statische Funktion als auch brauchen, so dass ich Konfigurationen festlegen kann überall die Anwendung. Das Schöne an dieser Technik ist auch, dass ich dieselben Methodennamen in beiden Bereichen verwenden kann.
Gibt es irgendwelche Probleme mit dem Testbereich wie diesem? Performance-Probleme, Vorwärtskompatibilitätsprobleme, usw. Es funktioniert alles auf PHP 5.2, und ich muss nicht unterstützen < 5.
OK, außer dem strengen Fehler gibt es irgendwelche Probleme mit der zweiten Methode? Ich werde es wahrscheinlich auf Ihren Rat hin ändern, aber ich würde gerne die wirklichen Probleme mit Code wie diesem verstehen. Ist es eine Funktion, die wahrscheinlich aus zukünftigen PHP-Versionen entfernt wird, oder können Sie nicht statische Methoden immer statisch aufrufen? – Rowan
'E_STRICT' Fehler tendieren dazu zu sein "Das scheint eine wirklich schlechte Idee zu sein, aber wir werden es trotzdem versuchen lassen." Es gibt keine Garantie, dass so etwas immer funktioniert, aber sie werden wahrscheinlich in "E_NOTICE" oder "E_WARN" konvertiert, bevor sie komplett veraltet sind. – MightyE
Danke für die Klärung, dass @MightyE – Rowan