2013-10-01 7 views
0

У меня есть класс, называемый им классом A и B. Я создал класс «A». И в этом я создаю класс «B». Как я могу получить доступ к переменной класса A из класса «B»?Как получить доступ к внешним переменным из класса?

class A 
{ 
    var letter; 
    var writers; 

    function __construct() 
    { 
     $this-letter = 'SOMETHING'; 
     $this->writers = new B;   
    } 

} 

class B extends Writers 
{ 
    function __construct() 
    { 
     parent::__construct(); 
     echo $letter; //This is where i want to acces outside variable (CLASS 'A') 
    } 

} 

Надеюсь, что я был чист. Я просто новичок в OOP-ing. Пожалуйста, помогите мне.

+0

На самом деле, я не думаю, что это возможно. Вы вынуждены использовать эту структуру? – TheWolf

+0

как 'B' получить ссылку на' A'? 'A' имеет' B'. –

ответ

2

Вы не можете, потому что $letter в А не был объявлен общественного и B не распространяется A.

Если вы не хотите подвергать данные А (один из важных принципов объектно-ориентированного программирования) , вы должны использовать инкапсуляцию. Создать геттер в А классе

public function getLetter() 
{ 
    return $this->letter; 
} 

А потом в методе конструкта Б, создать экземпляр A и использование сказал геттер

$a = new A(); 
$letter = $a->getLetter(); 
+0

На самом деле: «Если вы объявляете свойство с помощью var вместо одного из публичного, защищенного или частного, то PHP 5 будет рассматривать свойство так, как если бы оно было объявлено как общедоступное». (Http://de1.php.net/manual/en/language.oop5.properties.php). Однако это не меняет сути вашего ответа. – TheWolf

+0

@ TheWolf Ницца поймать. Я, несмотря на то, что 'var' отпал на' protected'. – federicot

+0

Это будет хорошо, если я ничего не сделаю в конструкции, но я делаю много вещей. Поэтому я не могу просто получить переменные. –

0

Ваш класс B должен каким-то образом иметь ссылку на объект , Вы можете просто добавить к B:

class B extends Writers 
{ 
    private $a; 

    function __construct() 
    { 
     parent::__construct(); 
     echo $letter; //This is where i want to acces outside variable (CLASS 'A') 
    } 

    public function A($a) 
    { 
     $this->a = $a; 
    } 
} 

Далее просто попросите объект A дать ссылку на себя на свой объект B.

class A 
{ 
    var letter; 
    var writers; 

    function __construct() 
    { 
     $this-letter = 'SOMETHING'; 
     $this->writers = new B;  
     $this->writers->A($this); 
    } 

} 

Альтернативой будет статический метод.

1

В случае, если вам действительно нужно использовать эту структуру, я предполагаю, что вы могли бы сделать что-то вроде этого:

class A 
{ 
    var letter; 
    var writers; 

    function __construct() 
    { 
     $this-letter = 'SOMETHING'; 
     $this->writers = new B($this);   
    } 

} 

class B extends Writers 
{ 
    var $a; 

    function __construct(A $a) 
    { 
     parent::__construct(); 
     $this->a = $a; 
     echo $this->a->letter; 
    } 

} 

Таким образом, B будет содержать ссылку на объект A он был создан. Однако я скорее рекомендую вам поменять топологию класса, если это возможно.

0

Трудно точно сказать, что вы хотите, но, как я интерпретировал:

class A extends Writers 
{ 
    var letter; 
    var writers; 

    function __construct() 
    { 
     $this-letter = 'SOMETHING'; 
     $this->writers = new B;   
    } 

} 

class B extends A 
{ 
    function __construct() 
    { 
     parent::__construct(); 
     echo $this->letter; //This is where i want to acces outside variable (CLASS 'A') 
    } 

} 
-1

Вы можете использовать статическую переменную. например:

class A 
{ 
    static $letter; 
    function __construct() 
    { 
     self::$letter = 'SOMETHING'; 
    } 

} 
$objA = new A(); 

class B 
{ 
    function __construct() 
    { 
     $letter = A::$letter; 
     echo $letter; //print SOMETHING 
    } 

} 
+0

Использование 'static' для раздувания инкапсуляции и видимости действительно не так. –

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