2011-11-12 2 views
1

Fondamentalement ce que je veux faire:Transfert des variables php de classe en classe étendue

<?php 
    class App { 
    public $var = "main-class"; 
    public function load() { 
     $this->var = "child-class"; 
     $child = new Child; 
     $child->echo_var(); 
    } 
    } 
    class Child extends App { 
    public function echo_var() { 
     echo $this->var; 
    } 
    } 

    $app = new Child; 
    $app->load(); 
?> 

Il affiche « classe principale », je le veux à la sortie de « classe enfant » sans avoir à modifier la classe enfant (parce que je veux que ce soit une sorte de classe "propre" et dynamique).

J'accepte des suggestions pour un autre cours d'action

PS: Cela fait partie d'un cadre petit MVC je suis en train de se développer.

+0

Cela ne semble pas tout à fait correct. Pour être en mesure de suggérer un autre plan d'action, vous devez fournir un peu de contexte. Que fait exactement 'load()'? – Vikk

+0

J'ai une sorte de var globale nommée "models", elle est initialisée comme ceci: public $ models = array(); et j'ai une fonction qui remplit ce tableau en fonction des classes utilisées dans le contrôleur en cours, $ this-> uses_class ("Thumbnail"); qui agit sur les modèles, en ajoutant au tableau ... avant d'appeler la classe enfant, le tableau est bien peuplé avec les classes que j'ajoute, mais après, le $ models var réinitialise en array() –

Répondre

1

Vous pouvez le faire de deux façons. Les deux vont avoir besoin d'utiliser des constructeurs. Avec le premier, l'enfant se déclarera lors de sa création

<?php 
class App { 
    public $var = "main-class"; 

    public function __construct($var=null) { 
     if($var !== null) { 
      $this->var = $var; 
     } 
    } 

    public function load() { 
     $child = new Child(); 
     $child->echo_var(); 
    } 
} 

class Child extends App { 
    public function __construct(){ 
     parent::__construct("child-class"); 
    } 

    public function echo_var() { 
     echo $this->var; 
    } 
} 

$app = new Child(); 
$app->load(); 
?> 

Le second permet au parent de déclarer le nom de l'enfant.

<?php 
class App { 
    public $var = "main-class"; 

    public function __construct($var=null) { 
     if($var !== null) { 
      $this->var = $var; 
     } 
    } 

    public function load() { 
     $child = new Child ("child-class"); 
     $child->echo_var(); 
    } 
} 

class Child extends App { 
    public function echo_var() { 
     echo $this->var; 
    } 
} 

$app = new Child(); 
$app->load(); 
?> 

Ces deux exemples fonctionnent et font ce que vous voulez, je crois.

0

Ce n'est pas le fonctionnement de l'héritage - En créant un nouvel objet Child, ses membres de données sont tous initialisés avec leurs valeurs par défaut. Lorsque vous faites $this->var = "" dans la classe parente, vous définissez les membres de données pour l'objet $app, pas l'objet $child.

Vous pouvez modifier la classe enfant pour incorporer un constructeur qui accepte les paramètres, et ce constructeur définirait correctement ses membres de données. Pour obtenir quelque chose de semblable à ce que vous voulez, vous pouvez utiliser des constructeurs:

<?php 
    class App { 
    public $var = "main-class"; 
    public function __construct() { 
     $this->var = "child-class"; 
    } 
    public function load() { 
     $child = new Child; 
     $child->echo_var(); 
    } 
    } 
    class Child extends App { 
    public function __construct() 
    { 
     parent::__construct(); 
    } 
    public function echo_var() { 
     echo $this->var; 
    } 
    } 

    $app = new App; 
    $app->load(); 
0

Je trouve très étrange que votre classe parent instancie c'est enfant. Généralement, vous instanciez l'enfant, et vous obtenez toutes les fonctionnalités du parent.

$app = new Child(); 
$app->load(); 

Le problème est que vous avez réellement 2 instanciations différentes. Vous avez un objet de App et il tient un objet séparé de Child. L'autre façon de faire cela serait de faire de $ var une variable statique, puis elle serait disponible indépendamment de l'instanciation. Je ne recommande généralement pas de faire des propriétés statiques. C'est généralement considéré comme une mauvaise forme (pour de nombreuses raisons).

+0

vous avez raison, Pardon! C'était juste une faute de frappe ... Mais toujours le même résultat. –

Questions connexes