2009-09-01 76 views
0

我試圖從擴展類中檢索變量。這是我的主要課程:來自擴展類的PHP變量

class SS { 
    public $NONE = NULL; 
    public $NUMBERS = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "0"); 
    public $OPERATORS = array("=", "&&", ">", "<", "+", "-", "/", "*", "^"); 
    public $DBLQUOTES = '"$1"'; 
    public $SNGQUOTES = "'$1'"; 
    public $CODE; 

    function SuperSyn($sCode, $cLang) {   
     $hLang = new VB6; 
     $VB6 = $hLang->__construct(); 
     echo $VB6->ssAuthor; 
    } 
} 

而我的擴展類看起來像這樣(我刪除了很多關鍵字)。

class VB6 extends SS { 
    public function __construct() { 
     $ssAuthor = "James Brooks"; 
     $ssCSS = "languages/vb6.css"; 
     $ssNumbers = $NUMBERS; 
     $ssKeywords = array("Abs", "Access", "AddItem"); 
     $ssReserved = $NONE; 
     $ssComments = "('.+)"; 
     $ssOperators = $OPERATORS; 
     $ssDoubleQuote = $NONE; 
     $ssSingleQuote = $NONE; 
    } 
} 

如果我刪除公共函數__construct被調用,PHP母狗,它期待一個函數。

我的問題是,我如何從擴展類中檢索一個變量到我的主類?

回答

1

當你創建一個對象的構造函數將被調用你,所以這應該工作:

function SuperSyn($sCode, $cLang) {      
    $hLang = new VB6(); //I think you need some parameters here 
    echo $VhLang->ssAuthor; 
} 

但是在VB6的構造目前只分配局部變量,所以你將無法從外部訪問ssAuthor。相反,你可能想要做這樣的事情:

class VB6 extends SS { 
    public $ssAuthor; 

    public function __construct() { 
     $this->ssAuthor = "James Brooks"; 
     //etc. 
    } 
} 
+0

太棒了!謝謝湯姆! – 2009-09-01 10:20:37

1

使用php的父關鍵字。

PHP parent

+0

雖然在哪裏?我在哪裏放置關鍵字? – 2009-09-01 10:11:43

+1

檢查: http://stackoverflow.com/questions/393204/using-parent-variables-in-a-extended-class-in-php 那裏的主題進行了詳細討論。 – KB22 2009-09-01 10:47:47

0

我認爲有你expectiation一個邏輯問題。爲什麼SS類的函數知道一個只存在於VB6子類中的變量?

這不會是一個乾淨的繼承行爲,並揭示您的類的問題。

兩個選擇,以解決:

  • 把變量在主類中該類
  • 使用它在函數中調用子類中,子類的變量將功能

(閱讀了關於父關鍵字和'$ this'變量的評論之後:我對這個問題有不同的理解,並且認爲這兩種方法都不需要幫助,因爲需要相反的方向:父類函數>子類變量,而不是子類函數N>父類變量)

+0

那麼這個想法是,你將能夠爲不同的語言創建自己的類,我需要能夠從類中獲得每個不同的語法規則。 – 2009-09-01 10:13:38

+0

如果您必須從子類中獲取個人信息,則可能需要使SS類抽象並添加一個抽象函數,如每個子類必須實現的'getSyntaxRules()',並返回該語言的規則。 – 2009-09-01 10:16:16

0

使用parent::$this->(取決於,即你有兩個變量具有相同的名稱)

+0

但是哪裏?如果我仍然在擴展課上有功能,在哪裏? – 2009-09-01 10:15:36

+0

等一下。在再次讀取你的代碼之後,它根本沒有意義。你在基類中擁有一個派生的對象? (SS:SuperSyn就是這樣),你爲什麼重新應用所有的成員變量?不過,這應該工作:'$ ssNumbers = $ this-> NUMBERS' – knittl 2009-09-01 10:19:27