Heim >Backend-Entwicklung >PHP-Problem >Was sind magische Methoden und magische Konstanten in PHP?
In PHP beziehen sich magische Methoden auf Methoden, die mit zwei Unterstrichen „__“ beginnen, wie z. B. „__call()“, „__get()“, „__set()“ usw.; magische Konstanten beziehen sich auf Methoden, die sich mit ändern ihre Position. Es gibt 8 Konstanten, die sich mit Änderungen an der Codeposition ändern, z. B. „__LINE__“, „__FILE__“ usw.
Die Betriebsumgebung dieses Tutorials: Windows 7-System, PHP-Version 7.1, DELL G3-Computer
PHP ist mit zwei Unterstrichen __ gekennzeichnet Code > Die Methoden am Anfang werden magische Methoden genannt und diese Methoden spielen in PHP eine zentrale Rolle. Zu den magischen Methoden gehören: <code>__
开头的方法称为魔术方法,这些方法在PHP中充当了举足轻重的作用。 魔术方法包括:
__construct()
,类的构造函数__destruct()
,类的析构函数__call()
,在对象中调用一个不可访问方法时调用__callStatic()
,用静态方式中调用一个不可访问方法时调用__get()
,获得一个类的成员变量时调用__set()
,设置一个类的成员变量时调用__isset()
,当对不可访问属性调用isset()
或empty()
时调用__unset()
,当对不可访问属性调用unset()
时被调用。__sleep()
,执行serialize()
时,先会调用这个函数__wakeup()
,执行unserialize()
时,先会调用这个函数__toString()
,类被当成字符串时的回应方法__invoke()
,调用函数的方式调用一个对象时的回应方法__set_state()
,调用var_export()
导出类时,此静态方法会被调用。__clone()
,当对象复制完成时调用__construct()
和__destruct()
构造函数和析构函数应该不陌生,他们在对象创建和消亡时被调用。例如我们需要打开一个文件,在对象创建时打开,对象消亡时关闭
<?php class FileRead { protected $handle = NULL; function __construct(){ $this->handle = fopen(...); } function __destruct(){ fclose($this->handle); } } ?>
这两个方法在继承时可以扩展,例如:
<?php class TmpFileRead extends FileRead { function __construct(){ parent::__construct(); } function __destruct(){ parent::__destruct(); } } ?>
__call()
和__callStatic()
在对象中调用一个不可访问方法时会调用这两个方法,后者为静态方法。这两个方法我们在可变方法(Variable functions)调用中可能会用到。
<?php class MethodTest { public function __call ($name, $arguments) { echo "Calling object method '$name' ". implode(', ', $arguments). "\n"; } public static function __callStatic ($name, $arguments) { echo "Calling static method '$name' ". implode(', ', $arguments). "\n"; } } $obj = new MethodTest; $obj->runTest('in object context'); MethodTest::runTest('in static context'); ?>
__get()
,__set()
,__isset()
和__unset()
当get/set一个类的成员变量时调用这两个函数。例如我们将对象变量保存在另外一个数组中,而不是对象本身的成员变量
<?php class MethodTest { private $data = array(); public function __set($name, $value){ $this->data[$name] = $value; } public function __get($name){ if(array_key_exists($name, $this->data)) return $this->data[$name]; return NULL; } public function __isset($name){ return isset($this->data[$name]) } public function unset($name){ unset($this->data[$name]); } } ?>
__sleep()
和__wakeup()
当我们在执行serialize()
和unserialize()
时,会先调用这两个函数。例如我们在序列化一个对象时,这个对象有一个数据库链接,想要在反序列化中恢复链接状态,则可以通过重构这两个函数来实现链接的恢复。例子如下:
<?php class Connection { protected $link; private $server, $username, $password, $db; public function __construct($server, $username, $password, $db) { $this->server = $server; $this->username = $username; $this->password = $password; $this->db = $db; $this->connect(); } private function connect() { $this->link = mysql_connect($this->server, $this->username, $this->password); mysql_select_db($this->db, $this->link); } public function __sleep() { return array('server', 'username', 'password', 'db'); } public function __wakeup() { $this->connect(); } } ?>
__toString()
对象当成字符串时的回应方法。例如使用echo $obj;
来输出一个对象
<?php // Declare a simple class class TestClass { public function __toString() { return 'this is a object'; } } $class = new TestClass(); echo $class; ?>
这个方法只能返回字符串,而且不可以在这个方法中抛出异常,否则会出现致命错误。
__invoke()
调用函数的方式调用一个对象时的回应方法。如下
<?php class CallableClass { function __invoke() { echo 'this is a object'; } } $obj = new CallableClass; var_dump(is_callable($obj)); ?>
__set_state()
调用var_export()
导出类时,此静态方法会被调用。
<?php class A { public $var1; public $var2; public static function __set_state ($an_array) { $obj = new A; $obj->var1 = $an_array['var1']; $obj->var2 = $an_array['var2']; return $obj; } } $a = new A; $a->var1 = 5; $a->var2 = 'foo'; var_dump(var_export($a)); ?>
__clone()
当对象复制完成时调用。例如在设计模式详解及PHP实现:单例模式一文中提到的单例模式实现方式,利用这个函数来防止对象被克隆。
<?php public class Singleton { private static $_instance = NULL; // 私有构造方法 private function __construct() {} public static function getInstance() { if (is_null(self::$_instance)) { self::$_instance = new Singleton(); } return self::$_instance; } // 防止克隆实例 public function __clone(){ die('Clone is not allowed.' . E_USER_ERROR); } } ?>
PHP中的常量大部分都是不变的,但是有8个常量会随着他们所在代码位置的变化而变化,这8个常量被称为魔术常量。
__LINE__
,文件中的当前行号__FILE__
,文件的完整路径和文件名__DIR__
,文件所在的目录__FUNCTION__
,函数名称__CLASS__
,类的名称__TRAIT__
,Trait的名字__METHOD__
,类的方法名__NAMESPACE__
__construct()
, Klassenkonstruktor__destruct()
, Klassendestruktor__call( )
, aufgerufen beim Aufruf einer unzugänglichen Methode in einem Objekt
__callStatic()
, aufgerufen beim Aufruf einer unzugänglichen Methode im statischen Modus__get(), aufgerufen beim Abrufen einer Mitgliedsvariablen einer Klasse<p></p>
<li>
<code>__set()
, aufgerufen beim Festlegen einer Mitgliedsvariablen einer Klasse __isset()
, aufgerufen, wenn isset()
oder empty()
für eine unzugängliche Eigenschaft aufgerufen wird __unset()
, aufgerufen, wenn unset()
wird für eine unzugängliche Eigenschaft aufgerufen. __sleep()
, wenn serialize()
ausgeführt wird, wird diese Funktion zuerst aufgerufen🎜__wakeup()
, ausführen __toString()
, die Antwortmethode, wenn die Klasse als String behandelt wird🎜__invoke()
, die Antwortmethode beim Aufrufen eines Objekts durch Aufrufen einer Funktion🎜__set_state()
, beim Aufrufen von var_export()
zum Exportieren eines Klasse wird diese statische Methode aufgerufen. 🎜__clone()
, aufgerufen, wenn die Objektkopie abgeschlossen ist 🎜🎜__construct()
und __destruct()
🎜__call() und <code>__callStatic()
🎜
__get()
, __set()
, __isset()
und __unset()
🎜__sleep()
und __wakeup() Code >🎜
serialize()
und unserialize()
ausführen, werden diese beiden Funktionen zuerst aufgerufen. Wenn wir beispielsweise ein Objekt serialisieren, verfügt das Objekt über eine Datenbankverknüpfung. Wenn wir den Verknüpfungsstatus während der Deserialisierung wiederherstellen möchten, können wir die Verknüpfung wiederherstellen, indem wir diese beiden Funktionen wiederherstellen. Ein Beispiel lautet wie folgt: 🎜rrreee__toString()
🎜echo $obj;
, um ein Objekt auszugeben🎜rrreee🎜Diese Methode kann nur eine Zeichenfolge zurückgeben und in dieser Methode kann keine Ausnahme ausgelöst werden, da sonst ein schwerwiegender Fehler auftritt. 🎜__invoke()
🎜__set_state()
🎜var_export()
aufrufen, um eine Klasse zu exportieren, wird diese statische Methode ausgeführt aufgerufen werden. 🎜rrreee__clone()
🎜__LINE__
, die aktuelle Zeilennummer in der Datei 🎜__FILE__
, der vollständige Pfad und Dateiname der Datei 🎜__FUNCTION__
, der Funktionsname🎜__CLASS__
, der Name der Klasse🎜 __TRAIT__ code>, der Name von Trait🎜<li>
<code>__METHOD__
, der Methodenname der Klasse🎜__NAMESPACE__
, der Name des aktuellen Namespace🎜🎜🎜Diese magischen Konstanten werden häufig verwendet, um aktuelle Umgebungsinformationen abzurufen oder Protokolle aufzuzeichnen. 🎜🎜Empfohlenes Lernen: „🎜PHP-Video-Tutorial🎜“🎜Das obige ist der detaillierte Inhalt vonWas sind magische Methoden und magische Konstanten in PHP?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!