2011-11-12 196 views
1

基本上這就是我想做的事:傳輸PHP變量的類繼承類

<?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(); 
?> 

輸出「主類」,我希望它輸出「子級」,而無需修改孩子班(因爲我希望它是一個「乾淨」和動態類)。

我接受行動

PS的另一門課程的建議:這是一個小的MVC框架我試圖開發的一部分。

+0

這似乎不太正確。爲了能夠提出另一種行動方案,您必須提供一些背景。 'load()'到底做了什麼? – Vikk

+0

我有一個名爲「models」的全局變量,它的初始化是這樣的: public $ models = array(); 我有一個函數根據當前控制器中使用的類來填充該數組, $ this-> uses_class(「Thumbnail」); 它作用於模型,添加到數組...在調用子類之前,數組填充了我添加的類,但之後,$ models var重置爲array() –

回答

1

有兩種方法可以做到這一點。兩者都需要使用構造函數。隨着第一個,孩子將在創建時聲明

<?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(); 
?> 

第二個允許父母聲明孩子的名字。

<?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(); 
?> 

這兩個例子都可以工作,做你想做的事情,我相信。

0

這不是繼承的工作原理 - 通過創建一個新的Child對象,其數據成員都使用其默認值進行初始化。當您在父類中執行$this->var = ""時,您正在設置$app對象的數據成員,而不是$child對象。

您可以修改子類以包含接受參數的構造函數,並且該構造函數將正確設置其數據成員。爲了實現類似於你想要的東西,你可以使用構造函數:

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

我覺得很奇怪你的父類實例化它的孩子。一般來說,你可以實現孩子的實例化,並且獲得父級的所有功能。

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

問題是,你實際上有2個不同的instanciations。你有一個App對象,它擁有一個獨立的Child對象。

做到這一點的另一種方法是使$ var成爲一個靜態變量,然後它將獨立於實例化而可用。我通常不建議使屬性靜態。這通常被認爲是不好的形式(由於許多原因)。

+0

您是對的,抱歉! 這只是一個錯字... 但仍然是相同的結果。 –