Wann und warum soll ich verwenden public
, private
und protected
Funktionen und Variablen in einer Klasse? Was ist der Unterschied zwischen ihnen?
Beispiele:
// Public
public $variable;
public function doSomething() {
// ...
}
// Private
private $variable;
private function doSomething() {
// ...
}
// Protected
protected $variable;
protected function doSomething() {
// ...
}
Antworten:
Sie nutzen:
public
Bereich, um diese Eigenschaft / Methode von überall, anderen Klassen und Instanzen des Objekts verfügbar zu machen.private
Bereich, wenn Ihre Eigenschaft / Methode nur in einer eigenen Klasse sichtbar sein soll.protected
Bereich, wenn Sie Ihre Eigenschaft / Methode in allen Klassen sichtbar machen möchten, die die aktuelle Klasse erweitern, einschließlich der übergeordneten Klasse.Mehr: (Für umfassende Informationen)
quelle
protected
Bereich, wenn Sie Ihre Variable / Funktion in allen Klassen sichtbar machen möchten, die die aktuelle Klasse UND ihre übergeordneten Klassen erweitern .http://www.php.net/manual/en/language.oop5.visibility.php#109324
Öffentlichkeit:
Wenn Sie eine Methode (Funktion) oder eine Eigenschaft (Variable) als deklarieren
public
, können Sie auf diese Methoden und Eigenschaften zugreifen:Beispiel:
Geschützt:
Wenn Sie eine Methode (Funktion) oder eine Eigenschaft (Variable) als deklarieren
protected
, können Sie auf diese Methoden und Eigenschaften zugreifenOutsider-Mitglieder können nicht auf diese Variablen zugreifen. "Außenseiter" in dem Sinne, dass sie keine Objektinstanzen der deklarierten Klasse selbst sind.
Beispiel:
Der genaue Fehler ist folgender:
Privat:
Wenn Sie eine Methode (Funktion) oder eine Eigenschaft (Variable) als deklarieren
private
, können Sie auf diese Methoden und Eigenschaften zugreifen:Outsider-Mitglieder können nicht auf diese Variablen zugreifen. Außenseiter in dem Sinne, dass sie keine Objektinstanzen der deklarierten Klasse selbst und sogar der Klassen sind, die die deklarierte Klasse erben.
Beispiel:
Die genauen Fehlermeldungen lauten:
Präparation der Opa-Klasse mit Reflexion
Dieses Thema ist nicht wirklich außerhalb des Rahmens, und ich füge es hier hinzu, um zu beweisen, dass Reflexion wirklich mächtig ist. Wie ich hatte drei oben genannten Beispiele in der angegeben ist ,
protected
undprivate
Mitglieder (Eigenschaften und Methoden) nicht außerhalb der Klasse zugegriffen werden.Doch mit Reflexion können Sie das tun außerordentliche sogar um den Zugriff auf
protected
undprivate
Mitglieder außerhalb der Klasse!Was ist Reflexion?
Präambel
Wir haben eine Klasse mit dem Namen
Grandpas
und sagen, wir haben drei Eigenschaften. Betrachten Sie zum leichteren Verständnis drei Großväter mit Namen:Lassen Sie uns sie machen (assign Modifikatoren)
public
,protected
undprivate
jeweils. Sie wissen sehr gut , dassprotected
undprivate
Mitglieder können nicht außerhalb der Klasse zugegriffen werden. Widersprechen wir nun der Aussage durch Reflexion.Der Code
Ausgabe:
Häufige Missverständnisse:
Bitte verwechseln Sie nicht das folgende Beispiel. Wie Sie immer noch sehen können, können die Mitglieder
private
und außerhalb der Klasse nicht ohne Reflektionprotected
aufgerufen werdenAusgabe:
Debugging-Funktionen
print_r
,var_export
Undvar_dump
sind Debugger Funktionen . Sie präsentieren Informationen über eine Variable in einer für Menschen lesbaren Form. Diese drei Funktionen zeigen dieprotected
undprivate
Eigenschaften von Objekten mit PHP 5. Statische Klassenmitglieder werden nicht angezeigt.Mehr Ressourcen:
quelle
Es wird normalerweise als gute Praxis angesehen, standardmäßig die niedrigste erforderliche Sichtbarkeit zu verwenden, da dies die Datenkapselung und ein gutes Schnittstellendesign fördert. Denken Sie bei der Betrachtung der Sichtbarkeit von Mitgliedsvariablen und Methoden an die Rolle, die das Mitglied bei der Interaktion mit anderen Objekten spielt.
Wenn Sie "eher auf einer Schnittstelle als auf einer Implementierung codieren", ist es normalerweise ziemlich einfach, Sichtbarkeitsentscheidungen zu treffen. Im Allgemeinen sollten Variablen privat oder geschützt sein, es sei denn, Sie haben einen guten Grund, sie verfügbar zu machen. Verwenden Sie stattdessen öffentliche Accessoren (Getter / Setter), um den Zugriff auf die Interna einer Klasse zu beschränken und zu regulieren.
Um ein Auto als Analogie zu verwenden, wären Dinge wie Geschwindigkeit, Gang und Richtung private Instanzvariablen. Sie möchten nicht, dass der Fahrer Dinge wie das Luft / Kraftstoff-Verhältnis direkt manipuliert. Stattdessen stellen Sie eine begrenzte Anzahl von Aktionen als öffentliche Methoden zur Verfügung. Die Schnittstelle zu einem Auto könnte Methoden gehören wie
accelerate()
,deccelerate()
/brake()
,setGear()
,turnLeft()
,turnRight()
etc.Der Fahrer weiß nicht, und es sollte ihn auch nicht interessieren, wie diese Aktionen von den Einbauten des Fahrzeugs ausgeführt werden, und dass diese Funktionalität für den Fahrer und andere Personen auf der Straße gefährlich sein kann. Daher die bewährte Methode, eine öffentliche Schnittstelle zu entwerfen und die Daten hinter dieser Schnittstelle zu kapseln.
Mit diesem Ansatz können Sie auch die Implementierung der öffentlichen Methoden in Ihrer Klasse ändern und verbessern, ohne den Vertrag der Schnittstelle mit dem Clientcode zu brechen. Sie könnten beispielsweise die
accelerate()
Methode verbessern , um Kraftstoff zu sparen, die Verwendung dieser Methode bleibt jedoch unverändert. Der Client-Code würde keine Änderungen erfordern, aber dennoch die Vorteile Ihrer Effizienzverbesserung nutzen.Bearbeiten: Da Sie anscheinend immer noch objektorientierte Konzepte lernen (die viel schwieriger zu beherrschen sind als die Syntax einer Sprache), empfehle ich dringend , eine Kopie von PHP-Objekten, Mustern und Übungen von Matt Zandstra zu erwerben. Dies ist das Buch, in dem ich zuerst gelernt habe, wie man OOP effektiv einsetzt, anstatt mir nur die Syntax beizubringen. Ich hatte die Syntax Jahre zuvor gelernt, aber das war nutzlos, ohne das "Warum" von OOP zu verstehen.
quelle
private
- kann nur innerhalb der Klasse aufgerufen werdenprotected
- kann von WITHIN the class und INHERITING class aufgerufen werdenpublic
- kann auch außerhalb der Klasse über den Code aufgerufen werdenDies gilt sowohl für Funktionen als auch für Variablen.
quelle
Der Unterschied ist wie folgt:
Public
:: Auf eine öffentliche Variable oder Methode kann jeder Benutzer der Klasse direkt zugreifen.Protected
:: Auf eine geschützte Variable oder Methode kann nicht auf Benutzer der Klasse zugegriffen werden, sondern innerhalb einer Unterklasse, die von der Klasse erbt.Private
:: Auf eine private Variable oder Methode kann nur intern von der Klasse aus zugegriffen werden, in der sie definiert ist. Dies bedeutet, dass eine private Variable oder Methode nicht von einem untergeordneten Element aufgerufen werden kann, das die Klasse erweitert.quelle
Sichtbarkeitsbereiche mit abstrakten Beispielen :: Erleichtert das Verständnis
Diese Sichtbarkeit einer Eigenschaft oder Methode wird durch die Vorab-Deklaration eines von drei Schlüsselwörtern (öffentlich, geschützt und privat) definiert.
Öffentlich : Wenn eine Eigenschaft oder Methode als öffentlich definiert ist, bedeutet dies, dass sie von allem, was auf ein Objekt verweisen kann, sowohl aufgerufen als auch bearbeitet werden kann.
Geschützt: Wenn die Sichtbarkeit einer Eigenschaft oder Methode auf geschützte Mitglieder festgelegt ist, kann nur innerhalb der Klasse selbst und über geerbte und erbende Klassen zugegriffen werden. (Geerbt: - Eine Klasse kann alle Eigenschaften und Methoden einer anderen Klasse haben.)
Privat: Wenn die Sichtbarkeit einer Eigenschaft oder Methode auf privat festgelegt ist, kann nur die Klasse mit den privaten Mitgliedern auf diese Methoden und Eigenschaften zugreifen (intern innerhalb der Klasse), ungeachtet der dort möglicherweise vorhandenen Klassenbeziehung.
quelle
Extrahiert aus :
http://php.net/manual/en/language.oop5.visibility.php
quelle
PUBLIC
::public
Gültigkeitsbereich: Eine öffentliche Variable / Funktion steht sowohl Objekten als auch anderen Klassen zur Verfügung.PROTECTED
::protected
Gültigkeitsbereich: Eine geschützte Variable / Funktion steht allen Klassen zur Verfügung, die die aktuelle Klasse erweitern.PRIVATE
::private
Gültigkeitsbereich: Eine private Variable / Funktion ist nur in der aktuellen Klasse sichtbar, in der sie definiert wird.Lesen Sie die Sichtbarkeit einer Methode oder Variablen im PHP-Handbuch.
quelle
Überlegen, wann :
Ich neige dazu, zunächst alles als privat zu deklarieren, wenn ich mir nicht ganz sicher bin. Grund dafür ist, dass es normalerweise viel einfacher ist, eine private Methode öffentlich zu machen, als umgekehrt. Das liegt daran, dass Sie zumindest sicher sein können, dass die private Methode nur in der Klasse selbst verwendet wurde. Eine öffentliche Methode wird möglicherweise bereits überall verwendet und erfordert möglicherweise ein umfangreiches Umschreiben.
Update : Ich gehe für einen Standard von
protected
heutzutage , weil ich festgestellt habe, dass er gut genug für die Kapselung ist und beim Erweitern von Klassen nicht im Weg steht (was ich sowieso zu vermeiden versuche). Nur wenn ich einen guten Grund habe, die anderen beiden zu benutzen, werde ich es tun.Ein guter Grund für eine
private
Methode wäre eine, die etwas implementiert, das diesem Objekt inhärent ist und das selbst eine erweiterte Klasse nicht ändern sollte (sachlicher Grund zusätzlich zur Kapselung wie interne Zustandsverwaltung). Letztendlich ist es immer noch einfach genug, herauszufinden, woprotected
normalerweise eine Methode verwendet wird, daher verwende ichprotected
heutzutage standardmäßig . Vielleicht nicht 100% objektiv "in den Gräben" Erfahrung, gebe ich zu.quelle
private
wäre die Verwendung immer noch "gut genug" für die Verwendung, aber Sie schlagen dies nicht mehr vor, obwohl die früheren Gründe, die Sie angegeben haben, immer noch wie ein "guter Grund" klingen: Kapselung.protected
macht das schon, aber du hältst es flexibel für Erweiterung / Vererbung. Wieder, es sei denn, Sie haben einen guten Grund, es zu machenprivate
.protected
Tatsächlich tritt er in den äußeren Bereich ein und steht Ihnen oft im Weg, da er schlechte Entwurfsentscheidungen wie die implizite Bevorzugung der Vererbung unterstützt, während es besser ist, die Komposition zu bevorzugen. Das ist der Grund, warum es oft besser ist, mit dem Schreiben von Code zu beginnen, wenn Sie nicht an den tatsächlichen Anforderungen festhalten. Dies verhindert auch, dass Entwurfsentscheidungen zu früh getroffen werden, während sie tatsächlich noch nicht benötigt werden.protected
nicht in den äußeren Bereich (Code, der die Methode / das Feld aufruft / zugreift), sondern nur in den inneren Bereich (Erweiterung von Klassen) gelangt . Es gibt einen Unterschied, so gering er für Sie auch sein mag. Es ist viel einfacher, die Verwendung einesprotected
Feldes aufzuspüren alspublic
eines.Das PHP-Handbuch hat die Frage hier gut gelesen .
quelle
Für mich ist dies der nützlichste Weg, um die drei Eigenschaftstypen zu verstehen:
Öffentlich : Verwenden Sie diese Option, wenn Sie damit einverstanden sind, dass auf diese Variable direkt zugegriffen und von einer beliebigen Stelle in Ihrem Code aus geändert wird.
Beispiel für die Verwendung von außerhalb der Klasse:
Geschützt : Verwenden Sie diese Option, wenn Sie andere Programmierer (und sich selbst) zwingen möchten, Getter / Setter außerhalb der Klasse zu verwenden, wenn Sie auf Variablen zugreifen und diese festlegen (Sie sollten jedoch konsistent sein und auch die Getter und Setter innerhalb der Klasse verwenden). Dies oder
private
die Standardmethode, mit der Sie alle Klasseneigenschaften einrichten sollten.Warum? Denn wenn Sie zu einem späteren Zeitpunkt (möglicherweise sogar in etwa 5 Minuten) entscheiden, dass Sie den für diese Eigenschaft zurückgegebenen Wert manipulieren oder etwas damit tun möchten, bevor Sie ihn abrufen / festlegen, können Sie dies tun, ohne überall umgestalten zu müssen habe es in deinem Projekt verwendet.
Beispiel für die Verwendung von außerhalb der Klasse:
Privat :
private
Eigenschaften sind Eigenschaften sehr ähnlichprotected
. Aber das Unterscheidungsmerkmal / der Unterschied besteht darin, dass man es machtprivate
auch für untergeordnete Klassen unzugänglich ist, ohne den Getter oder Setter der übergeordneten Klasse zu verwenden.Wenn Sie also Getter und Setter für eine Eigenschaft verwenden (oder wenn sie nur intern von der übergeordneten Klasse verwendet wird und nirgendwo anders zugänglich sein soll), können Sie dies auch tun
private
, um zu verhindern, dass jemand es versucht um es direkt zu verwenden und Fehler einzuführen .Beispiel für die Verwendung in einer untergeordneten Klasse (die MyObject erweitert):
quelle
Sie sind dazu da, unterschiedliche Kapselungsstufen zu ermöglichen
quelle
Variablen in PHP werden in drei verschiedene Typen umgewandelt:
Öffentlich: Werte dieser Variablentypen sind in allen Bereichen verfügbar und werden bei Ausführung Ihres Codes aufgerufen. deklarieren als:
public $examTimeTable;
Privat: Werte dieses Variablentyps sind nur für die Klasse verfügbar, zu der sie gehören.
private $classRoomComputers;
Geschützt: Werte dieser Klasse nur und nur verfügbar, wenn der Zugriff in Form einer Vererbung oder ihrer untergeordneten Klasse gewährt wurde. Wird im Allgemeinen verwendet
::
, um den Zugriff durch die übergeordnete Klasse zu gewährenprotected $familyWealth;
quelle
Eine alte Frage wieder aufleben lassen, aber ich denke, eine wirklich gute Möglichkeit, sich das vorzustellen, ist die API, die Sie definieren.
public
- Alles, was als öffentlich markiert ist, ist Teil der API, die jeder, der Ihre Klasse / Schnittstelle / andere verwendet, verwendet und sich darauf verlässt.protected
- Lass dich nicht täuschen, das ist auch Teil der API! Personen können Unterklassen erstellen, Ihren Code erweitern und alles verwenden, was als geschützt markiert ist.private
- Private Eigenschaften und Methoden können beliebig geändert werden. Niemand sonst kann diese verwenden. Dies sind die einzigen Dinge, die Sie ändern können, ohne Änderungen vorzunehmen.Oder in Semver- Begriffen:
Änderungen an irgendetwas
public
oderprotected
sollten als wichtige Änderungen betrachtet werden.Alles was neu ist
public
oderprotected
(zumindest) MINOR sein sollteNur Neu / Änderungen an irgendetwas
private
können PATCH seinIn Bezug auf die Pflege von Code ist es also gut, vorsichtig zu sein, was Sie machen
public
oderprotected
weil dies die Dinge sind, die Sie Ihren Benutzern versprechen.quelle
Wenn wir in unserem Projekt objektorientiertem PHP folgen, sollten wir einige Regeln befolgen, um Zugriffsmodifikatoren in PHP zu verwenden. Heute werden wir klar lernen, was Zugriffsmodifikator ist und wie wir ihn verwenden können. PHP-Zugriffsmodifikatoren werden verwendet, um Zugriffsrechte für PHP-Klassen und deren Mitglieder festzulegen, die die im Klassenbereich definierten Funktionen und Variablen sind. In PHP gibt es drei Bereiche für Klassenmitglieder.
Schauen wir uns nun das folgende Bild an, um die Zugriffsebene des Zugriffsmodifikators zu verstehen
Schauen wir uns nun die folgende Liste an, um zu erfahren, welche PHP-Schlüsselwörter als Zugriffsmodifikatoren verwendet werden können.
public: - Die Klasse oder ihre mit diesem Zugriffsmodifikator definierten Mitglieder sind von überall öffentlich zugänglich, auch von außerhalb des Bereichs der Klasse.
privat: - Auf Klassenmitglieder mit diesem Schlüsselwort wird innerhalb der Klasse selbst zugegriffen. Wir können nicht auf private Daten aus der Unterklasse zugreifen. Es schützt Mitglieder vor dem Zugriff von außerhalb der Klasse.
protected: - wie private, außer dass Unterklassen auf geschützte Superklassenmitglieder zugreifen können.
Lesen Sie nun die Tabelle, um den Zugriffsmodifikator zu verstehen. Lesen Sie den vollständigen Artikel zum PHP-Zugriffsmodifikator
quelle
Public
: ist ein Standardstatus, wenn Sie eine Variable oder Methode deklarieren. Auf alles kann direkt auf das Objekt zugegriffen werden.Protected
: Kann nur innerhalb des Objekts und der Unterklassen aufgerufen werden.Private
: Kann nur innerhalb des Objekts referenziert werden, nicht innerhalb von Unterklassen.quelle
Die genannten Schlüsselwörter sind Zugriffsmodifikatoren und helfen uns bei der Implementierung der Kapselung (oder des Versteckens von Informationen). Sie teilen dem Compiler mit, welche anderen Klassen Zugriff auf das zu definierende Feld oder die zu definierende Methode haben sollen.
privat - Nur die aktuelle Klasse hat Zugriff auf das Feld oder die Methode.
protected - Nur die aktuelle Klasse und Unterklassen (und manchmal auch Klassen mit demselben Paket) dieser Klasse haben Zugriff auf das Feld oder die Methode.
public - Jede Klasse kann auf das Feld verweisen oder die Methode aufrufen.
quelle