2012-06-15 8 views
5

Verwendet eine Instanz einer Klasse für den Zugriff auf statische Methoden, die als "schlechte Praxis" betrachtet werden?Verwendet eine Instanz einer Klasse für den Zugriff auf statische Methoden, die als schlechte Methode betrachtet werden?

I.e.

$model = new MyClass(); 
$options = MyClass::getOptions(); 

vs

$model = new MyClass(); 
$options = $model::getOptions(); 

($model in jedem Fall instanziiert wird, frage ich mich nur, wenn ein Ansatz zu dem anderen vorzuziehen ist.)

+0

zweite Syntax ist ungültig: s –

+0

@SiGanteng die IDE nicht beschweren, und es läuft ... – bcmcfc

+0

ok dann, meine Schuld, tut mir leid –

Antwort

4

Traditionell den ersten Weg (unter Angabe der Klasse Name selbst) hat mehr Ähnlichkeiten mit anderen Sprachen wie Java.

Die zweite ist einzigartig für PHP (afaik); Es funktioniert, weil der Operator :: den Ausdruck eindeutig definiert, im Gegensatz zu Java, wo eine Periode sowohl für Instanz- als auch für statische Eigenschaften verwendet wird.

Ich bin mir nicht sicher, was die Auswirkung der Leistung ist, wenn ich die zweite Option benutze, aber ich denke, es kommt auf den persönlichen Geschmack/Codierungsstandards an.

Fazit

Wenn die Typen Ihrer Instanzen aus dem umgebenden Code sofort klar sind könnte es einfacher sein für die zweite Option zu gehen (manchmal der Klassenname kann ziemlich groß sein); Wenn nicht, verwenden Sie die erste Option, da sie am deutlichsten ist.

3

Das hängt davon ab, denke ich. Sie können glücklich statische Methoden für viele glückliche Jahre verwenden, genießen Instanziierung-freien Code, aber eines Tages müssen Sie einige (das ist, wo es geht) Anrufe an eine andere, abgeleitete Klasse, so einfach suchen-und-ersetzen Anruf umleiten geht nicht.) Mit einem vorbereiteten Objekt zu fahren ist eine sicherere Route, denke ich.

Als Alternative können Sie so etwas wie folgt verwenden:

$className = 'MyClass'; 
$className::classyMethod1(); 
$className::classyMethod2(); 

... aber das mit der Zeit ziemlich unübersichtlich werden kann, nehme ich an (und benutzbar ist nur in PHP 5.3+)

1

ich glaube, diese Alternative:

$options = MyClass::getOptions(); 

tatsächlich weniger Speicher verschwendet, weil Sie keine zusätzliche Variable rufen die statische Funktion benötigen.

Verwandte Themen