Мне было интересно, возможна ли такая комбинация.
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 использовать обновленные переменные? Или мне нужно просто разделить код на два файла и использовать его отдельно? Таким образом, это работает по крайней мере … Но мне не нравится, когда мой код находится за пределами классов, и я стараюсь минимизировать использование глобальной области видимости …
Вам не нужно включать класс 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"
Вы можете использовать статику. Это ужасная практика, но:
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);
}
}
ИМО, документация 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