it-swarm.com.de

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

Wann und warum sollte ich public-, private- und protected-Funktionen und -Variablen innerhalb einer Klasse verwenden? 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() {
  // ...
}
894
Adam

Sie verwenden:

  • public scope, um diese Variable/Funktion von überall, von anderen Klassen und Instanzen des Objekts verfügbar zu machen.

  • private scope, wenn Ihre Variable/Funktion nur in ihrer eigenen Klasse sichtbar sein soll.

  • protected scope, wenn Sie Ihre Variable/Funktion in allen Klassen sichtbar machen möchten, die die aktuelle Klasse erweitern, einschließlich der übergeordneten Klasse.

Mehr: (Für umfassende Informationen)

1162
Sarfraz

dd

Öffentlichkeit:

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

  • Dieselbe Klasse, die es deklariert hat.
  • Die Klassen, die die oben deklarierte Klasse erben.
  • Fremdelemente außerhalb dieser Klasse können auch auf diese Elemente 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 protected deklarieren, 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 wird dies sein:

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


Privatgelände:

Wenn Sie eine Methode (Funktion) oder eine Eigenschaft (Variable) als private deklarieren, 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 object-Instanzen der deklarierten Klasse selbst sind und sogar die Klassen, 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 werden sein:

Hinweis: Nicht definierte Eigenschaft: Daddy :: $ name
Schwerwiegender Fehler: Zugriff auf die private Eigenschaft GrandPa :: $ name nicht möglich


Die Grandpa-Klasse mit Reflection zergliedern

Dieses Thema ist nicht wirklich außerhalb des Geltungsbereichs, und ich füge es hier hinzu, nur um zu beweisen, dass Reflexion wirklich mächtig ist. Wie ich in den obigen drei Beispielen festgestellt hatte, kann auf protected- und private-Member (Eigenschaften und Methoden) nicht außerhalb der Klasse zugegriffen werden. 

Mit Reflektion können Sie jedoch die aussergewöhnlichen ausführen, indem Sie sogar auf protected und private außerhalb der Klasse zugreifen!

Nun, was ist Reflexion?

Reflection bietet die Möglichkeit, Klassen, Schnittstellen und .__ zurückzuentwickeln. Funktionen, Methoden und Erweiterungen. Zusätzlich bieten sie Möglichkeiten an Abrufen von Dokumentkommentaren für Funktionen, Klassen und Methoden.

Präambel

Wir haben eine Klasse namens Grandpas und sagen, wir haben drei Eigenschaften. Zum besseren Verständnis gibt es drei Opas mit Namen:

  • Mark Henry
  • John Clash
  • Will Jones

Lassen Sie uns sie machen (weisen Sie Modifizierer zu) public, protected und private. Sie wissen sehr wohl, dass auf Mitglieder von protected und private nicht außerhalb der Klasse zugegriffen werden kann. Nun widersprechen wir der Aussage mit 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 mit dem folgenden Beispiel. Wie Sie immer noch sehen können, ist der Zugriff auf die Mitglieder private und protected auf außerhalb von der Klasse nicht ohne Reflektion möglich

<?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_export und var_dump sind Debugger-Funktionen . Sie bieten Informationen zu einer Variablen in einer für Menschen lesbaren Form. Diese drei Funktionen zeigen die protected- und private-Eigenschaften von Objekten mit PHP 5. Statische Klassenmitglieder werden nicht angezeigt.


Mehr Ressourcen:


1083

In der Regel wird empfohlen, die niedrigste erforderliche Sichtbarkeit zu verwenden, da dies die Datenkapselung und ein gutes Schnittstellendesign fördert. Wenn Sie die Sichtbarkeit von Elementvariablen und -methoden berücksichtigen, denken Sie an die Rolle, die das Element bei der Interaktion mit anderen Objekten spielt.

Wenn Sie "eher eine Schnittstelle als eine Implementierung codieren", ist es normalerweise ziemlich einfach, Entscheidungen zur Sichtbarkeit zu treffen. Im Allgemeinen sollten Variablen privat oder geschützt sein, es sei denn, Sie haben einen guten Grund, sie offenzulegen. Verwenden Sie stattdessen öffentliche Zugriffsmethoden (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 machen Sie eine begrenzte Anzahl von Aktionen als öffentliche Methoden verfügbar. Die Schnittstelle zu einem Auto kann Methoden wie accelerate(), deccelerate()/brake(), setGear(), turnLeft(), turnRight() usw. enthalten.

Der Fahrer weiß nicht und sollte sich auch nicht darum kümmern, wie diese Aktionen von den Fahrzeuginnenräumen ausgeführt werden, und es könnte für den Fahrer und andere Verkehrsteilnehmer gefährlich sein, diese Funktionalität freizulegen. Daher die bewährte Methode, eine öffentliche Schnittstelle zu entwerfen und die Daten hinter dieser Schnittstelle zu kapseln.

Dieser Ansatz ermöglicht es Ihnen auch, die Implementierung der öffentlichen Methoden in Ihrer Klasse zu ändern und zu verbessern, ohne den Vertrag der Schnittstelle mit dem Clientcode zu brechen. Sie könnten beispielsweise die Methode accelerate() verbessern, um Kraftstoff zu sparen, die Verwendung dieser Methode würde jedoch unverändert bleiben. Der Client-Code würde keine Änderungen erfordern, aber dennoch die Vorteile Ihrer Effizienzsteigerung nutzen.

Edit: Da Sie sich noch mitten im Lernen objektorientierter Konzepte befinden (die viel schwieriger zu beherrschen sind als die Syntax einer Sprache), empfehle ich hoch, a Kopie von PHP-Objekten, Mustern und Übungen von Matt Zandstra. In diesem Buch habe ich zuerst gelernt , 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.

82
The Awnry Bear

privat - kann nur über WITHIN der Klasse aufgerufen werden

protected - kann über die Klassen WITHIN und die Klassen INHERITING aufgerufen werden

public - kann auch über den Code AUSSERHALB der Klasse aufgerufen werden

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

73
Olaf

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 von Benutzern der Klasse nicht zugegriffen werden, aber auf eine 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 Kind aufgerufen werden kann, das die Klasse erweitert.

25
Matthew Watts

Sichtbarkeitsbereiche mit Abstract-Beispielen :: vereinfacht das Verständnis

Diese Sichtbarkeit einer Eigenschaft oder Methode wird definiert, indem die Deklaration eines der drei Schlüsselwörter (Public, protected und private) vorab festgelegt wird.

Public: Wenn eine Eigenschaft oder Methode als public definiert ist, bedeutet dies, dass sie von allem, was sich auf ein Objekt bezieht, sowohl von diesem als auch von diesem manipuliert werden kann.

  • Zusammenfassung zB Stellen Sie sich den öffentlichen Sichtbarkeitsbereich als "öffentliches Picknick" vor, zu dem jeder kommen kann.

Protected: Wenn eine Eigenschafts- oder Methodensichtbarkeit für geschützte Elemente festgelegt ist, kann nur innerhalb der Klasse selbst und durch geerbte & ererbende Klassen auf sie zugegriffen werden. (Geerbt: - Eine Klasse kann alle Eigenschaften und Methoden einer anderen Klasse haben.).

  • Stellen Sie sich einen geschützten Sichtbarkeitsbereich als "Firmenpicknick" vor, wo Unternehmensmitglieder und ihre Familienmitglieder nicht der Öffentlichkeit gestattet sind. Dies ist die am häufigsten verwendete Einschränkung.

Private: Wenn eine Eigenschafts- oder Methodensichtbarkeit auf privat gesetzt ist, kann nur die Klasse, die über private Mitglieder verfügt, auf diese Methoden und Eigenschaften (intern innerhalb der Klasse) zugreifen, ungeachtet der Klassenbeziehung, die dort vorhanden ist.

  • mit Picknick-Analogie denken Sie als "Firmenpicknick, wo nur die Firmenmitglieder erlaubt sind" im Picknick. weder familie noch allgemeine öffentlichkeit sind erlaubt.
16
Suman K.C
/**
 * 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/de/language.oop5.visibility.php

14
Techie

⚡️ Hier finden Sie eine einfache Möglichkeit, sich den Geltungsbereich von public, protected und private zu merken.

PUBLIC:

  • public scope: Eine öffentliche Variable/Funktion steht sowohl Objekten als auch anderen Klassen zur Verfügung.

PROTECTED:

  • protected scope: 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 scope: Eine private Variable/Funktion ist nur in der aktuellen Klasse sichtbar, in der sie definiert wird.
  • Nein! Klasse, die die aktuelle Klasse erweitert, kann nicht auf diesen Bereich zugreifen.
  • Nein! Objekte können nicht auf diesen Bereich zugreifen.

Lesen Sie die Visibility einer Methode oder Variablen im Handbuch PHP.

11
Ahmad Awais

Betrachten von "when":
Ich neige dazu, alles zunächst als privat zu erklären, wenn ich 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 nirgendwo anders als in der Klasse selbst verwendet wurde. Eine öffentliche Methode kann bereits überall verwendet werden und erfordert möglicherweise ein umfassendes Neuschreiben.

Update : Ich setze mich heutzutage für protected ein, da ich herausfand, dass es gut genug für die Kapselung ist und nicht stört, wenn ich Klassen ausdehne. . Nur wenn ich einen guten Grund habe, die anderen beiden zu verwenden, werde ich das tun.

Ein guter Grund für eine private-Methode wäre einer, der diesem Objekt inhärent etwas implementiert, das selbst eine sich erweiternde Klasse nicht ändern sollte (sachlicher Grund neben Kapselung wie interne Zustandsverwaltung). Irgendwann ist es immer noch leicht genug herauszufinden, wo normalerweise eine protected-Methode verwendet wird, so dass ich heute standardmäßig protected setze. Vielleicht nicht 100% objektiv "in den Gräben" erleben, gebe ich zu.

8
DanMan

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) dazu zwingen möchten, Getters/Setter außerhalb der Klasse zu verwenden, wenn Sie auf Variablen zugreifen und diese setzen. Sie sollten jedoch konsistent sein und die Getters und Setter innerhalb der Klasse verwenden Klasse auch). Dies oder private ist normalerweise die Standardmethode, mit der Sie alle Klasseneigenschaften einrichten sollten.

Warum? Denn wenn Sie sich irgendwann in der Zukunft (vielleicht sogar in nur 5 Minuten) entscheiden, den für diese Eigenschaft zurückgegebenen Wert zu manipulieren oder etwas damit zu tun, bevor Sie/setting abrufen/setzen, 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: Die Eigenschaften von private sind den Eigenschaften von protected sehr ähnlich. Das Unterscheidungsmerkmal/der Unterschied besteht jedoch darin, dass private es auch für untergeordnete Klassen unzugänglich macht, ohne den Getter oder Setter der übergeordneten Klasse zu verwenden.

Wenn Sie also Getters und Setter für eine Eigenschaft verwenden (oder wenn sie nur intern von der übergeordneten Klasse verwendet wird und nirgendwo sonst zugänglich sein soll), können Sie sie genauso gut zu private machen. Nur um zu verhindern, dass jemand versucht, es direkt zu verwenden und Fehler einführt .

Beispiel für die Verwendung in einer untergeordneten Klasse (die MyObject erweitert):

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

Das PHP-Handbuch hat eine gute Lektüre der Frage hier

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 Teilnehmer können überall aufgerufen werden. Auf geschützte deklarierte Mitglieder kann nur innerhalb der Klasse selbst sowie von vererbten und übergeordneten Klassen zugegriffen werden. Auf als privat deklarierte Mitglieder kann nur von der Klasse, die das Mitglied definiert, zugegriffen werden. 

6
code_burgar

Variablen in PHP sind in drei verschiedenen Typen gegliedert:

Public: Werte dieser Variablentypen sind in allen Gültigkeitsbereichen verfügbar und können bei Ausführung Ihres Codes aufgerufen werden Deklarieren als: public $examTimeTable;

Privat: Werte dieses Variablentyps sind nur für die Klasse verfügbar, zu der er gehört. private $classRoomComputers;

Geschützt: Werte dieser Klasse nur und nur verfügbar, wenn Access in Form einer Vererbung oder ihrer Kindklasse erteilt wurde. In der Regel wird :: verwendet, um den Zugriff durch die übergeordnete Klasse zu gewähren

protected $familyWealth;

4
star18bit

Sie sind da, um verschiedene Ebenen der Verkapselung zuzulassen.

4
Mchl

Eine alte Frage wiederbeleben, aber ich denke, ein wirklich guter Weg, um dies zu denken, ist in Bezug auf die API, die Sie definieren.

  • public - Alles, was als öffentlich gekennzeichnet ist, ist Teil der API, auf die jeder, der Ihre Klasse/Schnittstelle/andere verwendet, verwendet wird und auf die er sich verlassen kann.

  • protected - Lassen Sie sich nicht täuschen, dies ist auch Teil der API! Benutzer können eine Unterklasse erstellen, Ihren Code erweitern und alles, was als geschützt markiert ist, verwenden.

  • 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 Bedingungen:

  • Änderungen an public oder protected sollten als wichtige Änderungen betrachtet werden. 

  • Alles Neue public oder protected sollte (mindestens) MINOR sein

  • Nur neue/Änderungen an etwas private können PATCH sein

In Bezug auf die Code-Pflege ist es gut, darauf zu achten, welche Dinge Sie public oder protected machen, denn dies sind die Dinge, die Sie Ihren Benutzern versprechen.

3
mcfedr

Wenn wir objektorientierten PHP in unserem Projekt folgen, sollten wir einige Regeln zur Verwendung von Zugriffsmodifizierern in PHP befolgen. Heute werden wir klar lernen, was ein Zugriffsmodifizierer ist und wie wir ihn verwenden können. Mit den Zugriffsmodifizierern von PHP werden Zugriffsrechte für PHP - Klassen und deren Member festgelegt, die die im Klassenbereich definierten Funktionen und Variablen darstellen. In PHP gibt es drei Bereiche für die Teilnehmer.

  1. ÖFFENTLICHKEIT
  2. PRIVATGELÄNDE
  3. GESCHÜTZT

Sehen wir uns nun das folgende Bild an, um die Zugriffsebene des Zugriffsmodifizierers zu verstehen  enter image description here

Sehen wir uns nun die folgende Liste an, um über mögliche PHP Schlüsselwörter zu erfahren, die als Zugriffsmodifizierer verwendet werden.

public: - Mit diesem Zugriffsmodifizierer definierte Klassen oder deren Mitglieder sind von überall aus öffentlich zugänglich, auch 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. Sie schützt Mitglieder vor dem Zugriff von außerhalb der Klasse.

protected: - wie privat, außer, dass Unterklassen Zugriff auf geschützte Superklassenmitglieder gewährt wird.

Sehen Sie sich nun die Tabelle an, um den Zugriffsmodifizierer zu verstehen. Den ganzen Artikel lesen php access modifire

1

Öffentlich: Ist ein Standardzustand, wenn Sie eine Variable oder eine Methode deklarieren. Sie können von jedem Objekt direkt auf das Objekt zugreifen.

Geschützt: Kann nur innerhalb des Objekts und der Unterklassen aufgerufen werden.

Privat: Kann nur innerhalb des Objekts referenziert werden, nicht in Unterklassen.

1
Nomadme