Explication détaillée d'exemples de surcharge et de méthodes magiques en php

黄舟
Libérer: 2023-03-16 21:32:01
original
1231 Les gens l'ont consulté

Définition  : PHP réserve 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 préfixer .

Fonction : Les méthodes de modèle peuvent être utilisées pour implémenter facilement la surcharge en PHP orienté objet (La surcharge signifie créer dynamiquement des classes propriétés et méthodes )

En fait, de nombreux blogueurs ont déjà écrit sur ces méthodes... mais je veux quand même le répéter. . Qui vous a demandé de venir écouter ? Ce n’est pas facile de finir de lire autant de mots avant de partir !

1.construct, destruct
constuct est appelé lors de la construction de l'objet ;
destruct est appelé lorsque l'objet est explicitement détruit ou que le script se termine

class Foo {    
private $name;    
private $link;    
public function construct($name) {        
$this->name = $name;
    }    
    public function destruct() {        
    echo 'Destroying: ', $this->name, PHP_EOL;//PHP_EOL代表php的换行符    }
}
Copier après la connexion
Stop, commençons par la définition et l'utilisation de la surcharge :

Définition : "surcharge fournie par PHP >"(surcharge) fait référence à la "création" dynamique de propriétés et de méthodes de classe. (Nous y parvenons grâce à des méthodes magiques)

Fonction : Lors de l'appel d'attributs ou de méthodes de classe non définis ou invisibles dans l'environnement actuel, la méthode surchargée sera appelée. Nous utiliserons plus tard "propriétés inaccessibles" et "méthodes inaccessibles" pour faire référence à ces propriétés ou méthodes de classe non définies ou invisibles.

Remarque : Toutes les méthodes surchargées doivent être déclarées comme publique.

2.get, set, isset, unset, call, callStatic //Pourquoi sont-ils mis ensemble ?

set est appelé lors de l'attribution d'une valeur à un attribut inaccessible ou inexistant
get est appelé lors de la lecture d'un attribut inaccessible ou inexistant

isset est non accessible ou une propriété inexistante est appelée lorsque isset() ou empty() est appelé

unset est appelé lorsqu'une propriété inaccessible ou inexistante n'est pas définie

l'appel est appelé lorsqu'une propriété inaccessible ou non -la méthode existante est appelée Call

callStatic est appelée lors de l'appel d'une méthode statique inaccessible ou inexistante

Exemple n°1 Utilisez get(), set(), isset() et unset() pour la surcharge d'attributs

<?php
class PropertyTest {
     /**  被重载的数据保存在此  */
    private $data = array();

 
     /**  重载不能被用在已经定义的属性  */
    public $declared = 1;

     /**  只有从类外部访问这个属性时,重载才会发生 */
    private $hidden = 2;

    public function set($name, $value) 
    {
        echo "Setting &#39;$name&#39; to &#39;$value&#39;\n";
        $this->data[$name] = $value;
    }


    public function get($name) 
    {
        echo "Getting &#39;$name&#39;\n";
        if (array_key_exists($name, $this->data)) {
            return $this->data[$name];
        }

        $trace = debug_backtrace();
        trigger_error(
            &#39;Undefined property via get(): &#39; . $name .
            &#39; in &#39; . $trace[0][&#39;file&#39;] .
            &#39; on line &#39; . $trace[0][&#39;line&#39;],
            E_USER_NOTICE);
        return null;
    }



    /**  PHP 5.1.0之后版本 */
    public function isset($name) 
    {
        echo "Is &#39;$name&#39; set?\n";
        return isset($this->data[$name]);
    }

    /**  PHP 5.1.0之后版本 */
    public function unset($name) 
    {
        echo "Unsetting &#39;$name&#39;\n";
        unset($this->data[$name]);
    }

    /**  非魔术方法  */
    public function getHidden() 
    {
        return $this->hidden;
    }
}


echo "<pre class="brush:php;toolbar:false">\n";

$obj = new PropertyTest;

$obj->a = 1;
echo $obj->a . "\n\n";

var_dump(isset($obj->a));
unset($obj->a);
var_dump(isset($obj->a));
echo "\n";

echo $obj->declared . "\n\n";

echo "Let&#39;s experiment with the private property named &#39;hidden&#39;:\n";
echo "Privates are visible inside the class, so get() not used...\n";
echo $obj->getHidden() . "\n";
echo "Privates not visible outside of class, so get() is used...\n";
echo $obj->hidden . "\n";
?>
Copier après la connexion
Avez-vous fini de lire ? Beau!

5.sleep, wakeupsleep est appelé lors de l'utilisation de la sérialisation, utile lorsque vous n'avez pas besoin de sauvegarder toutes les données d'un gros objet

wakeup lors de l'utilisation Appelé lors de la désérialisation, peut être utilisé pour initialiser des objets Comportement de clonage d'objet

<?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();
    }
}
?>
Copier après la connexion

7.toString est appelé lorsqu'une classe est convertie en chaîne

8. set_state
<?php
class SubObject
{
    static $instances = 0;
    public $instance;

    public function construct() {
        $this->instance = ++self::$instances;
    }

    public function clone() {
        $this->instance = ++self::$instances;
    }
}

class MyCloneable
{
    public $object1;
    public $object2;

    function clone()
    {
      
        // 强制复制一份this->object, 否则仍然指向同一个对象
        $this->object1 = clone $this->object1;
    }
}

$obj = new MyCloneable();

$obj->object1 = new SubObject();
$obj->object2 = new SubObject();

$obj2 = clone $obj;


print("Original Object:\n");
print_r($obj);

print("Cloned Object:\n");
print_r($obj2);

?>
Copier après la connexion

Cette méthode statique est appelée lorsque var_export() est appelée pour exporter une classe. Utilisez la valeur de retour de set_state comme valeur de retour de var_export.

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!

Étiquettes associées:
source:php.cn
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal