Was ist der Unterschied zwischen öffentlich, privat und geschützt?

988

Wann und warum soll ich verwenden public, privateund protectedFunktionen 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() {
  // ...
}
Adam
quelle
59
Ich denke, diese Frage würde auch von Antworten mit praktischen Beispielen für die Verwendung jedes einzelnen Keywords profitieren, anstatt die wörtliche Definition der einzelnen Keywords zu liefern.
Matthew
70
Ich denke wirklich, dass diese Frage öffentlich und nicht geschützt sein sollte.
Dotancohen

Antworten:

1260

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)

Sarfraz
quelle
79
protectedBereich, wenn Sie Ihre Variable / Funktion in allen Klassen sichtbar machen möchten, die die aktuelle Klasse UND ihre übergeordneten Klassen erweitern .
Shahid
4
@ Shahid - Ich verstehe deinen Standpunkt nicht. Jede Klasse, die Klasse A erweitert, erweitert auch die übergeordnete Klasse von A, nein?
JDelage
4
@JDelage - Bitte sehen Sie den Linkhttp://www.php.net/manual/en/language.oop5.visibility.php#109324
Shahid
4
@Growler Warum dann überhaupt Objekte benutzen?
J.Steve
27
@Growler, eine hilfreichere Antwort wäre, dass es gut ist, so viel wie möglich vom Innenleben eines Objekts zu verbergen. Auf diese Weise ist es weniger wahrscheinlich zu brechen. Wenn Sie alles öffentlich machen, kann ein anderer Programmierer eine Variable ändern, die Sie nur durch das Innenleben Ihres Objekts ändern möchten.
Entspannen in Zypern
1176

dd

Öffentlichkeit:

Wenn Sie eine Methode (Funktion) oder eine Eigenschaft (Variable) als deklarieren public, können Sie auf diese Methoden und Eigenschaften zugreifen:

  • Dieselbe Klasse, die es deklariert hat.
  • Die Klassen, die die oben deklarierte Klasse erben.
  • Alle fremden Elemente außerhalb dieser Klasse können ebenfalls auf diese Dinge zugreifen.

Beispiel:

<?php

class GrandPa
{
    public $name='Mark Henry';  // A public variable
}

class Daddy extends GrandPa // Inherited class
{
    function displayGrandPaName()
    {
        return $this->name; // The public variable will be available to the inherited class
    }

}

// Inherited class Daddy wants to know Grandpas Name
$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Prints 'Mark Henry'

// Public variables can also be accessed outside of the class!
$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Prints 'Mark Henry'

Geschützt:

Wenn Sie eine Methode (Funktion) oder eine Eigenschaft (Variable) als deklarieren protected, können Sie auf diese Methoden und Eigenschaften zugreifen

  • Dieselbe Klasse, die es deklariert hat.
  • Die Klassen, die die oben deklarierte Klasse erben.

Outsider-Mitglieder können nicht auf diese Variablen zugreifen. "Außenseiter" in dem Sinne, dass sie keine Objektinstanzen der deklarierten Klasse selbst sind.

Beispiel:

<?php

class GrandPa
{
    protected $name = 'Mark Henry';
}

class Daddy extends GrandPa
{
    function displayGrandPaName()
    {
        return $this->name;
    }

}

$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Prints 'Mark Henry'

$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Results in a Fatal Error

Der genaue Fehler ist folgender:

Schwerwiegender PHP-Fehler: Zugriff auf die geschützte Eigenschaft GrandPa :: $ name nicht möglich


Privat:

Wenn Sie eine Methode (Funktion) oder eine Eigenschaft (Variable) als deklarieren private, können Sie auf diese Methoden und Eigenschaften zugreifen:

  • Dieselbe Klasse, die es deklariert hat.

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:

<?php

class GrandPa
{
    private $name = 'Mark Henry';
}

class Daddy extends GrandPa
{
    function displayGrandPaName()
    {
        return $this->name;
    }

}

$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Results in a Notice 

$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Results in a Fatal Error

Die genauen Fehlermeldungen lauten:

Hinweis: Undefinierte Eigenschaft: Daddy :: $ name
Schwerwiegender Fehler: Zugriff auf Privateigentum GrandPa :: $ name nicht möglich


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 , protectedund privateMitglieder (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 protectedund privateMitglieder außerhalb der Klasse!

Was ist Reflexion?

Reflection bietet die Möglichkeit, Klassen, Schnittstellen, Funktionen, Methoden und Erweiterungen zurückzuentwickeln. Darüber hinaus bieten sie Möglichkeiten zum Abrufen von Dokumentkommentaren für Funktionen, Klassen und Methoden.

Präambel

Wir haben eine Klasse mit dem Namen Grandpasund sagen, wir haben drei Eigenschaften. Betrachten Sie zum leichteren Verständnis drei Großväter mit Namen:

  • Mark Henry
  • John Clash
  • Will Jones

Lassen Sie uns sie machen (assign Modifikatoren) public, protectedund privatejeweils. Sie wissen sehr gut , dass protectedund privateMitglieder können nicht außerhalb der Klasse zugegriffen werden. Widersprechen wir nun der Aussage durch Reflexion.

Der Code

<?php

class GrandPas   // The Grandfather's class
{
    public     $name1 = 'Mark Henry';  // This grandpa is mapped to a public modifier
    protected  $name2 = 'John Clash';  // This grandpa is mapped to a protected  modifier
    private    $name3 = 'Will Jones';  // This grandpa is mapped to a private modifier
}


# Scenario 1: without reflection
$granpaWithoutReflection = new GrandPas;

# Normal looping to print all the members of this class
echo "#Scenario 1: Without reflection<br>";
echo "Printing members the usual way.. (without reflection)<br>";
foreach($granpaWithoutReflection as $k=>$v)
{
    echo "The name of grandpa is $v and he resides in the variable $k<br>";
}

echo "<br>";

#Scenario 2: Using reflection

$granpa = new ReflectionClass('GrandPas'); // Pass the Grandpas class as the input for the Reflection class
$granpaNames=$granpa->getDefaultProperties(); // Gets all the properties of the Grandpas class (Even though it is a protected or private)


echo "#Scenario 2: With reflection<br>";
echo "Printing members the 'reflect' way..<br>";

foreach($granpaNames as $k=>$v)
{
    echo "The name of grandpa is $v and he resides in the variable $k<br>";
}

Ausgabe:

#Scenario 1: Without reflection
Printing members the usual way.. (Without reflection)
The name of grandpa is Mark Henry and he resides in the variable name1

#Scenario 2: With reflection
Printing members the 'reflect' way..
The name of grandpa is Mark Henry and he resides in the variable name1
The name of grandpa is John Clash and he resides in the variable name2
The name of grandpa is Will Jones and he resides in the variable name3

Häufige Missverständnisse:

Bitte verwechseln Sie nicht das folgende Beispiel. Wie Sie immer noch sehen können, können die Mitglieder privateund außerhalb der Klasse nicht ohne Reflektion protectedaufgerufen werden

<?php

class GrandPas   // The Grandfather's class
{
    public     $name1 = 'Mark Henry';  // This grandpa is mapped to a public modifier
    protected  $name2 = 'John Clash';  // This grandpa is mapped to a protected modifier
    private    $name3 = 'Will Jones';  // This grandpa is mapped to a private modifier
}

$granpaWithoutReflections = new GrandPas;
print_r($granpaWithoutReflections);

Ausgabe:

GrandPas Object
(
    [name1] => Mark Henry
    [name2:protected] => John Clash
    [name3:GrandPas:private] => Will Jones
)

Debugging-Funktionen

print_r, var_exportUnd var_dumpsind Debugger Funktionen . Sie präsentieren Informationen über eine Variable in einer für Menschen lesbaren Form. Diese drei Funktionen zeigen die protectedund privateEigenschaften von Objekten mit PHP 5. Statische Klassenmitglieder werden nicht angezeigt.


Mehr Ressourcen:


Shankar Damodaran
quelle
Entschuldigung für das späte Add-On zu dieser Convo. Können Sie mir sagen, warum jemand diese verwenden würde? Sie haben perfekt erklärt, wie sie funktionieren usw. Ich möchte nur die Vorteile der Verwendung für jede dieser Funktionen kennen. Vielen Dank
JamesG
@ JamesG es ist ein bisschen im anderen Kommentar oben erklärt. stackoverflow.com/questions/4361553/…
cjmling
Ich weiß nicht, warum es vielleicht ein wenig außer Frage steht, aber niemand hat erwähnt, dass es in PHP zwei weitere Zugriffsmodifikatoren gibt: abstrakt und final Dieses Schlüsselwort kann nur für PHP-Klassen verwendet werden, aber es
greift
1
Ich würde vorschlagen, dass Sie die Erklärung zur Abstraktion von Dhairya Lakhera hier lesen : stackoverflow.com/questions/2558559/… . Es ist eine perfekte Ergänzung zu den Erklärungen von Shankar Damodaran.
Julio Marchi
83

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.

Der Awnry Bär
quelle
3
Das in der Bearbeitung dieses Beitrags empfohlene Buch ist wirklich sehr gut. Das Stück, das ich bisher hatte, hat sich als ziemlich aufschlussreich erwiesen. Die ersten Kapitel beantworteten die meisten meiner klassenbezogenen Fragen.
Josiah
Die Bücher, die es mir ermöglichten, Objekte wirklich zu verstehen, ohne mein Denken mit unnötigen Details zu verdrängen, wie Beispiele in Smalltalk, stammen von David A Taylor, der objektorientierte Technologie: Ein Leitfaden für Manager und Business Engineering mit Objekttechnologie . Beide Seiten umfassen nur 100 Seiten und sind an einem Nachmittag leicht zu lesen. Natürlich gibt es die Entwurfsmuster von Gamma et al. , Obwohl der grundlegende Ansatz einfach durch "Unterklasse, was Sie variieren möchten" beschrieben werden kann.
Patanjali
Eine sehr schöne Analogie. Haben Sie eine für geschützte vs private?
Jānis Elmeris
79

private - kann nur innerhalb der Klasse aufgerufen werden

protected - kann von WITHIN the class und INHERITING class aufgerufen werden

public - kann auch außerhalb der Klasse über den Code aufgerufen werden

Dies gilt sowohl für Funktionen als auch für Variablen.

Olaf
quelle
Ich bin mir nicht sicher, ob die geschützte Definition hier korrekt ist. Aus der tatsächlich ausgewählten Antwort geht hervor, dass "Geschützt" - Nur ab der geerbten Klasse und nicht ab der ursprünglichen / übergeordneten Klasse zugegriffen werden kann. "INNERHALB der Klasse" zu sagen kann etwas verwirrend sein.
Pal4life
7
Ich denke nicht, tatsächlich scheint es, dass die ausgewählte Antwort diejenige ist, die hier verwirrend ist. Siehe Shahids Kommentar. IMHO kann eine geschützte Methode sehr gut aus der ursprünglichen Klasse zugegriffen werden.
Olaf
Kann eine Klasse auf die Öffentlichkeit einer anderen Klasse zugreifen?
Serjas
1
@Serjas: Nein, nur ein anderes Objekt, es sei denn, es handelt sich um statische Methoden / Felder.
DanMan
Ich weiß nicht, ob dies für alle Programmiersprachen gilt, aber in PHP kann auf "geschützte" Eigenschaften / Methoden entweder in der Klasse zugegriffen werden, in der sie deklariert wurden, oder in Klassen, die von der Klasse erben, die die Eigenschaft / Methode definiert.
John Slegers
25

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.

Matthew Watts
quelle
17

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.

  • Abstract zB Stellen Sie sich den Bereich der öffentlichen Sichtbarkeit als "öffentliches Picknick" vor , zu dem jeder kommen 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.)

  • Stellen Sie sich einen geschützten Sichtbarkeitsbereich als "Firmenpicknick" vor, bei dem Firmenmitglieder und ihre Familienmitglieder nicht der Öffentlichkeit zugänglich sind. Dies ist die häufigste Einschränkung des Anwendungsbereichs.

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.

  • mit Picknick-Analogie denken Sie als "Firmenpicknick, bei dem nur die Firmenmitglieder erlaubt sind" im Picknick. Weder Familie noch Öffentlichkeit sind erlaubt.
Suman KC
quelle
15
/**
 * Define MyClass
 */
class MyClass
{
    public $public = 'Public';
    protected $protected = 'Protected';
    private $private = 'Private';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj = new MyClass();
echo $obj->public; // Works
echo $obj->protected; // Fatal Error
echo $obj->private; // Fatal Error
$obj->printHello(); // Shows Public, Protected and Private


/**
 * Define MyClass2
 */
class MyClass2 extends MyClass
{
    // We can redeclare the public and protected method, but not private
    protected $protected = 'Protected2';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj2 = new MyClass2();
echo $obj2->public; // Works
echo $obj2->private; // Undefined
echo $obj2->protected; // Fatal Error
$obj2->printHello(); // Shows Public, Protected2, Undefined

Extrahiert aus :

http://php.net/manual/en/language.oop5.visibility.php

Technikfreak
quelle
12

⚡️ Hier ist eine einfache Möglichkeit , den Umfang der erinnern public, protectedund private.

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.
  • Nein! Objekte können nicht auf diesen Bereich zugreifen

PRIVATE::

  • private Gültigkeitsbereich: Eine private Variable / Funktion ist nur in der aktuellen Klasse sichtbar, in der sie definiert wird.
  • Nein! Klassen, die die aktuelle Klasse erweitern, können nicht auf diesen Bereich zugreifen.
  • Nein! Objekte können nicht auf diesen Bereich zugreifen.

Lesen Sie die Sichtbarkeit einer Methode oder Variablen im PHP-Handbuch.

Ahmad Awais
quelle
9

Ü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 vonprotected 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 privateMethode 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, wo protectednormalerweise eine Methode verwendet wird, daher verwende ich protectedheutzutage standardmäßig . Vielleicht nicht 100% objektiv "in den Gräben" Erfahrung, gebe ich zu.

DanMan
quelle
3
Mit Ihrem Update: Können Sie klarer machen, wie "gut genug" und "guter Grund" hier zusammenpassen? Zum Beispiel privatewä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.
hakre
@hakre: Der Grund, warum wir uns um die Einkapselung bemühen sollten, besteht darin, zu vermeiden, dass ein Zustand in den äußeren Bereich gelangt. protectedmacht das schon, aber du hältst es flexibel für Erweiterung / Vererbung. Wieder, es sei denn, Sie haben einen guten Grund, es zu machen private.
DanMan
Nun, das ist wahrscheinlich der Punkt, dem wir nicht zustimmen: protectedTatsä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.
hakre
Ich werde nicht mit Ihrem Gesamtpunkt streiten, weil es fair genug ist, aber protectednicht 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 eines protectedFeldes aufzuspüren als publiceines.
DanMan
6

Das PHP-Handbuch hat die Frage hier gut gelesen .

Die Sichtbarkeit einer Eigenschaft oder Methode kann definiert werden, indem der Deklaration die Schlüsselwörter public, protected oder private vorangestellt werden. Als öffentlich deklarierte Klassenmitglieder können überall zugegriffen werden. Auf Mitglieder, die als geschützt deklariert wurden, kann nur innerhalb der Klasse selbst sowie von geerbten und übergeordneten Klassen zugegriffen werden. Als privat deklarierte Mitglieder dürfen nur von der Klasse aufgerufen werden, die das Mitglied definiert.

code_burgar
quelle
6

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:

$myObject = new MyObject()
$myObject->publicVar = 'newvalue';
$pubVar = $myObject->publicVar;

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 privatedie 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:

$myObject = new MyObject()
$myObject->setProtectedVar('newvalue');
$protectedVar = $myObject->getProtectedVar();

Privat : privateEigenschaften sind Eigenschaften sehr ähnlich protected. 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):

$this->setPrivateVar('newvalue');
$privateVar = $this->getPrivateVar();
Andrew
quelle
4

Sie sind dazu da, unterschiedliche Kapselungsstufen zu ermöglichen

Mchl
quelle
10
Sie könnten dies wahrscheinlich ein wenig ausarbeiten.
Aaron Hall
4

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ähren

protected $familyWealth;

star18bit
quelle
3

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 publicoder protectedsollten als wichtige Änderungen betrachtet werden.

  • Alles was neu ist publicoder protected(zumindest) MINOR sein sollte

  • Nur Neu / Änderungen an irgendetwas privatekönnen PATCH sein

In Bezug auf die Pflege von Code ist es also gut, vorsichtig zu sein, was Sie machen publicoder protectedweil dies die Dinge sind, die Sie Ihren Benutzern versprechen.

mcfedr
quelle
1

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.

  1. ÖFFENTLICHKEIT
  2. PRIVAT
  3. GESCHÜTZT

Schauen wir uns nun das folgende Bild an, um die Zugriffsebene des Zugriffsmodifikators zu verstehen Geben Sie hier die Bildbeschreibung ein

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

Mahedi Hasan Durjoy
quelle
1

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.

Nomadme
quelle
0

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.

Farzana Khan
quelle