Вызывать класс 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

Решение

Вам не нужно включать класс 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"
1

Другие решения

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

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

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

К точке. Код в 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
0
По вопросам рекламы [email protected]