Heim  >  Artikel  >  Backend-Entwicklung  >  Was sind magische Methoden und magische Konstanten in PHP?

Was sind magische Methoden und magische Konstanten in PHP?

青灯夜游
青灯夜游Original
2021-06-21 18:14:572658Durchsuche

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.

Was sind magische Methoden und magische Konstanten in PHP?

Die Betriebsumgebung dieses Tutorials: Windows 7-System, PHP-Version 7.1, DELL G3-Computer

Magische Methoden (Magische Methoden)

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 &#39;$name&#39; ". implode(&#39;, &#39;, $arguments). "\n";
    }

    public static function __callStatic ($name, $arguments) {
        echo "Calling static method &#39;$name&#39; ". implode(&#39;, &#39;, $arguments). "\n";
    }
}

$obj = new MethodTest;
$obj->runTest(&#39;in object context&#39;);
MethodTest::runTest(&#39;in static context&#39;);
?>

__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(&#39;server&#39;, &#39;username&#39;, &#39;password&#39;, &#39;db&#39;);
    }

    public function __wakeup()
    {
        $this->connect();
    }
}
?>

__toString()

对象当成字符串时的回应方法。例如使用echo $obj;来输出一个对象

<?php
// Declare a simple class
class TestClass
{
    public function __toString() {
        return &#39;this is a object&#39;;
    }
}

$class = new TestClass();
echo $class;
?>

这个方法只能返回字符串,而且不可以在这个方法中抛出异常,否则会出现致命错误。

__invoke()

调用函数的方式调用一个对象时的回应方法。如下

<?php
class CallableClass 
{
    function __invoke() {
        echo &#39;this is a object&#39;;
    }
}
$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[&#39;var1&#39;];
        $obj->var2 = $an_array[&#39;var2&#39;];
        return $obj;
    }
}

$a = new A;
$a->var1 = 5;
$a->var2 = &#39;foo&#39;;
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(&#39;Clone is not allowed.&#39; . E_USER_ERROR);
    }
}
?>

魔术常量(Magic constants)

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 unserialize()
  • wird diese Funktion zuerst aufgerufen🎜
  • __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() 🎜

    🎜Konstruktoren und Destruktoren sollten bekannt sein, sie werden aufgerufen, wenn Objekte erstellt und zerstört werden. Zum Beispiel müssen wir eine Datei öffnen, sie öffnen, wenn das Objekt erstellt wird, und sie schließen, wenn das Objekt stirbt🎜rrreee🎜Diese beiden Methoden können beim Erben erweitert werden, zum Beispiel: 🎜rrreee

    🎜__call() und <code>__callStatic()🎜

    🎜 werden aufgerufen, wenn eine nicht zugängliche Methode im Objekt aufgerufen wird. Letzteres ist eine statische Methode. Diese beiden Methoden können in Aufrufen variabler Methoden (Variablenfunktionen) verwendet werden. 🎜rrreee

    🎜__get(), __set(), __isset() und __unset() 🎜

    🎜Diese beiden Funktionen werden aufgerufen, wenn Mitgliedsvariablen einer Klasse abgerufen/festgelegt werden. Beispielsweise speichern wir die Objektvariablen in einem anderen Array anstelle der Mitgliedsvariablen des Objekts selbst🎜rrreee

    🎜__sleep() und __wakeup() Code >🎜

    🎜Wenn wir 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()🎜

    🎜Die Antwortmethode, wenn das Objekt als Zeichenfolge behandelt wird. Verwenden Sie beispielsweise 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()🎜

    🎜Die Antwortmethode beim Aufrufen eines Objekts durch Aufrufen einer Funktion. Wie folgt:🎜rrreee

    🎜__set_state()🎜

    🎜Wenn Sie var_export() aufrufen, um eine Klasse zu exportieren, wird diese statische Methode ausgeführt aufgerufen werden. 🎜rrreee

    🎜__clone()🎜

    🎜Wird aufgerufen, wenn die Objektkopie abgeschlossen ist. Beispielsweise wird diese Funktion in der im Artikel „Detaillierte Erläuterung von Entwurfsmustern und PHP-Implementierung: Singleton-Modus“ erwähnten Singleton-Modus-Implementierungsmethode verwendet, um das Klonen von Objekten zu verhindern. 🎜🎜rrreee

    🎜Magische Konstanten🎜🎜🎜Die meisten Konstanten in PHP bleiben unverändert, aber es gibt 8 Konstanten, die sich ändern, wenn sich ihre Position im Code ändert. Diese 8 Konstanten werden magische Konstanten genannt. 🎜
    • __LINE__, die aktuelle Zeilennummer in der Datei 🎜
    • __FILE__, der vollständige Pfad und Dateiname der Datei 🎜
    • __DIR__ , das Verzeichnis, in dem sich die Datei befindet🎜
    • __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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Was bedeutet Git in PHP?Nächster Artikel:Was bedeutet Git in PHP?