2015-06-12 1 views
3

Я немного запутался в том, возможно ли это. Я проверил пару сообщений здесь, и они действительно не объясняют, что я ищу.Наследование класса Sibling PHP

У меня есть 3 класса. Один основной класс и два класса расширяют этот основной класс. (см. код ниже). Можно ли запустить метод в одном из двух расширенных классов из его родного (другого расширенного класса)?

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

ДЕКЛАРАЦИЯ

class A { 

    public function __construct() { 
    //do stuff 
    } 

} 

class B extends A { 

    private $classb = array(); 

    public function __construct() { 
    parent::__construct(); 
    //do stuff 
    } 

    public function get($i) { 
       return $this->classb[$i]; 
    } 

    public function set($i, $v) { 
    $this->classb[$i] = $v; 
    } 

} 

class C extends A { 

    public function __construct() { 
    parent::__construct(); 
    //do stuff 
    } 

    public function display_stuff($i) { 
    echo $this->get($i); //doesn't work 
    echo parent::get($i); //doesn't work 
    } 
} 

ПРИМЕНЕНИЕ

$b = new B(); 
$c = new C(); 

$b->set('stuff', 'somestufftodisplay'); 
$c->display_stuff('stuff'); // <----- Displays nothing. 

ответ

2

Ваш код показывает дополнительную проблему отдельно от основного вопроса, так есть на самом деле два ответа:

  1. Нет, вы не можете запустить метод из класс сестры в другом классе братьев. Если вам это нужно, метод должен быть в родительском классе. То же самое относится к свойствам.
  2. Вы не можете использовать значение свойства из одного объекта в другом объекте, даже если оба они одного класса. Установка значения свойства в одном объекте устанавливает его значение только там, поскольку разные объекты могут иметь одинаковые свойства с совершенно разными значениями. Если вам нужно разделить значение свойства между объектами и также иметь возможность его модифицировать, вы должны использовать static property. В этом случае вы должны определить, что в родительском классе, см. Мою предыдущую точку.

Итак, чтобы сделать его работу, вам нужно будет что-то вроде

class A { 

    private static $var = array(); 

    public function get($i) { 
    return self::$var[$i]; 
    } 

    public function set($i, $v) { 
    self::$var[$i] = $v; 
    } 
} 

class B extends A { 

} 

class C extends A { 

    public function display_stuff($i) { 
    echo $this->get($i); // works! 
    } 
} 

$b = new B(); 
$c = new C(); 

$b->set('stuff', 'somestufftodisplay'); 
$c->display_stuff('stuff'); 

An example.

+0

извините, что делает yo umean по моему коду не соответствует. Я не понимаю. –

+0

display_stuff() в классе C пытается запустить метод get get. Как это не соответствует моему вопросу? –

+0

@BestProgrammer Да, это моя первая точка. Но вы также пытаетесь получить доступ к свойству, которое вы установили для объекта '$ b', из объекта' $ c'. Обратите внимание, что даже если все было в классе 'A', оно все равно не будет работать, поскольку значение свойства в объекте' $ b' недоступно для объекта '$ c', даже если у них есть тот же самый класс , – jeroen