Die integrierten Methoden, die in PHP mit dem doppelten Unterstrich „__“ beginnen, werden magische Methoden genannt, einschließlich „__construct()“, „__set()“, „__get()“, „__isset()“, „__unset( )“ „, „__sleep()“, „__wakeup()“, „__call()“, „__invoke()“ usw.; darunter ist „__construct()“ die Konstruktionsmethode der Klasse und das erste Objekt Wird automatisch aufgerufen, nachdem das Objekt erstellt wurde. Die aufzurufende Methode.

Die Betriebsumgebung dieses Tutorials: Windows7-System, PHP8-Version, DELL G3-Computer
Magische Methode in PHP
In PHP beginnen Methoden mit einem doppelten Unterstrich (__). Sie werden in PHP als magische Methoden bezeichnet und spielen in PHP eine sehr wichtige Rolle. Zu den magischen Methoden gehören:
Methodenname |
Beschreibung |
__construct() |
Konstruktor der Klasse |
__destruct() |
Destruktor der Klasse |
__call($ funName, $ Argumente) |
Wenn eine undefinierte oder nicht erreichbare Methode aufgerufen wird, wird die Methode __call() aufgerufen. |
__callStatic($funName, $arguments) |
Wenn eine undefinierte oder nicht erreichbare statische Methode aufgerufen wird, wird die Methode __callStatic() aufgerufen. |
__get($propertyName) |
Beim Abrufen einer Mitgliedsvariablen einer Klasse wird die Methode __get() aufgerufen. |
__set($property, $value) |
Beim Zuweisen einer Mitgliedsvariablen einer Klasse wird die Methode __set() aufgerufen. |
__isset($content) |
Wenn isset() oder empty() aufgerufen wird, um einem undefinierten oder nicht erreichbaren Mitglied einen Wert zuzuweisen, wird die Methode __isset() aufgerufen. |
__unset($content) |
Wenn Sie reset() aufrufen, um ein undefiniertes oder nicht erreichbares Mitglied zu aktualisieren, wird die Methode __unset() aufgerufen. |
__sleep() |
Beim Ausführen von serialize() wird zuerst die Methode __sleep() aufgerufen. |
__wakeup() |
Wenn die Deserialisierung() durchgeführt wird, wird zuerst die Methode __wakeup() aufgerufen. |
__toString() |
Bei Verwendung der Echo-Methode zur direkten Ausgabe des Anzeigeobjekts wird zuerst die Methode __toString() aufgerufen. |
__invoke() |
Beim Zugriff auf ein Objekt mithilfe einer Funktion wird zuerst die Methode __invoke() aufgerufen. |
__set_state($an_array) |
Wenn die Methode var_export() aufgerufen wird, wird die Methode __set_state() aufgerufen. |
__clone() |
Wenn das Objekt kopiert und zugewiesen wird, wird die Methode __clone() aufgerufen. |
__autoload($className) |
Wird aufgerufen, wenn versucht wird, eine undefinierte Klasse zu laden. |
__debugInfo() |
Debug-Informationen ausgeben. |
In diesem Artikel werden einige Beispiele verwendet, um die Verwendung magischer PHP-Methoden zu demonstrieren.
1.__construct()
Beim Erstellen eines Objekts wird als erstes die Konstruktormethode der PHP-Klasse aufgerufen. Jede Klasse verfügt über Konstruktormethoden. Wenn Sie es nicht explizit in der Klasse definieren, gibt es einen standardmäßigen Klassenkonstruktor ohne Argumente, obwohl dieser nicht in der Klasse definiert ist.
1) Anwendung der Konstruktormethode
Die Konstruktormethode einer Klasse wird normalerweise zum Ausführen einiger Initialisierungsaufgaben verwendet, z. B. zum Initialisieren und Zuweisen von Werten zu Mitgliedern beim Erstellen eines Objekts.
2) Deklarationsformat von Konstruktormethoden in Klassen
1 2 3 4 5 | function __constrct([parameter list]){
方法具体实现
}
|
Nach dem Login kopieren
Hinweis: In den meisten Klassen kann nur ein Konstruktor deklariert werden. Denn PHP unterstützt keine Konstruktorüberladung.
Hier ist ein vollständiges Beispiel:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <?php
class Person
{
public $name ;
public $age ;
public $sex ;
public function __construct( $name = "" , $sex = "Male" , $age =22)
{
$this ->name = $name ;
$this ->sex = $sex ;
$this ->age = $age ;
}
public function say()
{
echo "Name:" . $this ->name . ",Sex:" . $this ->sex . ",Age:" . $this ->age;
}
}
|
Nach dem Login kopieren
Erstellen Sie ein $Person1-Objekt ohne Parameter.
1 2 | $Person1 = new Person();
echo $Person1 ->say();
|
Nach dem Login kopieren
Erstellen Sie ein $Person2-Objekt mit einem einzigen Argument „Jams“.
1 2 | $Person2 = new Person( "Jams" );
echo $Person2 ->say();
|
Nach dem Login kopieren
Wird mit 3 Parametern aufgerufen, um ein $Person3-Objekt zu erstellen.
1 2 | $Person3 = new Person ( "Jack" , "Male" , 25);
echo $Person3 ->say();
|
Nach dem Login kopieren
__destruct()
Destruktor ist das Gegenteil von Konstruktor.
Destructor ermöglicht es Ihnen, einige Vorgänge auszuführen, bevor Sie das Objekt zerstören, z. B. das Schließen der Datei, das Löschen der Ergebnismenge usw.
Destructor ist eine neue Funktion, die in PHP 5 eingeführt wurde.
Die Deklaration des Destruktors ähnelt der des Konstruktors, beginnt mit zwei Unterstrichen und der Name ist auf __destruct()
festgelegt. __destruct()
。
析构函数的声明
析构函数不能带参数。
析构函数的使用
析构函数在类中一般不常见。它是类的可选部分,通常用于在类销毁之前完成一些清理任务。
这是使用析构函数的示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <?php
class Person{
public $name ;
public $age ;
public $sex ;
public function __construct( $name = "" , $sex = "Male" , $age =22)
{
$this ->name = $name ;
$this ->sex = $sex ;
$this ->age = $age ;
}
public function say()
{
echo "Name:" . $this ->name. ",Sex:" . $this ->sex. ",Age:" . $this ->age;
}
public function __destruct()
{
echo "Well, my name is " . $this ->name;
}
}
$Person = new Person( "John" );
unset( $Person );
|
Nach dem Login kopieren
输出结果
__call()
该方法接受两个参数。第一个参数为未定义的方法名称,第二个参数则为传入方法的参数构成的数组
使用
1 2 3 4 | function __call(string $function_name , array $arguments )
{
}
|
Nach dem Login kopieren
在程序中调用未定义方法时, __call()
方法将被调用。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php
class Person
{
function say()
{
echo "Hello, world!<br>" ;
}
function __call( $funName , $arguments )
{
echo "The function you called:" . $funName . "(parameter:" ;
print_r( $arguments );
echo ")does not exist!!<br>\n" ;
}
}
$Person = new Person();
$Person ->run( "teacher" );
$Person ->eat( "John" , "apple" );
$Person ->say();
|
Nach dem Login kopieren
显示结果
1 2 3 | The function you called: run (parameter: Array([0] => teacher)) does not exist!
The function you called: eat (parameter: Array([0] => John[1] => apple)) does not exist!
Hello world!
|
Nach dem Login kopieren
4. __callStatic()
当在程序中调用未定义的静态方法,__callStatic()
方法将会被自动调用。
__callStatic()
的用法类似于 __call()
。下面举个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php
class Person
{
function say()
{
echo "Hello, world!<br>" ;
}
public static function __callStatic( $funName , $arguments )
{
echo "The static method you called:" . $funName . "(parameter:" ;
print_r( $arguments );
echo ")does not exist!<br>\n" ;
}
}
$Person = new Person();
$Person ::run( "teacher" );
$Person ::eat( "John" , "apple" );
$Person ->say();
|
Nach dem Login kopieren
执行结果如下:
1 2 3 | The static method you called: run (parameter: Array([0] => teacher)) does not exist!
The static method you called: eat (parameter: Array([0] => John[1] => apple)) does not exist!
Hello world!
|
Nach dem Login kopieren
__get()
当你尝试在外部访问对象的私有属性时,应用程序将抛出异常并结束运行。我们可以使用 __get
方法解决该问题。该方法可以获取从对象外部获取私有属性的值。举例如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <?php
class Person
{
private $name ;
private $age ;
function __construct( $name = "" , $age =1)
{
$this ->name = $name ;
$this ->age = $age ;
}
public function __get( $propertyName )
{
if ( $propertyName == "age" ) {
if ( $this ->age > 30) {
return $this ->age - 10;
} else {
return $this -> $propertyName ;
}
} else {
return $this -> $propertyName ;
}
}
}
$Person = new Person( "John" , 60);
echo "Name:" . $Person ->name . "<br>" ;
echo "Age:" . $Person ->age . "<br>" ;
|
Nach dem Login kopieren
结果显示如下
6. __set()
set($property,$value)方法用于设置类的私有属性。分配了未定义的属性后,将触发set()方法,并且传递的参数是设置的属性名称和值。
下面是演示代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <?php
class Person
{
private $name ;
private $age ;
public function __construct( $name = "" , $age =25)
{
$this ->name = $name ;
$this ->age = $age ;
}
public function __set( $property , $value ) {
if ( $property == "age" )
{
if ( $value > 150 || $value < 0) {
return ;
}
}
$this -> $property = $value ;
}
public function say(){
echo "My name is " . $this ->name. ",I'm " . $this ->age. " years old" ;
}
}
$Person = new Person( "John" , 25);
$Person ->name = "Lili" ;
$Person ->age = 16;
$Person ->age = 160;
$Person ->say();
|
Nach dem Login kopieren
代码运行结果:
1 | My name is Lili, I'm 16 years old
|
Nach dem Login kopieren
7. __isset()
在使用__isset()方法之前,让我先解释一下isset()方法的用法。isset()方法主要用于确定是否设置了此变量。
如果在对象外部使用isset()方法,则有两种情况:
- 如果该参数是公共属性,则可以使用isset()方法确定是否设置了该属性。
- 如果参数是私有属性,则isset()方法将不起作用。
那么对于私有属性,有什么办法知道它是否被设置了吗?当然,只要在类中定义__isset()方法,就可以在类外部使用isset()方法来确定是否设置了私有属性。
当在未定义或不可访问的属性上调用isset()或empty()时,将调用__isset()方法。下面是一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <?php
class Person
{
public $sex ;
private $name ;
private $age ;
public function __construct( $name = "" , $age =25, $sex ='Male')
{
$this ->name = $name ;
$this ->age = $age ;
$this ->sex = $sex ;
}
public function __isset( $content ) {
echo "The {$content} property is private,the __isset() method is called automatically.<br>" ;
echo isset( $this -> $content );
}
}
$person = new Person( "John" , 25);
echo isset( $person ->sex), "<br>" ;
echo isset( $person ->name), "<br>" ;
echo isset( $person ->age), "<br>" ;
|
Nach dem Login kopieren
代码运行结果如下:
1 2 3 4 5 | 1
The name property is private ,the __isset() method is called automatically.
1
The age property is private ,the __isset() method is called automatically.
1
|
Nach dem Login kopieren
8. __unset()
与isset()方法类似,当在未定义或不可访问的属性上调用unset()方法时,将调用unset()方法。下面是一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <?php
class Person
{
public $sex ;
private $name ;
private $age ;
public function __construct( $name = "" , $age =25, $sex ='Male')
{
$this ->name = $name ;
$this ->age = $age ;
$this ->sex = $sex ;
}
public function __unset( $content ) {
echo "It is called automatically when we use the unset() method outside the class.<br>" ;
echo isset( $this -> $content );
}
}
$person = new Person( "John" , 25);
unset( $person ->sex), "<br>" ;
unset( $person ->name), "<br>" ;
unset( $person ->age), "<br>" ;
|
Nach dem Login kopieren
代码的运行结果如下:
1 2 3 4 | It is called automatically when we use the unset() method outside the class .
1
It is called automatically when we use the unset() method outside the class .
1
|
Nach dem Login kopieren
9. __sleep()
serialize()方法将检查类中是否有魔术方法__sleep()。如果存在,将首先调用该方法,然后执行序列化操作。
__sleep()方法通常用于指定保存数据之前需要序列化的属性。如果有一些非常大的对象不需要全部保存,那么您会发现此功能非常有用。
有关详细信息,请参考以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?php
class Person
{
public $sex ;
public $name ;
public $age ;
public function __construct( $name = "" , $age =25, $sex ='Male')
{
$this ->name = $name ;
$this ->age = $age ;
$this ->sex = $sex ;
}
public function __sleep() {
echo "It is called when the serialize() method is called outside the class.<br>" ;
$this ->name = base64_encode ( $this ->name);
return array ( 'name' , 'age' );
}
}
$person = new Person( 'John' );
echo serialize( $person );
echo '<br/>' ;
|
Nach dem Login kopieren
代码运行结果如下:
1 2 | It is called when the serialize() method is called outside the class .
O:6: "Person" :2:{s:4: "name" ;s:8: "5bCP5piO" ;s:3: "age" ;i:25;}
|
Nach dem Login kopieren
10. __wakeup()
与sleep()方法相比,wakeup()方法通常用于反序列化操作,例如重建数据库连接或执行其他初始化操作。
下面是相关实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <?php
class Person
{
public $sex ;
public $name ;
public $age ;
public function __construct( $name = "" , $age =25, $sex ='Male')
{
$this ->name = $name ;
$this ->age = $age ;
$this ->sex = $sex ;
}
public function __sleep() {
echo "It is called when the serialize() method is called outside the class.<br>" ;
$this ->name = base64_encode ( $this ->name);
return array ( 'name' , 'age' );
}
public function __wakeup() {
echo "It is called when the unserialize() method is called outside the class.<br>" ;
$this ->name = 2;
$this ->sex = 'Male' ;
}
}
$person = new Person( 'John' );
var_dump(serialize( $person ));
var_dump(unserialize(serialize( $person )));
|
Nach dem Login kopieren
代码运行结果如下:
1 2 3 4 | It is called when the serialize() method is called outside the class .
string(58) "O:6:" Person ":2:{s:4:" name ";s:8:" 5bCP5piO ";s:3:" age ";i:25;}"
It is called when the unserialize() method is called outside the class .
object(Person)#2 (3) { [ "sex" ]=> string(3) "Male" [ "name" ]=> int(2) [ "age" ]=> int(25) }
|
Nach dem Login kopieren
11. __toString()
使用echo方法直接打印对象时,将调用__toString()方法。
注意:此方法必须返回一个字符串,否则将在E_RECOVERABLE_ERROR
Deklaration des Destruktors
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php
class Person
{
public $sex ;
public $name ;
public $age ;
public function __construct( $name = "" , $age =25, $sex ='Male')
{
$this ->name = $name ;
$this ->age = $age ;
$this ->sex = $sex ;
}
public function __toString()
{
return 'go go go' ;
}
}
$person = new Person( 'John' );
echo $person ;
|
Nach dem Login kopieren
Der Destruktor kann keine Parameter annehmen.
Verwendung von Destruktoren
Destruktoren sind in Klassen im Allgemeinen nicht üblich. Es ist ein optionaler Teil der Klasse und wird normalerweise verwendet, um einige Bereinigungsaufgaben abzuschließen, bevor die Klasse zerstört wird.
Dies ist ein Beispiel für die Verwendung eines Destruktors:
Ausgabeergebnis🎜
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php
class Person
{
public $sex ;
public $name ;
public $age ;
public function __construct( $name = "" , $age =25, $sex ='Male')
{
$this ->name = $name ;
$this ->age = $age ;
$this ->sex = $sex ;
}
}
$person = new Person( 'John' );
echo $person ;
|
Nach dem Login kopieren
🎜__call()🎜🎜Diese Methode akzeptiert zwei Parameter. Der erste Parameter ist der undefinierte Methodenname und der zweite Parameter ist ein Array von Parametern, die an die Methode übergeben werden🎜
Verwenden
1 | Catchable fatal error: Object of class Person could not be converted to string in D:\phpStudy\WWW\test\index.php on line 18
|
Nach dem Login kopieren
Nach dem Login kopieren
🎜Wenn Sie eine undefinierte Methode in einem Programm aufrufen,
__call( ) wird aufgerufen. 🎜🎜Beispiel🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"><?php
class Person
{
public $sex;
public $name;
public $age;
public function __construct($name="", $age=25, $sex=&#39;Male&#39;)
{
$this->name = $name;
$this->age = $age;
$this->sex = $sex;
}
public function __invoke() {
echo 'This is an object';
}
}
$person = new Person('John'); // Initially assigned.
$person();</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div>🎜Ergebnisse anzeigen🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">This is an object</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div>🎜4. __callStatic()🎜🎜Wenn eine undefinierte statische Methode im Programm aufgerufen wird, wird die Methode <code>__callStatic()
automatisch aufgerufen. 🎜🎜
__callStatic()
wird ähnlich wie
__call()
verwendet. Hier ist ein Beispiel: 🎜
1 | Fatal error: Function name must be a string in D:\phpStudy\WWW\test\index.php on line 18
|
Nach dem Login kopieren
Nach dem Login kopieren
🎜Das Ausführungsergebnis lautet wie folgt: 🎜
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php
class Person
{
public $sex ;
public $name ;
public $age ;
public function __construct( $name = "" , $age =25, $sex ='Male')
{
$this ->name = $name ;
$this ->age = $age ;
$this ->sex = $sex ;
}
}
$person = new Person( 'John' );
var_export( $person );
|
Nach dem Login kopieren
Nach dem Login kopieren
🎜__get()🎜🎜Wenn Sie versuchen, extern auf die privaten Eigenschaften des Objekts zuzugreifen, löst die Anwendung eine Ausnahme aus und beendet den Vorgang. Wir können dieses Problem mit der Methode
__get
lösen. Mit dieser Methode kann der Wert einer privaten Eigenschaft von außerhalb des Objekts ermittelt werden. Ein Beispiel ist wie folgt🎜
1 | Person::__set_state( array ( 'sex' => 'Male' , 'name' => 'John' , 'age' => 25, ))
|
Nach dem Login kopieren
Nach dem Login kopieren
🎜Das Ergebnis wird wie folgt angezeigt: __set()🎜🎜
set($property,$value)-Methode wird verwendet, um die privaten Eigenschaften der Klasse festzulegen. Wenn eine undefinierte Eigenschaft zugewiesen wird, wird die Methode set() ausgelöst und die übergebenen Parameter sind der Name und der Wert der festgelegten Eigenschaft. 🎜🎜Das Folgende ist der Democode:🎜1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <?php
class Person
{
public $sex ;
public $name ;
public $age ;
public function __construct( $name = "" , $age =25, $sex ='Male')
{
$this ->name = $name ;
$this ->age = $age ;
$this ->sex = $sex ;
}
public static function __set_state( $an_array )
{
$a = new Person();
$a ->name = $an_array [ 'name' ];
return $a ;
}
}
$person = new Person( 'John' );
$person ->name = 'Jams' ;
var_export( $person );
|
Nach dem Login kopieren
Nach dem Login kopieren
🎜Code-Ausführungsergebnisse:🎜1 | Person::__set_state( array ( 'sex' => 'Male' , 'name' => 'Jams' , 'age' => 25, ))
|
Nach dem Login kopieren
Nach dem Login kopieren
🎜7. Bevor ich die __isset()-Methode verwende, möchte ich zunächst die Verwendung der isset()-Methode erklären. Die Methode isset() wird hauptsächlich verwendet, um festzustellen, ob diese Variable gesetzt ist. 🎜🎜Wenn die Methode isset() außerhalb des Objekts verwendet wird, gibt es zwei Situationen: 🎜
- Wenn der Parameter eine öffentliche Eigenschaft ist, können Sie die Methode isset() verwenden, um zu bestimmen, ob die Eigenschaft festgelegt ist.
- Wenn der Parameter eine private Eigenschaft ist, funktioniert die Methode isset() nicht.
🎜Gibt es für private Immobilien eine Möglichkeit herauszufinden, ob es festgelegt ist? Solange die Methode __isset() in der Klasse definiert ist, kann die Methode isset() natürlich außerhalb der Klasse verwendet werden, um zu bestimmen, ob die private Eigenschaft festgelegt ist. 🎜🎜Wenn isset() oder empty() für eine undefinierte oder unzugängliche Eigenschaft aufgerufen wird, wird die Methode __isset() aufgerufen. Hier ist ein Beispiel: 🎜1 | $copy_of_object = clone $object ;
|
Nach dem Login kopieren
Nach dem Login kopieren
🎜Das Ergebnis der Codeausführung ist wie folgt: 🎜1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <?php
class Person
{
public $sex ;
public $name ;
public $age ;
public function __construct( $name = "" , $age =25, $sex ='Male')
{
$this ->name = $name ;
$this ->age = $age ;
$this ->sex = $sex ;
}
public function __clone()
{
echo __METHOD__ . "your are cloning the object.<br>" ;
}
}
$person = new Person( 'John' );
$person2 = clone $person ;
var_dump( 'persion1:' );
var_dump( $person );
echo '<br>' ;
var_dump( 'persion2:' );
var_dump( $person2 );
|
Nach dem Login kopieren
Nach dem Login kopieren
🎜8. __unset()🎜🎜 ähnelt derisset()-Methode, wenn die unset()-Methode für ein undefiniertes oder aufgerufen wird unzugängliche Eigenschaft, wird die Methode unset() aufgerufen. Hier ist ein Beispiel: 🎜1 2 3 | Person::__clone your are cloning the object.
string(9) "persion1:" object(Person)#1 (3) { [ "sex" ]=> string(3) "Male" [ "name" ]=> string(6) "John" [ "age" ]=> int(25) }
string(9) "persion2:" object(Person)#2 (3) { [ "sex" ]=> string(3) "Male" [ "name" ]=> string(6) "John" [ "age" ]=> int(25) }
|
Nach dem Login kopieren
Nach dem Login kopieren
🎜Das Ergebnis der Ausführung des Codes ist wie folgt: 🎜1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
require_once ( 'project/class/A.php' );
require_once ( 'project/class/B.php' );
require_once ( 'project/class/C.php' );
.
.
.
if (ConditionA) {
$a = new A();
$b = new B();
$c = new C();
} else if (ConditionB) {
$a = newA();
$b = new B();
}
|
Nach dem Login kopieren
Nach dem Login kopieren
🎜9. Die Methode __sleep()🎜🎜serialize() prüft, ob es eine magische Methode __sleep() in der Klasse gibt. Falls vorhanden, wird diese Methode zuerst aufgerufen und dann der Serialisierungsvorgang ausgeführt. Die Methode 🎜🎜__sleep() wird normalerweise verwendet, um Attribute anzugeben, die vor dem Speichern von Daten serialisiert werden müssen. Diese Funktion kann hilfreich sein, wenn Sie sehr große Objekte haben, die nicht alle gespeichert werden müssen. 🎜🎜Weitere Informationen finden Sie im folgenden Code: 🎜1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
function __autoload( $className ) {
$filePath = “project/ class /{ $className }.php”;
if ( is_readable ( $filePath )) {
require ( $filePath );
}
}
if (ConditionA) {
$a = new A();
$b = new B();
$c = new C();
} else if (ConditionB) {
$a = newA();
$b = new B();
}
|
Nach dem Login kopieren
Nach dem Login kopieren
🎜Das Ergebnis der Codeausführung lautet wie folgt: 🎜1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php
class C {
private $prop ;
public function __construct( $val ) {
$this ->prop = $val ;
}
public function __debugInfo() {
return [
'propSquared' => $this ->prop ** 2,
];
}
}
var_dump( new C(42));
|
Nach dem Login kopieren
Nach dem Login kopieren
🎜10. __wakeup()🎜🎜Verglichen mit der sleep()-Methode, der wakeup ()-Methode wird normalerweise für Deserialisierungsvorgänge verwendet, z. B. zum Wiederherstellen von Datenbankverbindungen oder zum Durchführen anderer Initialisierungsvorgänge. 🎜🎜Das Folgende sind relevante Beispiele:🎜1 | object(C)#1 (1) { [ "propSquared" ]=> int(1764) }
|
Nach dem Login kopieren
Nach dem Login kopieren
🎜Die Ergebnisse der Codeausführung sind wie folgt:🎜rrreee🎜11. __toString()🎜🎜Bei Verwendung der echo-Methode zum direkten Drucken eines Objekts wird die __toString()-Methode aufgerufen. 🎜🎜Hinweis: Diese Methode muss eine Zeichenfolge zurückgeben, andernfalls wird ein schwerwiegender Fehler auf der Ebene E_RECOVERABLE_ERROR
ausgelöst. Und Sie können auch keine Ausnahme in der Methode __toString() auslösen. 🎜🎜Das Folgende ist ein relevantes Beispiel:🎜rrreee🎜Das Ergebnis der Ausführung des Codes ist wie folgt:🎜rrreee🎜Was passiert also, wenn die Methode __toString() nicht in der Klasse definiert ist? Probieren wir es aus. 🎜rrreee🎜Das Ergebnis der Ausführung des Codes ist wie folgt:🎜1 | Catchable fatal error: Object of class Person could not be converted to string in D:\phpStudy\WWW\test\index.php on line 18
|
Nach dem Login kopieren
Nach dem Login kopieren
显然,它在页面上报告了一个致命错误,PHP语法不支持这样的写法。
12. __invoke()
当您尝试以调用函数的方式调用对象时,__ invoke()方法将被自动调用。
注意:此功能仅在PHP 5.3.0及更高版本中有效。
下面是相关实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php
class Person
{
public $sex ;
public $name ;
public $age ;
public function __construct( $name = "" , $age =25, $sex ='Male')
{
$this ->name = $name ;
$this ->age = $age ;
$this ->sex = $sex ;
}
public function __invoke() {
echo 'This is an object' ;
}
}
$person = new Person( 'John' );
$person ();
|
Nach dem Login kopieren
Nach dem Login kopieren
运行代码结果如下:
如果坚持使用对象作为方法(但未定义__invoke()方法),则将得到以下结果:
1 | Fatal error: Function name must be a string in D:\phpStudy\WWW\test\index.php on line 18
|
Nach dem Login kopieren
Nach dem Login kopieren
13.__set_state()
从PHP 5.1.0开始,在调用var_export()导出类代码时会自动调用__set_state()方法。
__set_state()方法的参数是一个包含所有属性值的数组,其格式为array('property'=> value,...)
在以下示例中,我们没有定义__set_state()方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php
class Person
{
public $sex ;
public $name ;
public $age ;
public function __construct( $name = "" , $age =25, $sex ='Male')
{
$this ->name = $name ;
$this ->age = $age ;
$this ->sex = $sex ;
}
}
$person = new Person( 'John' );
var_export( $person );
|
Nach dem Login kopieren
Nach dem Login kopieren
执行代码结果如下:
1 | Person::__set_state( array ( 'sex' => 'Male' , 'name' => 'John' , 'age' => 25, ))
|
Nach dem Login kopieren
Nach dem Login kopieren
显然,对象的属性已打印。
现在让我们看看定义__set_state()方法的另一种情况:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <?php
class Person
{
public $sex ;
public $name ;
public $age ;
public function __construct( $name = "" , $age =25, $sex ='Male')
{
$this ->name = $name ;
$this ->age = $age ;
$this ->sex = $sex ;
}
public static function __set_state( $an_array )
{
$a = new Person();
$a ->name = $an_array [ 'name' ];
return $a ;
}
}
$person = new Person( 'John' );
$person ->name = 'Jams' ;
var_export( $person );
|
Nach dem Login kopieren
Nach dem Login kopieren
执行代码结果如下:
1 | Person::__set_state( array ( 'sex' => 'Male' , 'name' => 'Jams' , 'age' => 25, ))
|
Nach dem Login kopieren
Nach dem Login kopieren
14. __clone()
在PHP中,我们可以使用clone关键字通过以下语法克隆对象:
1 | $copy_of_object = clone $object ;
|
Nach dem Login kopieren
Nach dem Login kopieren
但是,使用clone关键字只是一个浅拷贝,因为所有引用的属性仍将指向原始变量。
如果在对象中定义了clone()方法,则将在复制生成的对象中调用clone()方法,该方法可用于修改属性的值(如有必要)。
下面是相关的示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <?php
class Person
{
public $sex ;
public $name ;
public $age ;
public function __construct( $name = "" , $age =25, $sex ='Male')
{
$this ->name = $name ;
$this ->age = $age ;
$this ->sex = $sex ;
}
public function __clone()
{
echo __METHOD__ . "your are cloning the object.<br>" ;
}
}
$person = new Person( 'John' );
$person2 = clone $person ;
var_dump( 'persion1:' );
var_dump( $person );
echo '<br>' ;
var_dump( 'persion2:' );
var_dump( $person2 );
|
Nach dem Login kopieren
Nach dem Login kopieren
运行代码结果如下:
1 2 3 | Person::__clone your are cloning the object.
string(9) "persion1:" object(Person)#1 (3) { [ "sex" ]=> string(3) "Male" [ "name" ]=> string(6) "John" [ "age" ]=> int(25) }
string(9) "persion2:" object(Person)#2 (3) { [ "sex" ]=> string(3) "Male" [ "name" ]=> string(6) "John" [ "age" ]=> int(25) }
|
Nach dem Login kopieren
Nach dem Login kopieren
15.__autoload()
__autoload()方法可以尝试加载未定义的类。
过去,如果要在程序文件中创建100个对象,则必须使用include()或require()来包含100个类文件,或者必须在同一类文件中定义100个类。 例如以下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
require_once ( 'project/class/A.php' );
require_once ( 'project/class/B.php' );
require_once ( 'project/class/C.php' );
.
.
.
if (ConditionA) {
$a = new A();
$b = new B();
$c = new C();
} else if (ConditionB) {
$a = newA();
$b = new B();
}
|
Nach dem Login kopieren
Nach dem Login kopieren
那么,如果我们使用__autoload()方法呢?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
function __autoload( $className ) {
$filePath = “project/ class /{ $className }.php”;
if ( is_readable ( $filePath )) {
require ( $filePath );
}
}
if (ConditionA) {
$a = new A();
$b = new B();
$c = new C();
} else if (ConditionB) {
$a = newA();
$b = new B();
}
|
Nach dem Login kopieren
Nach dem Login kopieren
当PHP引擎第一次使用类A时,如果未找到类A,则autoload方法将被自动调用,并且类名称“ A”将作为参数传递。因此,我们在autoload()方法中需要做的是根据类名找到相应的类文件,然后将其包含在内。如果找不到该文件,则php引擎将抛出异常。
16. __debugInfo()
当执行 var_dump()
方法时,__debugInfo()
方法会被自动调用。如果 __debugInfo()
方法未被定义,那么 var_dump
方法或打印出这个对象的所有属性。
举例说明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php
class C {
private $prop ;
public function __construct( $val ) {
$this ->prop = $val ;
}
public function __debugInfo() {
return [
'propSquared' => $this ->prop ** 2,
];
}
}
var_dump( new C(42));
|
Nach dem Login kopieren
Nach dem Login kopieren
执行结果:
1 | object(C)#1 (1) { [ "propSquared" ]=> int(1764) }
|
Nach dem Login kopieren
Nach dem Login kopieren
注意:__debugInfo() 方法应该在 PHP 5.6.0 及以上版本中使用。
总结
以上就是我所了解的 PHP
魔术方法,其中常用的包括 __set()
还有 __get()
和 __autoload()
。如果你还有其他疑问,可以从 PHP
官方网站获得更多帮助。
推荐学习:《PHP视频教程》
Das obige ist der detaillierte Inhalt vonWas ist die PHP-Magic-Methode?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!