2009-09-01 35 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; 
    } 
} 

私はそれが機能を期待しています、PHPの愚痴とも呼ばれて__constructパブリック関数を削除した場合。

私の質問は、どのように私のメインクラスに拡張クラスから変数を取得できますか?

答えて

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

それは素晴らしいです!トムありがとう! –

1

phpの親キーワードを使用します。

PHP parent

+0

(すなわち、同じ名前を持つ2つの変数を持って、依存しますか)?私はキーワードをどこに置いていますか? –

+1

チェック: http://stackoverflow.com/questions/393204/using-parent-variables-in-a-extended-class-in-php トピックが詳細に説明されています。 – KB22

0

私はあなたのexpectiationとの論理的な問題があることと思います。なぜ、クラスSSの関数は、VB6サブクラスにしか存在しない変数について知っているべきですか?

これはクリーンな継承の動作ではなく、クラスに問題があることを示しています。

二つの選択肢はそれを解決するために:

  • は、そのクラス
  • で機能でそれを使用するメインクラスに変数を入れて、サブクラス内のサブクラスの変数を使用して機能を入れ

(親キーワードと '$ this'変数に関するコメントを読んだ後:私はその質問を別に理解し、反対方向が必要なので、どちらかを助けるとは思わない:親クラス関数>サブクラス変数、サブクラスfunctio n>は、親クラス変数)

+0

これは、さまざまな言語の独自のクラスを作成できるということです。クラスからさまざまな構文ルールを取得する必要があります。 –

+0

サブクラスから個々の情報を取得する必要がある場合は、SSクラスを抽象化し、各サブクラスが実装しなければならない「getSyntaxRules()」のような抽象関数を追加し、その言語のルールを返すことをお勧めします。 –

0

使用parent::または$this->はいえ

+0

しかしどこ?私がまだ拡張クラスの関数を持っているのなら、どこで? –

+0

待ちます。あなたのコードをもう一度読んだら、それはまったく意味がありません。派生したオブジェクトを基本クラスに保持していますか? (SS:SuperSynはそうです)、なぜメンバー変数をすべて再適用しますか?それにもかかわらず、これはうまくいくはずです: '$ ssNumbers = $ this-> NUMBERS' – knittl