À l'aide de parent de variables dans une classe étendue en PHP
J'ai 2 classes, une principale et une étendue. J'ai besoin d'utiliser la rva en classe étendue.
<?php
class Main {
public $vars = array();
}
$main = new Main;
$main->vars['key'] = 'value';
class Extended extends Main { }
$other = new Extended;
var_dump($other->vars);
?>
Qui je peux le faire?
Pas valide pour l'exemple:
<?php
class Extended extends Main {
function __construct ($main) {
foreach ($main as $k => $v) {
$this->$k = $v;
}
}
}
?>
J'ai besoin d'une solution plus efficace et transparent 🙂
- Je n'ai pas l'obtenir. Je serais ravi de répondre à votre question, mais c'est pas assez clair. Voulez-vous construire "étendue" comme ($obj = new Étendu($principal)) ou vous cherchez statique de vars?
Vous devez vous connecter pour publier un commentaire.
MODIFIER: Cela peut être résolu beaucoup mieux avec Inversion de Contrôle (Cio) et l'Injection de Dépendance (DI). Si vous utilisez votre propre cadre de référence ou l'un sans Conteneur d'Injection de Dépendance essayer Ligue/Conteneur
Réponse ci-dessous à gauche, comme l'histoire de folles réponses.
La façon correcte je figure.
Il serait facilement possible avec un simple constructeur
Je réalise que c'est super vieux, mais au cas où quelqu'un d'autre a besoin d'un indice...
Avez-vous envisagé d'utiliser des variables statiques?
Le PHP POO modèle de conception est telle que statiquement les variables déclarées dans un parent classe restent les mêmes dans les enfant classe, trop.
Par exemple...
L'exécution de ce code (sur PHP 5.3 - je suis sûr que c'est la même chose pour les autres versions, trop) vous donnera le résultat suivant:
Test est: un
De ce que j'ai pu recueillir dans votre opération, vous êtes à la recherche d'un moyen pour le parent de variables de classe rester - même dans l'étendue des classes. Cela résout le problème.
Pour appeler les variables publiquement en dehors de la portée de classe (c'est à dire l'endroit où vous auriez normalement écrire $obj->vars), vous auriez besoin de créer une fonction dans la classe parent qui fait référence à
self::$variable_name
de sorte qu'il peut lancer que la variable de retour pour le code qui utilise soit la classe, ou de toute autre classe qui étend la classe elle.Par exemple, quelque chose comme:
Vous pouvez également créer une méthode magique qui serait dynamiquement jeter en arrière de la self::$variable en fonction de ce que vous demandez de l'instance pour l' - c'est à dire une méthode ou une variable. Vous pourriez fil le code de jeter en arrière de la self::$variable équivalent dans tous les cas.
Lire http://php.net/manual/en/language.oop5.magic.php pour plus d'informations sur les différentes méthodes magiques qui vous permettent de faire ce genre de trucs.
L'OP était un peu cryptique, donc je n'étais pas sûr si c'est exactement ce que tu voulais, mais je ne vois personne d'autre ici référence à des variables statiques, donc je pensais que je serais carillon - espérons que cela aide!
Je pense que vous devez être plus clair sur ce que vous voulez. Imaginez que vous avez plusieurs instances à la fois Principal et Prolongée. Devraient-ils se réfèrent tous aux mêmes données, de sorte que si vous modifiez les données dans l'un d'eux, ils sont tous concernés?
Si oui, alors une approche consiste à utiliser une variable statique, qui est liée à la classe plutôt que pour chaque instance. Une autre est de créer un objet (d'une autre classe) pour stocker vos données, et de les passer à la Principale et Prolongée des cours lorsqu'ils sont créés. Ils pouvaient stocker une référence, par exemple:
Si pas, alors vous voulez des copies des données, plutôt que de références pour les mêmes données. Dans ce cas, votre deuxième exemple est plus proche, bien que je ne serait pas juste de copier aveuglément tous les membres.
oooooooooooooooooooooooooooooooooooooooooooooooooooooh
vous voulez que cela:
🙂
EDIT:
aussi, vous pouvez faire ceci: