5 Stimmen

Php objektorientierte Sichtbarkeit

Ich bin ein wenig verwirrt über diesen Absatz zur Sichtbarkeit in PHP. War neugierig, ob mir jemand das erklären könnte. Beispiele wären SUPER! Mein Gehirn funktioniert gerade nicht klar.

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

Der erste Absatz lautet:

Die Sichtbarkeit einer Eigenschaft oder Methode kann definiert werden, indem das Deklaration mit den Schlüsselwörtern public, protected oder private versehen wird. Klassenmember, die als public deklariert sind, können überall zugegriffen werden. Member, die als protected deklariert sind, können nur innerhalb der Klasse selbst und von abgeleiteten und Elternklassen zugegriffen werden. Members, die als private deklariert sind, können nur von der Klasse, die das Member definiert, zugegriffen werden.

Wie kann eine Elternklasse auf ein Mitglied einer Kindklasse zugreifen?

5voto

deceze Punkte 489288

Das ist so:

class A {
    public function test() {
        $b = new B;
        echo $b->foo;
    }
}

class B extends A {
    protected $foo = 'bar';
}

$a = new A;
$a->test();

1 Stimmen

Das sieht so falsch aus. Kein Wunder, dass PHP die ganze Zeit mit dem hässlichen Stock bemalt wird ;-)

0 Stimmen

@Phil Ja, ob dieses Muster empfohlen wird oder nicht, ist eine andere Geschichte... ;-)

1 Stimmen

Dies gilt auch beim Zugriff auf Eigenschaften aus statischen Funktionen.

1voto

mario Punkte 141130

PHP ist eine interpretierte Sprache. Eigenschaften werden zur Laufzeit aufgelöst, nicht in der Kompilierungsphase. Und Zugriffsmodifizierer werden nur überprüft, wenn auf eine Eigenschaft zugegriffen wird.

Es macht keinen Unterschied, ob Sie eine neue (nicht deklarierte) Eigenschaft ad hoc einfügen, damit sie öffentlich wird, oder ob Sie eine geschützte Eigenschaft in einer abgeleiteten Klasse deklarieren.

Das private betrifft wirklich nur die Zugänglichkeit von außen. Die Auflösung von ->name zur Laufzeit funktioniert unabhängig davon. Und der PHP-Interpreter kümmert sich einfach nicht darum, ob die Eigenschaftserklärung für die aktuelle Objektklasse gemacht wurde. (Im Gegensatz zu privaten Erklärungen.)

1voto

parvas Punkte 11

Öffentlicher Bereich: Eine Eigenschaft (Methode, Variable usw.) kann von jeder Klasse in jeder Datei aus zugegriffen werden.

class Beispiel {
    public $foo;
}

$beispiel = new Beispiel;
$beispiel->foo = 3; // alles in Ordnung

privater Bereich: Eine Eigenschaft kann nur von derselben Klasse aus zugegriffen werden.

class Beispiel {
    private $foo;
}

class Kind_Klasse erweitert Beispiel {

    public function einige_methode()
    {
        parent::foo = 3; // Fehler wird ausgelöst
    }
}

geschützter Bereich: Eine Eigenschaft kann nur von derselben Klasse oder von anderen Klassen, die sie erweitern, aus zugegriffen werden.

class Beispiel {
    protected $foo;
}

class Kind_Klasse erweitert Beispiel {

    public function einige_methode()
    {
        parent::foo = 3; // das ist in Ordnung
    }
}

Es hat alles mit einer Technik namens Kapselung zu tun, bei der man nicht zulassen darf, dass der Zustand oder das Verhalten eines Klassenmembers außerhalb der Klasse geändert wird. http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)

0voto

James.Valon Punkte 81

Geschützt ist eine Art von Sichtbarkeit, die Eigenschaften und Methoden, die als protected deklariert wurden, in den Kindklassen der deklarierten Klasse verfügbar macht.

class Parent {
    public $name = 'MeinName';
    protected $age = 20;
    private $school = 'MeineSchule';
}
class Child extends Parent {
   public function __construct() {
       echo $this -> name; // gültig als public
       echo $this -> age; // gültig als protected
       echo $this -> school; // ungültig als private
   }
}

Dort verstehen Sie, dass protected etwas ist, das bei der Vererbung verwendet wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X