2009-09-01 7 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

Это великолепно! Спасибо, Том! –

1

Исходное ключевое слово php.

PHP parent

+0

Где хоть? Где я помещаю ключевое слово? –

+1

Check: http://stackoverflow.com/questions/393204/using-parent-variables-in-a-extended-class-in-php Там тема подробно обсуждается. – KB22

0

Я думаю, что есть логическая проблема с expectiation. Почему функция класса SS знает о переменной, которая существует только в подклассе VB6?

Это не будет чистое поведение наследования и выявит проблему с вашими классами.

Два варианта, чтобы решить, что:

  • Поместите переменный в основном классе, чтобы использовать его в функции в этом классе
  • Поместите функцию, используя переменный подкласс внутри подкласса

(Прочитав комментарии к родительскому ключевому слову и переменной «$ this»: я понял вопрос по-другому и не думаю, что любой из них поможет, поскольку требуется обратное направление: функция родительского класса> переменная подкласса, а не подкласс functio п> переменная родительского класса)

+0

Ну, идея состоит в том, что вы сможете создавать свои собственные классы для разных языков, мне нужно иметь возможность получать каждый из разных правил синтаксиса из класса. –

+0

Если вам нужно будет получить отдельную информацию из подклассов, может быть хорошей идеей сделать абстрактную абстрактную функцию SS и добавить абстрактную функцию, такую ​​как'getSyntaxRules(), которую должен реализовать каждый подкласс, и который возвращает правила для этого языка , –

0

использования parent:: или $this-> (зависит, то есть у вас есть две переменные с одинаковыми именами)

+0

Но где? Если у меня еще есть функция в расширенном классе, где? –

+0

ждите. после прочтения кода снова это не имеет никакого смысла.вы держите производный объект в базовом классе? (SS: SuperSyn) и почему вы повторно применяете все свои переменные-члены? тем не менее, это должно работать: '$ ssNumbers = $ this-> NUMBERS' – knittl

Смежные вопросы