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


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

832
2017-12-05 22:13


Ursprung


Antworten:


Sie nutzen:

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

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

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

Mehr: (Für umfassende Informationen)


1080
2017-12-05 22:17



dd

Öffentlichkeit:

Wenn Sie eine Methode (Funktion) oder eine Eigenschaft (Variable) als deklarieren publicDiese Methoden und Eigenschaften können wie folgt aufgerufen werden:

  • Die gleiche 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 protectedAuf diese Methoden und Eigenschaften kann zugegriffen werden

  • Die gleiche 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 es nicht sind Objektinstanzen der deklarierten Klasse selbst.

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 geschützte Eigenschaft GrandPa :: $ name nicht möglich


Privatgelände:

Wenn Sie eine Methode (Funktion) oder eine Eigenschaft (Variable) als deklarieren privateDiese Methoden und Eigenschaften können wie folgt aufgerufen werden:

  • Die gleiche Klasse, die es deklariert hat.

Outsider-Mitglieder können nicht auf diese Variablen zugreifen. Outsider in dem Sinne, dass sie es nicht sind Objektinstanzen der deklarierten Klasse selbst und sogar die Klassen das erben Sie die deklarierte Klasse.

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 private Eigenschaft GrandPa :: $ name nicht möglich


Zerlegung der Opa Klasse mit Betrachtung

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

Mit Nachdenken können Sie das tun Außergewöhnlich indem Sie sogar zugreifen protected und private Mitglieder außerhalb der Klasse!

Nun, was ist Reflexion?

Reflection bietet die Möglichkeit, Klassen, Interfaces,   Funktionen, Methoden und Erweiterungen. Zusätzlich bieten sie Möglichkeiten an   Dokumentkommentare für Funktionen, Klassen und Methoden abrufen

Präambel

Wir haben eine Klasse namens Grandpas und sagen wir haben drei Eigenschaften. Betrachten Sie zum besseren Verständnis drei Großväter mit Namen:

  • Mark Henry
  • John Clash
  • Will Jones

Lass uns sie machen (Modifikatoren zuweisen) public, protected und private beziehungsweise. Das weißt du sehr gut protected und private Auf Mitglieder kann nicht außerhalb der Klasse zugegriffen werden. Jetzt widersprechen wir 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 das folgende Beispiel nicht. Wie Sie noch sehen können, die private und protectedMitglieder können nicht erreicht werden draußen der Klasse ohne Reflexion

<?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 präsentieren Informationen über eine Variable in einer für Menschen lesbaren Form. Diese drei Funktionen werden die protected und private Eigenschaften von Objekten mit PHP 5. Statische Klassenmitglieder werden nicht gezeigt werden.


Mehr Ressourcen:



1015
2018-02-20 08:35



Es wird in der Regel als gute Methode angesehen, auf die niedrigste erforderliche Sichtbarkeit zu setzen, da dies die Datenkapselung und das gute Interface-Design fördert. Berücksichtigen Sie bei der Betrachtung der Sichtbarkeit von Membervariablen und Methoden die Rolle, die das Mitglied bei der Interaktion mit anderen Objekten spielt.

Wenn Sie "Code an eine Schnittstelle statt an die Implementierung" schreiben, ist es normalerweise ziemlich einfach, Transparenzentscheidungen 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 Accessoren (Getter / Setter), um den Zugriff auf die Interna einer Klasse einzuschränken und zu regeln.

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 geben Sie eine begrenzte Anzahl von Aktionen als öffentliche Methoden an. Die Schnittstelle zu einem Auto könnte Methoden wie z accelerate(), deccelerate()/brake(), setGear(), turnLeft(), turnRight(), etc.

Der Fahrer weiß es nicht und sollte sich auch nicht darum kümmern, wie diese Aktionen durch die Inneneinrichtungen des Fahrzeugs ausgeführt werden, und diese Funktionalität könnte gefährlich für den Fahrer und andere Verkehrsteilnehmer sein. Daher die gute Praxis, eine öffentliche Schnittstelle zu entwerfen und die Daten hinter dieser Schnittstelle zu kapseln.

Dieser Ansatz ermöglicht Ihnen auch, die Implementierung der öffentlichen Methoden in Ihrer Klasse zu ändern und zu verbessern, ohne den Vertrag der Schnittstelle mit dem Clientcode zu unterbrechen. Zum Beispiel könnten Sie das verbessern accelerate() Methode, um treibstoffeffizienter zu sein, aber die Verwendung dieser Methode würde gleich bleiben; Client-Code würde keine Änderungen erfordern, aber dennoch die Vorteile Ihrer Effizienzverbesserung nutzen.

Bearbeiten: Da es scheint, dass Sie immer noch mitten im Lernen von objektorientierten Konzepten sind (die viel schwieriger zu meistern sind als die Syntax jeder Sprache), I höchst empfehlen, eine Kopie von PHP-Objekte, Muster und Übung von Matt Zandstra. Das ist das Buch, das mich zuerst gelehrt hat Wie OOP effektiv einzusetzen, anstatt mir nur die Syntax beizubringen. Ich hatte die Syntax Jahre zuvor gelernt, aber das war nutzlos, ohne das "Warum" von OOP zu verstehen.


81
2017-09-03 20:17



privat - kann nur von WITHIN der Klasse zugegriffen werden

protected - Zugriff von WITHIN auf die Klassen und INHERITING-Klassen

öffentlich - kann auch über den Code OUTSIDE der Klasse aufgerufen werden

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


69
2017-12-05 22:17



Der Unterschied ist wie folgt:

Public :: Auf eine öffentliche Variable oder Methode kann direkt von jedem Benutzer der Klasse zugegriffen werden.

Protected :: Auf eine geschützte Variable oder Methode kann nicht von Benutzern der Klasse zugegriffen werden, auf sie kann jedoch innerhalb einer Unterklasse zugegriffen werden, die von der Klasse erbt.

Private :: Auf eine private Variable oder Methode kann nur intern von der Klasse 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.


23
2017-09-03 19:51



Sichtbarkeitsbereiche mit Abstrakte Beispiele :: Erleichtert das Verständnis

Diese Sichtbarkeit einer Eigenschaft oder Methode wird durch Vorabfeststellung einer der drei Schlüsselworte (öffentlich, geschützt und privat) definiert.

Öffentlichkeit Wenn eine Eigenschaft oder Methode als public definiert ist, bedeutet dies, dass sie sowohl auf Objekte zugreifen als auch von ihnen manipuliert werden kann.

  • Zusammenfassung zB Denke über den öffentlichen Sichtbarkeitsbereich nach "öffentliches Picknick" zu dem jeder kommen kann.

Geschützt: Wenn eine Sichtbarkeit einer Eigenschaft oder Methode auf geschützte Elemente festgelegt ist, kann nur auf die Klasse selbst und auf geerbte und vererbende Klassen zugegriffen werden. (Vererbt: - Eine Klasse kann alle Eigenschaften und Methoden einer anderen Klasse haben).

  • Als geschützter Sichtbarkeitsbereich gelten "Firmenpicknick" wo Firmenmitglieder und ihre Familienmitglieder nicht der Öffentlichkeit erlaubt sind. Dies ist die häufigste Einschränkung des Gültigkeitsbereichs.

Privatgelände : Wenn die Sichtbarkeit einer Eigenschaft oder Methode auf "privat" gesetzt ist, kann nur die Klasse mit den privaten Mitgliedern auf diese Methoden und Eigenschaften zugreifen (intern innerhalb der Klasse), ungeachtet der Klassenbeziehung.

  • mit Picknick-Analogie denke als "Firmenpicknick, wo nur die Firmenmitglieder erlaubt sind" im Picknick. weder Familie noch Öffentlichkeit sind erlaubt.

15
2018-02-07 03:07



/**
 * 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


14
2017-10-03 11:01