Имея дело с наследованием в PHP, я обнаружил некоторую нехватку знаний, в основном около конструкторы и частные объектов недвижимости.Конструктор может получить доступ к родительским частным свойствам в PHP?
Давайте возьмем этот код, например:
<?php
class Module
{
public $type;
public function __construct($type)
{
$this->type = $type;
}
}
class BModule extends Module
{
}
class CModule extends BModule
{
}
class A
{
private $module;
public function __construct(Module $module)
{
echo 'Set module for '.__CLASS__.' to '.$module->type . PHP_EOL;
echo "<br>";
$this->module = $module;
}
public function getModule()
{
echo "I (as " . __CLASS__ . ") have a module of type " . $this->module->type;
return $this->module->type;
}
}
class B extends A
{
}
$m = new Module('base-module');
$bm = new BModule('bi-module');
echo "<br>--------A---------<br>";
$a = new A($m);
echo "<br>A is of type " . $a->getModule();
echo "<br>--------B---------<br>";
$b = new B($bm);
echo "<br>B is of type " . $b->getModule();
Некоторые вопросы:
- не должен B строительства вызвать конструктор в контексте B? (и поэтому я бы ожидал, что он не сработает, потому что он не унаследовал частную собственность $ module)
- или PHP просто вызовет конструктор A, используя/ссылочные методы и свойства из A? (В том числе частных них)
- я могу перейти к $ б либо модуль или BModule объекта; это потому, что BModule является ребенком Модуль. Проверяет ли PHP некоторую цепочку наследования (проверяя родителей) прошедшего объекта при проверке типа намека?
- так я могу передать конструктору либо объект типа модуля или BModule или CModule?
И это еще один пример:
<?php
class a
{
private $a;
protected $a_copy;
public function __construct($a_value)
{
$this->a = $a_value;
$this->a_copy = $this->a;
}
public function getA()
{
return $this->a;
}
public function getCopyA()
{
return $this->a;
}
}
class b extends a
{
}
$a = new a('value for a');
$b = new b('value for b');
echo "<br>-----A-----<br>";
echo $a->getA()."<br>";
echo $a->getCopyA()."<br>";
echo "<br>-----B-----<br>";
echo $b->getA()." (I would expect to have no access to \$a)<br>";
echo $b->getCopyA()."<br>";
Будучи собственностью $ в частные, я бы ожидать, чтобы не быть в состоянии получить доступ к этому или сделать что-нибудь с ним из класс b. Это немного не имеет смысла для моего реального понимания.
Я немного смущен. Поэтому, если у меня есть что-то простое, например 'class a {getClass() {return get_class ($ this);}}' и 'class b расширяет {}', а затем вызывает 'getClass()' в экземпляре ** b * * не вернется ** a **? (поскольку, как мы сказали, метод наследуется и выполняется в контексте родителя ** a **). Извините за плохое форматирование кода и извините за возможные глупые вопросы. – Kamafeather
Правильно, это вернет B, а не A. Это потому, что _function_ вызывается в контексте A, но фактический _объект_, который $ this относится к прежнему типу B – Nathan