Table des matières
Afin de ne pas signaler d'erreur lors de l'appel d'une méthode qui n'existe pas dans une classe, on peut définir_ dans la classe Méthode _call, elle sera automatiquement exécutée à ce moment
Résumé :
(四)、了解__callStatic()魔术方法的使用场景
(五)、掌握__callStatic()魔术方法的用法
(六)、总结
Maison développement back-end tutoriel php Explication détaillée des méthodes magiques PHP __call et __callStatic (exemples de code)

Explication détaillée des méthodes magiques PHP __call et __callStatic (exemples de code)

May 27, 2020 pm 05:43 PM
面向对象 魔术方法

Objectifs de cet article :

1. Comprendre la définition de la méthode magique en PHP

2 Comprendre les scénarios d'utilisation de la méthode magique __call()

3. Maîtriser l'utilisation de la méthode magique __call()

4. Comprendre les scénarios d'utilisation de la méthode magique __callStatic()

5. Maîtriser l'utilisation de la méthode magique __callStatic()

(1) Comprendre la définition des méthodes magiques en PHP

PHP Conserver toutes les méthodes de classe commençant par __ (deux traits de soulignement) comme méthodes magiques. Par conséquent, lors de la définition des méthodes de classe, à l'exception des méthodes magiques ci-dessus, il est recommandé de ne pas les préfixer par __.

Il existe un autre nom pour ces deux méthodes magiques. Elles peuvent également être appelées surcharge de la méthode <.> (2) Comprendre les scénarios d'utilisation de la méthode magique __call()

Afin de ne pas signaler d'erreur lors de l'appel d'une méthode qui n'existe pas dans une classe, on peut définir_ dans la classe Méthode _call, elle sera automatiquement exécutée à ce moment

(3) Maîtriser l'utilisation de la méthode magique __call()

Résumé :


1. Le format de __call défini dans la classe est le suivant : fonction publique __call (paramètre 1, paramètre 2). Notez ici qu'il doit être 2 __, il doit être __call, et il doit prendre 2 paramètres. ne fonctionne pas

2. Lors de l'appel d'une méthode qui n'existe pas, le système déclenchera automatiquement la méthode __call définie de la classe où se trouve l'objet

Chaque résumé est obtenu via pratique. Maintenant, nous utilisons la pratique pour démontrer le résumé, ce qui peut favoriser la compréhension et rendre chaque résumé plus clair et plus intuitif

Cas 1,

Objectifs pratiques :

1 En PHP, __call est défini dans la classe sous le format suivant : fonction publique __call (paramètre 1, paramètre 2) . Notez qu'il faut C'est 2 __, ça doit être __call, et ça doit prendre 2 paramètres, un de plus ou de moins ne fonctionnera pas

Le code spécifique est le suivant : Prenons un. regardez d'abord sans paramètres

<?php
class Animal{
    public function eat(){

    }
    public function sleep(){

    }
    //魔术方法 
    public  function __call(){
        echo "自动执行了Animal类中的__call方法<br/>";
    }
}
$ani = new Animal();

?>
Copier après la connexion

Les résultats d'exécution sont les suivants :

Erreur fatale : Méthode Animal::__call() doit prendre exactement 2 arguments dans D:E- classclass-codeclassingindex.php en ligne 15

Écrivez maintenant 2 paramètres

<?php
class Animal{
    public $name = "";
    public function __construct($name){
        $this->name = $name;
    }
    public function eat(){

    }
    public function sleep(){

    }
    //魔术方法 
    public function __call($name,$args){
        echo "自动执行了Animal类中的__call方法<br/>";
    }
}
$monkey = new Animal("猴子");

?>
Copier après la connexion

Les résultats d'exécution sont les suivants :

Page blanche, indiquant qu'aucune erreur n'a été signalée, correcte


Cas 2,

Objectifs pratiques :

1 Lors de l'appel d'une méthode qui n'existe pas, le système déclenchera automatiquement la méthode __call définie de la classe. où se trouve l'objet

Le code spécifique est le suivant :

<?php
class Animal{
    public $name = "";
    public function __construct($name){
        $this->name = $name;
    }
    public function eat(){

    }
    public function sleep(){

    }
    //魔术方法 
    public function __call($name,$args){
        echo "自动执行了Animal类中的__call方法<br/>";
    }
}
$monkey = new Animal("猴子");
//调用不存在的方法
$monkey->test();
?>
Copier après la connexion

Le résultat de l'exécution est :

La méthode __call dans la classe Animal est automatiquement exécutée

我们发现其实我们没有手动的去调用__call方法,也就是说没有写成$monkey->__call(),但是这个方法依然执行了,因为什么呢?因为我们写了$monkey->test();而这个test方法没有在类中定义,然后这个类中又定义了这个魔术方法,所以它就像魔术一样,突然就被自动执行了

这里一定要注意,是2个下划线,不是一个,否则就不是魔术方法了,下面还是再来做下测试

具体代码如下:

<?php
class Animal{
    public $name = "";
    public function __construct($name){
        $this->name = $name;
    }
    public function eat(){

    }
    public function sleep(){

    }
    //魔术方法 试着少写一个_看下
    public function _call($name,$args){
        echo "自动执行了Animal类中的__call方法<br/>";
    }
}
$monkey = new Animal("猴子");
//调用不存在的方法
$monkey->test();
?>
Copier après la connexion

运行结果为:

Fatal error: Uncaught Error: Call to undefined method Animal::test() in D:\E-class\class-code\classing\index.php:20 Stack trace: #0 {main} thrown in D:\E-class\class-code\classing\index.php on line 20

所以此刻就会报错了,因为没有__call的魔术方法了,所以一定要注意是2个下划线,就好像构造函数和析构函数一样,都是两个下划线


(四)、了解__callStatic()魔术方法的使用场景

为了在调用一个类中不存在的静态方法时,不报错,我们可以在类中定义__callStatic方法,它会在此刻被自动执行

(五)、掌握__callStatic()魔术方法的用法

1、PHP中__callStatic在类中定义格式如下 static public function __callStatic(参数1,参数2),这里注意必须是2个__,必须是__callStatic,而且必须是要带2个参数,多一个少一个都不行

2、当调用不存在的静态方法时,系统会自动触发对象所在类的定义好的__callStatic方法

每个总结都是通过实践得出来的,现在我们用实践来演示总结,这样可以促进理解,让每个总结理解起来更加清晰,直观

案例一、

实践目标:

1、PHP中__callStatic在类中定义格式如下 static public function __callStatic(参数1,参数2),这里注意必须是2个__,必须是__callStatic,而且必须是要带2个参数,多一个少一个都不行

具体代码如下:

<?php
class Animal{
    public $name = "";
    public function __construct($name){
        $this->name = $name;
    }
    public function eat(){

    }
    public function sleep(){

    }
    static public function staticFun(){
        echo "Animal中的staticFun执行了<br/>";
    }
    //魔术方法
    static public  function __callStatic($name,$args){
        echo "自动执行了Animal类中的__callStatic方法<br/>";
    }
}
//调用不存在的静态方法
Animal::staticFun();
Animal::test();
?>
Copier après la connexion

运行结果如下:

Animal中的staticFun执行了
自动执行了Animal类中的__callStatic方法

我们发现其实我们没有手动的去调用__callStatic方法,也就是说没有写成Animal::__callStatic(),但是这个方法依然执行了,因为什么呢?因为我们写了Animal::test();这个静态方法在类中不存在,然后这个类中又定义了这个魔术方法,所以它就像魔术一样,突然就被自动执行了

这里一定要注意,是2个下划线,不是一个,否则就不是魔术方法了,下面还是再来做下测试

<?php
class Animal{
    public $name = "";
    public function __construct($name){
        $this->name = $name;
    }
    public function eat(){

    }
    public function sleep(){

    }
    static public function staticFun(){
        echo "Animal中的staticFun执行了<br/>";
    }
    //魔术方法 试着少写一个
    static public  function _callStatic($name,$args){
        echo "自动执行了Animal类中的__callStatic方法<br/>";
    }
}
//调用不存在的静态方法
Animal::staticFun();
Animal::test();
?>
Copier après la connexion

运行结果如下:

Animal中的staticFun执行了

Fatal error: Uncaught Error: Call to undefined method Animal::test() in D:\E-class\class-code\classing\index.php:23 Stack trace: #0 {main} thrown in D:\E-class\class-code\classing\index.php on line 23

所以此刻就会报错了,因为没有__callStatic的魔术方法了,所以一定要注意是2个下划线,就好像构造函数和析构函数一样,都是两个下划线,而且一定要记得这个魔术方法本身就是static静态方法,否则也不会对

重要的东西我们还是用代码实践一下:

<?php
class Animal{
    public $name = "";
    public function __construct($name){
        $this->name = $name;
    }
    public function eat(){

    }
    public function sleep(){

    }
    // static public function staticFun(){
    //     echo "Animal中的staticFun执行了<br/>";
    // }
    //魔术方法  试着少写static
    public  function __callStatic($name,$args){
        echo "自动执行了Animal类中的__callStatic方法<br/>";
    }
}
//调用不存在的静态方法
// Animal::staticFun();
Animal::test();
?>
Copier après la connexion

运行结果为:

Warning: The magic method __callStatic() must have public visibility and be static in D:\E-class\class-code\classing\index.php on line 17
自动执行了Animal类中的__callStatic方法

所以一定要注意,__callStatic本身就是静态方法,不要少写static

(六)、总结

1、本文主要讲了另外2个魔术方法,__call,__callStatic,讲了他们的使用场景以及具体的实现

希望本文能给大家带来一定的帮助,谢谢!!!

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment implémenter une programmation événementielle orientée objet à l'aide du langage Go Comment implémenter une programmation événementielle orientée objet à l'aide du langage Go Jul 20, 2023 pm 10:36 PM

Comment utiliser le langage Go pour implémenter une programmation événementielle orientée objet Introduction : Le paradigme de programmation orientée objet est largement utilisé dans le développement de logiciels, et la programmation événementielle est un modèle de programmation courant qui réalise le flux du programme à travers le déclenchement et le traitement de contrôle des événements. Cet article présentera comment implémenter une programmation événementielle orientée objet à l'aide du langage Go et fournira des exemples de code. 1. Le concept de programmation événementielle La programmation événementielle est un modèle de programmation basé sur des événements et des messages, qui transfère le contrôle du flux du programme au déclenchement et au traitement des événements. en mode événementiel

Quelle est l'importance de l'annotation @JsonIdentityInfo utilisant Jackson en Java ? Quelle est l'importance de l'annotation @JsonIdentityInfo utilisant Jackson en Java ? Sep 23, 2023 am 09:37 AM

L'annotation @JsonIdentityInfo est utilisée lorsqu'un objet a une relation parent-enfant dans la bibliothèque Jackson. L'annotation @JsonIdentityInfo est utilisée pour indiquer l'identité de l'objet lors de la sérialisation et de la désérialisation. ObjectIdGenerators.PropertyGenerator est une classe d'espace réservé abstraite utilisée pour représenter les situations dans lesquelles l'identifiant d'objet à utiliser provient d'une propriété POJO. Syntaxe@Target(value={ANNOTATION_TYPE,TYPE,FIELD,METHOD,PARAMETER})@Retention(value=RUNTIME)public

Explorez la programmation orientée objet dans Go Explorez la programmation orientée objet dans Go Apr 04, 2024 am 10:39 AM

Le langage Go prend en charge la programmation orientée objet via la définition de type et l'association de méthodes. Il ne prend pas en charge l'héritage traditionnel, mais est mis en œuvre par composition. Les interfaces assurent la cohérence entre les types et permettent de définir des méthodes abstraites. Des cas pratiques montrent comment utiliser la POO pour gérer les informations client, notamment la création, l'obtention, la mise à jour et la suppression d'opérations client.

Analyse des fonctionnalités orientées objet du langage Go Analyse des fonctionnalités orientées objet du langage Go Apr 04, 2024 am 11:18 AM

Le langage Go prend en charge la programmation orientée objet, définissant des objets via des structures, définissant des méthodes à l'aide de récepteurs de pointeurs et implémentant le polymorphisme via des interfaces. Les fonctionnalités orientées objet assurent la réutilisation, la maintenabilité et l'encapsulation du code dans le langage Go, mais il existe également des limitations telles que le manque de concepts traditionnels de classes et d'héritage et de conversions de signatures de méthodes.

Analyse du modèle Flyweight dans la programmation orientée objet PHP Analyse du modèle Flyweight dans la programmation orientée objet PHP Aug 14, 2023 pm 05:25 PM

Analyse du modèle Flyweight dans la programmation orientée objet PHP Dans la programmation orientée objet, le modèle de conception est une méthode de conception logicielle couramment utilisée, qui peut améliorer la lisibilité, la maintenabilité et l'évolutivité du code. Le modèle Flyweight est l’un des modèles de conception qui réduit la surcharge de mémoire en partageant des objets. Cet article explique comment utiliser le mode poids mouche en PHP pour améliorer les performances du programme. Qu’est-ce que le mode poids mouche ? Le modèle de poids mouche est un modèle de conception structurelle dont le but est de partager le même objet entre différents objets.

Fonctionnalités avancées PHP : meilleures pratiques en matière de programmation orientée objet Fonctionnalités avancées PHP : meilleures pratiques en matière de programmation orientée objet Jun 05, 2024 pm 09:39 PM

Les meilleures pratiques de POO en PHP incluent les conventions de dénomination, les interfaces et les classes abstraites, l'héritage et le polymorphisme, ainsi que l'injection de dépendances. Les cas pratiques incluent : l'utilisation du mode entrepôt pour gérer les données et l'utilisation du mode stratégie pour mettre en œuvre le tri.

Existe-t-il des fonctionnalités orientées objet de type classe dans Golang ? Existe-t-il des fonctionnalités orientées objet de type classe dans Golang ? Mar 19, 2024 pm 02:51 PM

Il n'y a pas de concept de classe au sens traditionnel dans Golang (langage Go), mais il fournit un type de données appelé structure, à travers lequel des fonctionnalités orientées objet similaires aux classes peuvent être obtenues. Dans cet article, nous expliquerons comment utiliser les structures pour implémenter des fonctionnalités orientées objet et fournirons des exemples de code concrets. Définition et utilisation des structures Examinons d'abord la définition et l'utilisation des structures. Dans Golang, les structures peuvent être définies via le mot-clé type, puis utilisées si nécessaire. Les structures peuvent contenir des attributs

Décrypter la métaprogrammation Python : des bases aux paradigmes avancés Décrypter la métaprogrammation Python : des bases aux paradigmes avancés Feb 19, 2024 pm 03:30 PM

Bases de la métaprogrammation Python La métaprogrammation Python est la capacité de manipuler dynamiquement le code Python, ce qui fait de Python un langage très puissant. La métaprogrammation peut être implémentée des manières suivantes : Décorateur de classe : Un décorateur de classe est un décorateur qui modifie la définition d'une classe. Il peut être utilisé pour ajouter ou modifier les propriétés et méthodes d'une classe, et peut également être utilisé pour contrôler le processus d'instanciation d'une classe. defadd_method_to_class(cls):defnew_method(self):print("Thisisanewmethod")setattr(cls,"new_method",new_method)returncls@a

See all articles