Bei der objektorientierten Programmierung stellt PHP eine Reihe von magischen Methoden zur Verfügung, die viel Komfort beim Programmieren bieten. Magische Methoden in PHP beginnen normalerweise mit (zwei Unterstrichen) und erfordern keine expliziten Aufrufe, sondern werden durch bestimmte Bedingungen ausgelöst.
Konstruktor und Destruktor
Konstruktor und Destruktor werden aufgerufen, wenn das Objekt erstellt bzw. zerstört wird. Wenn ein Objekt „zerstört“ wird, bedeutet dies, dass es keinen Verweis auf das Objekt gibt. Wenn beispielsweise die Variable, die auf das Objekt verweist, gelöscht (nicht gesetzt) wird oder die Skriptausführung endet, wird der Destruktor aufgerufen.
construct()
construct() Der Konstruktor ist mit Abstand die am häufigsten verwendete Funktion. Wenn ein Objekt erstellt, können Sie im Konstruktor einige Initialisierungsarbeiten durchführen. Sie können für den Konstruktor beliebig viele Parameter definieren, sofern bei der Instanziierung die entsprechende Anzahl Parameter übergeben wird. Jede im Konstruktor auftretende Ausnahme verhindert, dass das Objekt erstellt wird.
class Device { public function construct(Battery $battery, $name) { $this->battery = $battery; $this->name = $name; $this->connect(); } }
Im obigen Beispielcode weist der Konstruktor der Device-Klasse den Mitgliedseigenschaften Werte zu und ruft die connect()-Methode auf.
Die Deklaration des Konstruktors als private Methode verhindert, dass Objekte außerhalb der Klasse erstellt werden, was häufig im Simplex-Muster verwendet wird.
destruct()
Der Destruktor wird normalerweise aufgerufen, wenn das Objekt zerstört wird. Der Destruktor erhält keine Parameter. Im Destruktor werden häufig einige Aufräumarbeiten durchgeführt, z. B. das Schließen der Datenbankverbindung usw.
Eigenschaftsüberladung
Eine Sache ist, dass „Überladung“ in PHP nicht dasselbe ist wie Überladung in den meisten anderen Sprachen, obwohl sie alle die gleiche Funktion implementieren .
Die beiden magischen Methoden beim Überladen von Eigenschaften werden hauptsächlich zur Handhabung des Eigenschaftszugriffs verwendet und definieren, was passiert, wenn wir versuchen, auf eine nicht vorhandene (oder unzugängliche) Eigenschaft zuzugreifen.
get()
Die magische Methode get() wird aufgerufen, wenn wir versuchen, auf eine nicht vorhandene Eigenschaft zuzugreifen. Es empfängt einen Parameter, der den Namen des Attributs darstellt, auf das zugegriffen wird, und gibt den Wert des Attributs zurück. In der Geräteklasse oben gibt es ein Datenattribut, das hier eine Rolle spielt, wie im folgenden Code gezeigt:
class Device { public function get($name) { if(array_key_exists($name, $this->data)) { return $this->data[$name]; } return null; } }
Der am häufigsten verwendete Ort für diese magische Methode ist das Erstellen eines „Lese-“ Nur das Attribut „“ zum Erweitern der Zugriffskontrolle. In der oben genannten Battery-Klasse gibt es eine private Eigenschaft $charge, die wir über die magische Methode get() erweitern können, damit sie außerhalb der Klasse lesbar, aber nicht änderbar ist. Der Code lautet wie folgt:
class Battery { private $charge = 0; public function get($name) { if(isset($this->$name)) { return $this->$name; } return null; } }
set()
Die magische Methode set() wird aufgerufen, wenn wir versuchen, eine unzugängliche Eigenschaft zu ändern. Sie empfängt zwei Parameter, ein Name, der das Attribut darstellt, und ein Wert, der das Attribut darstellt. Der Beispielcode lautet wie folgt:
class Device { public function set($name, $value) { // use the property name as the array key $this->data[$name] = $value; } }
isset()
Die magische Methode isset() wird aufgerufen, wenn die Methode isset() auf einem nicht zugänglichen Objekt aufgerufen wird Eigenschaft. Es erhält einen Parameter, der den Namen des Attributs darstellt. Es sollte einen booleschen Wert zurückgeben, der angibt, ob die Eigenschaft vorhanden ist. Der Code lautet wie folgt:
class Device { public function isset($name) { return array_key_exists($name, $this->data); } }
unset()
Die magische Methode unset() wird aufgerufen, wenn die Funktion unset() aufgerufen wird, um ein unzugängliches Objekt zu zerstören Eigenschaft. Empfängt einen Parameter, der den Namen des Attributs ausdrückt.
Objekt in String konvertieren
Manchmal müssen wir das Objekt in Form eines Strings ausdrücken. Wenn wir ein Objekt direkt drucken, gibt das Programm eine Fehlermeldung aus: PHP Catchable fatal error: Object of class Device konnte nicht in string umgewandelt werden
toString()
toString() wird aufgerufen, wenn wir das Objekt als String verwenden. Es erhält keine Parameter. Mit dieser Methode können wir die Darstellung des Objekts definieren. Der Code lautet wie folgt:
class Device { public function toString() { $connected = (isset($this->connection)) ? 'connected' : 'disconnected'; $count = count($this->data); return $this->name . ' is ' . $connected . ' with ' . $count . ' items in memory' . PHP_EOL; } ... }
set_state()(PHP 5.1)
Statische magische Methode set_state(), die aufgerufen wird, wenn wir var_export( verwenden )-Funktion, um ein Objekt als Methode auszugeben. Die Funktion var_export() wird zum Konvertieren von PHP-Variablen in PHP-Code verwendet. Sie erhält ein assoziatives Array, das Objektattributwerte als Parameter enthält. Der Beispielcode lautet wie folgt:
class Battery { //... public static function set_state(array $array) { $obj = new self(); $obj->setCharge($array['charge']); return $obj; } //... }
Objekt klonen
Standardmäßig werden Objekte als Referenz übergeben. Wenn Sie also ein Objekt einer anderen Variablen zuweisen, erstellen Sie nur eine Referenz auf das Objekt und kopieren das Objekt nicht. Um ein Objekt tatsächlich zu kopieren, müssen wir das Schlüsselwort clone verwenden.
Diese „Pass-by-Reference“-Strategie gilt auch für Objekte, die in Objekten enthalten sind. Selbst wenn wir ein Objekt klonen, werden alle Objekte innerhalb des Objekts nicht geklont, sodass das Endergebnis darin besteht, dass beide Objekte dasselbe interne Objekt verwenden. Der Beispielcode lautet wie folgt:
$device = new Device(new Battery(), 'iMagic'); $device2 = clone $device; $device->battery->setCharge(65); echo $device2->battery->charge; // 65
clone()
clone() Die magische Methode clone() kann das oben genannte Problem lösen. Diese magische Methode wird aufgerufen, wenn das Schlüsselwort clone für ein Objekt verwendet wird. Bei dieser magischen Methode können wir jedes Unterobjekt klonen. Der Code lautet wie folgt:
class Device { ... public function clone() { // copy our Battery object $this->battery = clone $this->battery; } ... }
序列化是讲任意数据转换为字符串格式的过程。序列化通常用来将整个对象存入数据库或写入文件中。当反序列化存储的数据时,我们可以得到序列化之前的对象。但是,并不是所有得数据都可以被序列化,比如数据库连接。幸运的是,有一个魔术方法可以帮我们解决这个问题。
sleep()
魔术方法sleep()在对一个对象序列化时(调用serialize())会被调用。它不接收任何参数,而且应该返回一个包含所有应该被序列化的属性的数组。在该魔术方法中,也可以执行一些其他操作。
有一点要注意的是,不要再该函数中进行任何的析构操作,因为这可能会影响正在运行的对象。
示例代码如下:
class Device { public $name; public $battery; public $data = array(); public $connection; //... public function sleep() { return array('name', 'battery', 'data'); } //... }
wakeup()
魔术方法wakeup()在对存储的对象反序列化时会被调用。它不接收任何参数,也没有任何返回值。可以用它来处理在序列化时丢失的数据库连接或资源。代码如下:
class Device { //... public function wakeup() { // reconnect to the network $this->connect(); } //... }
方法重载
PHP还有两个与成员方法相关的魔术方法call()和callStatic(),这两个魔术方法类似于属性重载方法。
call()
魔术方法call()在调用不存在或不可访问的方法时会被调用。它接收两个参数,一个是调用的方法的名字,一个是包含函数参数的数组。我们可以使用这种方法调用子对象中得同名函数。
在这个例子中,要注意函数call_user_func_array(),这个函数允许我们动态调用一个命名的函数。
示例代码如下:
class Device { //... public function call($name, $arguments) { // make sure our child object has this method if(method_exists($this->connection, $name)) { // forward the call to our child object return call_user_func_array(array($this->connection, $name), $arguments); } return null; } //... }
callStatic()
魔术方法callStatic()与call()的功能一样,唯一不同的是,该方法在尝试访问一个不存在或不可访问的静态方法时会被调用。示例代码如下:
class Device { //... public static function callStatic($name, $arguments) { // make sure our class has this method if(method_exists('Connection', $name)) { // forward the static call to our class return call_user_func_array(array('Connection', $name), $arguments); } return null; } //... }
其他:autoload()
autoload()方法并不是一个魔术方法,但是这个方法非常有用。但是,对着PHP版本的更新,该函数已经不建议使用,取而代之的是spl_auto_register()函数。
Das obige ist der detaillierte Inhalt vonZusammenfassung der Codeanweisungen für gängige magische Methoden in PHP objektorientiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!