1. Einführung
Seit PHP 5 wurde das Objektmodell komplett neu geschrieben, um eine bessere Leistung und mehr Funktionen zu erhalten. Dies ist die größte Änderung seit PHP 4. PHP 5 verfügt über ein vollständiges Objektmodell.
Zu den neuen Funktionen in PHP 5 gehören Zugriffskontrolle, abstrakte und endgültige Klassen und Methoden, zusätzliche magische Methoden, Schnittstellen, Objektkopieren und Typbeschränkungen.
PHP behandelt Objekte auf die gleiche Weise wie Referenzen und Handles, d. h. jede Variable enthält eine Referenz auf das Objekt und nicht eine Kopie des gesamten Objekts.
2. Grundkonzepte
1.Klasse
Die Definition jeder Klasse beginnt mit dem Schlüsselwort class, gefolgt vom Klassennamen, gefolgt von einem Paar geschweifter Klammern. inside Enthält Definitionen von Klassenattributen und -methoden.
Der Klassenname kann ein beliebiges zulässiges Tag sein, das kein PHP-reserviertes Wort ist. Der Name einer juristischen Klasse beginnt mit einem Buchstaben oder Unterstrich, gefolgt von einer Reihe von Buchstaben, Zahlen oder Unterstrichen. Als regulärer Ausdruck ausgedrückt: [a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*.
Eine Klasse kann ihre eigenen Konstanten, Variablen (genannt „Eigenschaften“) und Funktionen (genannt „Methoden“) enthalten.
Beispiel #1 Einfache Klassendefinition
<?php class SimpleClass { //声明属性 public $var = '1'; //声明方法 public function displayVar(){ echo $this->var; } } ?>
Wenn eine Methode innerhalb einer Klassendefinition aufgerufen wird, steht eine Pseudovariable $this zur Verfügung. $this ist ein Verweis auf das aufrufende Objekt (normalerweise das Objekt, zu dem die Methode gehört, möglicherweise aber auch ein anderes Objekt, wenn es statisch von einem zweiten Objekt aufgerufen wird).
Beispiel #2 Beispiel einer $this-Pseudovariable
<?php class A { function foo() { if(isset($this)){ echo '$this is defined ('; echo get_class($this); echo ')<br>'; }else{ echo '$this is not defined.<br>'; } } } class B { function bar() { //如果开启了E_STRICT这一行会有警告提示 A::foo(); } } $a = new A(); $a -> foo(); //如果开启了E_STRICT这一行会有警告提示 A::foo(); $b = new B(); $b -> bar(); //如果开启了E_STRICT这一行会有警告提示 B::bar(); ?>
Ausgabeergebnis:
$this ist definiert (A)
$this ist nicht definiert.
$ Dies ist definiert (B)
$dies ist nicht definiert.
2.new
Um eine Instanz einer Klasse zu erstellen, müssen Sie das Schlüsselwort new verwenden. Einem neuen Objekt wird beim Erstellen immer ein Wert zugewiesen, es sei denn, das Objekt definiert einen Konstruktor und bei einem Fehler wird eine Ausnahme ausgelöst. Klassen sollten vor der Instanziierung definiert werden (und in manchen Fällen ist dies notwendig).
Wenn auf new eine Zeichenfolge folgt, die den Klassennamen enthält, wird eine Instanz der Klasse erstellt. Wenn die Klasse zu einem Namensraum gehört, muss ihr vollständiger Name verwendet werden.
Beispiel #3 Erstellen Sie eine Instanz
<?php $instance = new SimpleClass(); //也可以这样做: $className = "Foo"; $instance = new $className(); //Foo() ?>
Innerhalb der Klassendefinition können Sie „new self“ und „new parent“ verwenden, um neue Objekte zu erstellen.
Wenn Sie einer neuen Variablen eine bereits erstellte Instanz eines Objekts zuweisen, greift die neue Variable auf dieselbe Instanz zu, als ob sie mit dem Objekt zugewiesen wäre. Dieses Verhalten ist dasselbe wie bei der Übergabe einer Instanz an eine Funktion. Mithilfe des Klonens können Sie eine neue Instanz eines bereits erstellten Objekts erstellen.
Beispiel #4 Objektzuweisung
include_once('class1.php'); $instance = new SimpleClass(); $assigned = $instance; $reference = & $instance; $instance -> var = '$assigned will have this value'; $instance = null; //$instance和$reference变成null var_dump($instance); var_dump($reference); var_dump($assigned);
Das Ausgabeergebnis ist:
NULL
NULL
object(SimpleClass)#1 (1) { ["var" ] => string(30) „$assigned wird diesen Wert haben“ }
PHP 5.3.0 führt zwei neue Methoden zum Erstellen einer Instanz eines Objekts ein:
c
lass Test { static public function getNew() { return new static; } } class Child extends Test {} $obj1 = new Test(); $obj2 = new $obj1; var_dump($obj1 !== $obj2); $obj3 = Test::getNew(); var_dump($obj3 instanceof Test); $obj4 = Child::getNew(); var_dump($obj4 instanceof Child);
Ausgabeergebnis:
bool(true)
bool(true)
bool(true)
3.extends
Eine Klasse kann die Methoden und Eigenschaften einer anderen Klasse erben, indem sie das Schlüsselwort „extends“ in der Deklaration verwendet. PHP unterstützt keine Mehrfachvererbung. Eine Klasse kann nur eine Basisklasse erben (Einzelvererbung wie Java).
Geerbte Methoden und Eigenschaften können überschrieben werden, indem sie mit demselben Namen neu deklariert werden. Wenn die übergeordnete Klasse jedoch beim Definieren einer Methode final verwendet, kann die Methode nicht überschrieben werden. Auf überschriebene Methoden oder Eigenschaften kann über parent:: zugegriffen werden.
Beim Überschreiben einer Methode müssen die Parameter konsistent sein, andernfalls gibt PHP eine Fehlermeldung der Ebene E_STRICT aus. Die Ausnahme bilden Konstruktoren, die beim Überschreiben unterschiedliche Parameter annehmen können.
Beispiel #6 Einfache Klassenvererbung:
class ExtendClass extends SimpleClass { //重写父类的方法 function displayVar() { echo "Extending class<br>"; parent::displayVar(); } } $extended = new ExtendClass(); $extended -> displayVar();
Ausgabeergebnis:
Klasse erweitern
1
4.::class
Seit PHP 5.5 kann das Schlüsselwort class auch zum Parsen von Klassennamen verwendet werden. Mit ClassName::class können Sie eine Zeichenfolge erhalten, die den vollständig qualifizierten Namen der Klasse ClassName enthält. Dies ist besonders nützlich für Klassen, die Namespaces verwenden.
Beispiel #7 Parsen des Klassennamens
namespace NS{ class ClassName{} echo ClassName::class; }
Ausgabeergebnis:
NSClassName