Maison  >  Article  >  développement back-end  >  Solution au problème des paramètres du constructeur de classe en PHP

Solution au problème des paramètres du constructeur de classe en PHP

黄舟
黄舟original
2017-07-02 09:55:092077parcourir

Le code détaillé est le suivant :

<?php
final class Registry {
    private $data = array();
    public function get($key) {
        return $this->data[$key];
    }
    public function set($key, $value) {
        $this->data[$key] = $value;
    }
}
abstract class Controller {
    protected $registry;   
    public function construct($registry) {
        $this->registry = $registry;
    }
}
class ControllerCommonHome extends Controller {
    public function test() {
        $this->registry->set(&#39;load&#39;,&#39;load&#39;);
    }
}
$registry = new Registry();
$con = new ControllerCommonHome($registry);
$con->test();
echo $registry->get(&#39;load&#39;);
?>

Comment le paramètre $registry est-il transmis lorsque $conobject est initialisé ? Valeur du Passou adresse ? S'il est passé par valeur, alors lorsque l'objet $con exécute la fonction test(), cela ne devrait pas affecter l'objet d'origine $registry, mais en fait, cela affecte la valeur du registre.
Mais si je change $registry en une variable simple, telle que $registry = 123, et que j'attribue une valeur à $registry dans l'objet $con, cette fois, cela n'affecte pas la variable d'origine, qui est toujours 123.
Résoudre

D'accord, clone() Constructeur. Les objets peuvent être clonés. La raison du clonage est que vous ne souhaitez pas modifier son état précédent.
Les objets ne sont pas des variables générales. Veuillez consulter la section suivante de la recherche Google

Transmission d'objets
. PHP5 utilise Zend Engine II, les objets sont stockés dans une structure indépendante Object Store, au lieu d'être stockés dans Zval comme les autres variables générales (en PHP4, les objets sont stockés dans Zval comme les variables générales) ). Seul le pointeur de l'objet est stocké dans Zval plutôt que le contenu (valeur). Lorsque nous copions un objet ou transmettons un objet en tant que paramètre à une fonction, nous n'avons pas besoin de copier les données. Conservez simplement le même pointeur d'objet et laissez un autre zval informer le magasin d'objets vers lequel cet objet particulier pointe maintenant. Étant donné que l'objet lui-même se trouve dans le magasin d'objets, toute modification que nous y apporterons affectera toutes les structures zval contenant des pointeurs vers l'objet - se manifestant dans le programme car toute modification apportée à l'objet cible affectera l'objet source. .Cela donne l'impression que les objets PHP sont toujours passés par référence (référence), donc les objets en PHP sont passés par "référence" par défaut, et vous n'avez plus besoin d'utiliser & pour le déclarer comme en PHP4.

Je n'ai jamais pensé à ce genre de problème auparavant. J'ai seulement cherché des informations après avoir vu votre question

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:
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