Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Magie-Methode

PHP-Magie-Methode

伊谢尔伦
伊谢尔伦Original
2016-11-23 13:58:211506Durchsuche

__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke() , __set_state() und __clone() sowie andere Methoden werden in PHP „Magic-Methoden“ genannt. Sie können diese Methodennamen nicht verwenden, wenn Sie Ihre eigenen Klassenmethoden benennen, es sei denn, Sie möchten deren magische Funktionalität nutzen.

PHP reserviert alle Klassenmethoden, die mit __ (zwei Unterstriche) beginnen, als magische Methoden. Daher wird beim Definieren von Klassenmethoden mit Ausnahme der oben genannten magischen Methoden empfohlen, ihnen kein __ voranzustellen.

__sleep() und __wakeup()

publicarray__sleep ( void )

void__wakeup ( void )

Die Funktion serialize( ) überprüft die Klasse Gibt es eine magische Methode __sleep()? Falls vorhanden, wird diese Methode zuerst aufgerufen und dann der Serialisierungsvorgang ausgeführt. Diese Funktion kann verwendet werden, um ein Objekt zu bereinigen und ein Array zurückzugeben, das die Namen aller Variablen im Objekt enthält, die serialisiert werden sollen. Wenn die Methode nichts zurückgibt, wird NULL serialisiert und ein Fehler auf E_NOTICE-Ebene generiert.

Hinweis:

__sleep() kann den Namen des privaten Mitglieds der übergeordneten Klasse nicht zurückgeben. Dadurch wird ein Fehler der Ebene E_NOTICE generiert. Sie können stattdessen die Serializable-Schnittstelle verwenden.

Die Methode __sleep() wird oft verwendet, um nicht festgeschriebene Daten oder ähnliche Bereinigungsvorgänge zu übermitteln. Gleichzeitig ist diese Funktion nützlich, wenn Sie über einige große Objekte verfügen, diese aber nicht alle speichern müssen.

Im Gegensatz dazu prüft unserialize(), ob es eine __wakeup()-Methode gibt. Falls vorhanden, wird zuerst die Methode __wakeup aufgerufen, um die vom Objekt benötigten Ressourcen im Voraus vorzubereiten.

__wakeup() wird häufig bei Deserialisierungsvorgängen verwendet, z. B. beim Wiederherstellen einer Datenbankverbindung oder beim Durchführen anderer Initialisierungsvorgänge.

Beispiel #1 Schlafen und Aufwachen

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()

öffentliche Zeichenfolge __toString (void)

Die Methode __toString() wird für a verwendet Klasse Wie reagiert man, wenn sie als Zeichenfolge behandelt wird? Beispielsweise sollte echo $obj; etwas anzeigen. Diese Methode muss eine Zeichenfolge zurückgeben, andernfalls wird ein schwerwiegender Fehler der Stufe E_RECOVERABLE_ERROR ausgegeben.

Sie können in der __toString()-Methode keine Ausnahmen auslösen, da dies zu einem schwerwiegenden Fehler führt.

Beispiel Nr. 2 Einfaches Beispiel

class TestClass
{
    public $foo;
    public function __construct($foo)
    {
        $this->foo = $foo;
    }
    public function __toString(){
        return $this->foo;
    }
}
$class = new TestClass('Hello');
echo $class;

Ausgabeergebnis:

Hello

Es sollte darauf hingewiesen werden, dass vor PHP 5.2.0 die Methode __toString() vorhanden war nur direkt verwendet. Es wird nur wirksam, wenn es mit echo oder print verwendet wird. Nach PHP 5.2.0 kann es in jeder String-Umgebung verwendet werden (z. B. über printf() mit dem Modifikator %s), kann jedoch nicht in Nicht-String-Umgebungen verwendet werden (z. B. mit dem Modifikator %d). Ab PHP 5.2.0 führt die Konvertierung eines Objekts, das die Methode __toString() nicht definiert, in einen String zu einem Fehler der Ebene E_RECOVERABLE_ERROR.

__invoke()

mixed__invoke ([ $... ] )

Wenn Sie versuchen, ein Objekt durch Aufrufen einer Funktion aufzurufen, wird die Methode __invoke() dies tun wird automatisch aufgerufen.

Hinweis:

Diese Funktion ist nur in PHP 5.3.0 und höher verfügbar.

Beispiel #3 Verwenden Sie __invoke()

class CallableClass
{
    function __invoke($x){
        var_dump($x);
    }
}
$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj));

, um das Ergebnis auszugeben:

int(5)

bool(true)

__set_state()

statisches Objekt __set_state (array $properties)

Seit PHP 5.1.0 wird diese statische Methode aufgerufen, wenn var_export() aufgerufen wird, um eine Klasse zu exportieren.

Der einzige Parameter dieser Methode ist ein Array, das Klasseneigenschaften enthält, die im Format array('property' => value, ...) angeordnet sind.

Beispiel Nr. 4 mit __set_state()> (ab PHP 5.1.0)

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';
eval('$b='.var_export($a,true).';');
var_dump($b);

Ausgabeergebnis:

object(A)#2 (2) { ["var1"]=> int(5) ["var2"]=> string(3) "foo" }


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