2014-09-23 5 views
0

Мне было интересно, возможна ли такая комбинация.Вызвать класс B из класса A и наследовать свойства класса A?

classA.php

class A 
{ 
    public $one = "one"; 

    function start() { 

     $this->one = "seven"; 

     include "classB.php"; 
     $two = new B; 
     print_r(get_defined_vars()); 
    } 
} 

classB.php

class B extends A 
{ 
    public $two = "two"; 

    function __construct() { 
     echo($this->one); 
    } 
} 

и, наконец, index.php

include "classA.php"; 
$A = new A; 
$A->start(); 

Когда я бегу index.php, я получаю следующее:

Array 
(
    [one] => seven 
    [B] => B Object 
     (
      [two] => two 
      [one] => one 
     ) 
    ) 

Есть ли способ заставить класс B использовать обновленные переменные? Или мне нужно просто разделить код на два файла и использовать его отдельно? Таким образом, это работает как минимум ... Но мне не нравится, когда мой код находится за пределами классов, и я стараюсь минимизировать использование глобальной области ...

+0

BTW: Я знаю __construct(), я написал код без __construct так, что __construct() вообще не будет вызван. –

+1

Вы действительно должны прочитать немного больше о наследовании, на самом деле работает .... если класс B расширяет класс A, тогда вы должны создавать экземпляр класса B .... но не встраивать код для класса B в середине класса A через include .... это не наследование вообще –

+0

Что вы хотите достичь? – sectus

ответ

1

Вам не нужно включать класс b в класс a.

Просто используйте класс B удлинение A, вот и все.

На вашем выходе вы создали новый объект B, который расширяет класс A, но этот объект B представляет собой новый экземпляр без отношения к родительскому классу.

Попробуйте это:

class A { 
    public $propA = 'Property of A class'; 
} 

class B extends A { 
    public $propB = 'Property of B class'; 
} 

$obj = new B(); 

echo $obj->propA; // returns "Property of A class" 
echo $obj->propB; // returns "Property of B class" 
0

Вы можете использовать статику. Его ужасная практика, но:

class A 
{ 
    public static $one = "one"; 

    function start() 
    { 

     $one = "seven"; 

     $two = new B; 
     print_r(get_defined_vars()); 
    } 
} 

class B extends A 
{ 
    public $two = "two"; 

    function __construct() { 
     echo($this::$one); 
    } 
} 
0

Документация IMO, php.net немного скудна. Вот почему у нас есть Stackoverflow, за что я благодарен. Thanx для наконечника, я понял это сейчас. Изучайте что-то новое каждый день.

К пункту. Код в index.php должен был выглядеть так:

include "classA.php"; 
include "classB.php"; 

$B = new B; 
print_r(get_defined_vars()); 

$B->start(); 
print_r(get_defined_vars()); 

Теперь он выдает именно то, что мне нужно:

[B] => B Object ([two] => two [one] => one) // before the change 
[B] => B Object ([two] => two [one] => seven) // after the change 
Смежные вопросы