Heim  >  Artikel  >  Backend-Entwicklung  >  Was ist die magische Methode in PHP? Zusammenfassung der Verwendung von PHP Magic-Methoden (Code)

Was ist die magische Methode in PHP? Zusammenfassung der Verwendung von PHP Magic-Methoden (Code)

不言
不言Original
2018-07-24 17:00:335046Durchsuche

Die Definition magischer Methoden in PHP lautet, dass Methoden, die mit zwei Unterstrichen beginnen, magische Methoden genannt werden. Die Rolle dieser magischen Methoden in PHP ist sehr wichtig.

Magische Methoden:

__construct(),类的构造函数
__destruct(),类的析构函数
__call(),在对象中调用一个不可访问方法时调用
__callStatic(),用静态方式中调用一个不可访问方法时调用
__get(),获得一个类的成员变量时调用
__set(),设置一个类的成员变量时调用
__isset(),当对不可访问属性调用isset()或empty()时调用
__unset(),当对不可访问属性调用unset()时被调用。
__sleep(),执行serialize()时,先会调用这个函数
__wakeup(),执行unserialize()时,先会调用这个函数
__toString(),类被当成字符串时的回应方法
__invoke(),调用函数的方式调用一个对象时的回应方法
__set_state(),调用var_export()导出类时,此静态方法会被调用。
__clone(),当对象复制完成时调用

__construct() und __destruct()

Konstruktor- und Destruktorfunktionen sollten sein Bekanntlich werden sie aufgerufen, wenn Objekte erstellt und zerstört werden. Beispielsweise müssen wir eine Datei öffnen, sie öffnen, wenn das Objekt erstellt wird, und sie schließen, wenn das Objekt stirbt

<?php
class FileRead
{
 protected $handle = NULL;
 
 function __construct(){
  $this->handle = fopen(...);
 }
 
 function __destruct(){
  fclose($this->handle);
 }
}
?>

Diese beiden Methoden können bei Vererbung erweitert werden, zum Beispiel:

<?php
class TmpFileRead extends FileRead
{
 function __construct(){
  parent::__construct();
 }
 
 function __destruct(){
  parent::__destruct();
 }
}
?>

__call() und __callStatic()

Diese beiden Methoden werden aufgerufen, wenn eine unzugängliche Methode im Objekt aufgerufen wird, und letztere ist eine statische Methode. Diese beiden Methoden können in Aufrufen variabler Methoden (Variablenfunktionen) verwendet werden.

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

__get-Attribut dient zum automatischen Laden der __get-Methode, wenn das Attribut im Zugriffsobjekt nicht existiert oder kein ist öffentliches Attribut. Der Parameter hat nur einen Namenswert, nämlich den Namen des

-Attributs im Zugriffsobjekt.

__set ist, wenn einem Attribut in einem Objekt ein Wert zugewiesen wird. Wenn das Attribut nicht existiert oder ein nicht öffentliches Attribut ist, wird die __set-Methode automatisch geladen. Es gibt zwei Parameter. Parameter 1 ist der Name des nicht aufrufbaren Attributs im Zugriffsobjekt. Parameter 2 ist der Parameter, der zur Zuweisung übergeben werden soll. Es kann sich um ein Array oder eine Zeichenfolge handeln, die beide öffentlich sind Sichtbarkeit. Nicht statisch, hier ist eine kleine Kastanie zum besseren Verständnis:

<?php
/**
 * 清晰的认识__get() __set()
 */
class Example {
    
    //公有的属性
    public $public = &#39;pub&#39; ;
    //受保护的 - 子类中该属性可用
    protected $protected = &#39;pro&#39;;
    //私有的 - 只能此类使用此属性
    private $private = &#39;pri&#39;;
    
    //当访问对象中的属性不存在或者非公有属性的时候自动加载__get()方法
    public function __get($name){
        return &#39;调用__get()方法:&#39;.$name;
    }
    
    //当给对象的一个属性赋值的时候如果该属性不存在或者是非公有属性则自动加载__set()方法
    public function __set($name,$value){
        echo "\nname:".$name.&#39;,value:&#39;.$value."\n";
    }
}
$example = new Example;
echo &#39;<pre class="brush:php;toolbar:false">&#39;;
echo $example->public."\n";
echo $example->protected."\n";
echo $example->private."\n";
echo $example->other."\n";
echo &#39;<hr>&#39;;
$example->public = &#39;lic&#39;;   //这个赋值成功所有没有显示
$example->protected = &#39;tec&#39;;
$example->private = &#39;vat&#39;;
$example->other = &#39;er&#39;;
echo &#39;<br/>&#39;;

echo 'Print public attributes:'.$example->public;

__isset() und __unset()

__isset() ruft ein Attribut in einem Objekt auf oder ruft ein Attribut in einer Nicht-Klasse auf, wenn bei Verwendung der isset()-Methode kein oder kein öffentliches Attribut

, die Methode isset() wird automatisch ausgeführt

__unset() ruft Attribute in Nicht-Klassen auf. Verwenden Sie die Methode unset(). öffentliche Attribute, der Aufruf von __unset() wird automatisch ausgeführt

Sie können Mitgliedsattribute löschen, die nicht zur Klasse hinzugefügt werden, Sie können keine privaten Mitglieder in der Klasse löschen 🎜>

Objekt

Lass uns zuerst eine kleine Kastanie geben:

<?php
    /**
     * 针对类中的魔术方法 __isset() 和 __unset() 的例子
     */
class Example {
    public $public;
    protected $protected;
    private $private;
    
    public function __construct(){
        $this->public = &#39;pub&#39;;
        $this->protected = &#39;pro&#39;;
        $this->private = &#39;pri&#39;;
    }
    
    public function __isset($var){
        echo &#39;这里通过__isset()方法查看属性名为 &#39;.$var."\n";
    }
    
    public function __unset($var){
        echo &#39;这里通过__unset()方法要销毁属性名为 &#39;.$var."\n";
    }
}
$exa = new Example;
echo &#39;<pre class="brush:php;toolbar:false">&#39;;
var_dump(isset($exa->public));
echo "\n";
var_dump(isset($exa->protected));
echo "\n";
var_dump(isset($exa->private));
echo "\n";
var_dump(isset($exa->noVar));
echo "\n";
echo &#39;<hr/>&#39;;

unset($exa->public);
var_dump($exa);
echo "\n";
unset($exa->protected);
echo "\n";
unset($exa->private);
echo "\n";
unset($exa->noVar);
echo "\n";

__sleep() und __wakeup()

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:

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

Die Antwortmethode, wenn das Objekt als String behandelt wird. Verwenden Sie beispielsweise echo $obj;, um ein Objekt auszugeben

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

Diese Methode kann nur eine Zeichenfolge zurückgeben und in dieser Methode können keine Ausnahmen ausgelöst werden, da sonst ein schwerwiegender Fehler auftritt.

__invoke()

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

<?php
class CallableClass
{
 function __invoke() {
  echo &#39;this is a object&#39;;
 }
}
$obj = new CallableClass;
var_dump(is_callable($obj));
?>

__set_state()

Diese statische Methode wird aufgerufen, wenn var_export() aufgerufen wird, um eine Klasse zu exportieren.

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

Wird aufgerufen, wenn die Objektkopie abgeschlossen ist. Beispielsweise wird diese Funktion in der Singleton-Modus-Implementierungsmethode, die im Artikel Detaillierte Erläuterung von Entwurfsmustern und PHP-Implementierung: Singleton-Modus erwähnt wird, verwendet, um zu verhindern, dass Objekte geklont werden.

<?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);
 }
}
?>

Magische Konstanten

Die meisten Konstanten in PHP bleiben unverändert, aber es gibt 8 Konstanten, die sich ändern, wenn sich die Position des Codes ändert, an der sie sich befinden. Diese 8 Konstanten sind eine Konstante wird als magische Konstante bezeichnet.

__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__, Funktionsname

__CLASS__, Klassenname

__TRAIT__, Merkmalsname

__METHOD__, Klassenmethodenname

__NAMESPACE__, Name des aktuellen Namespace

Diese magischen Konstanten werden häufig verwendet, um aktuelle Umgebungsinformationen abzurufen oder Protokolle aufzuzeichnen.

Verwandte Empfehlungen:

Mehrere in PHP häufig verwendete magische Methoden

[php-Klassen und -Objekte] Magische Methoden

Das obige ist der detaillierte Inhalt vonWas ist die magische Methode in PHP? Zusammenfassung der Verwendung von PHP Magic-Methoden (Code). 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