Я не очень хорошо разбираюсь в синтаксисе php, поэтому вот мой вопрос:
У меня есть класс Foo.
Класс Бар расширяет Фу.
Я хочу сделать конструктор для Bar, который вызывается с экземпляром класса Foo в качестве параметра, и сделать экземпляр Bar, который выглядит точно так же, как экземпляр класса Foo.
Кажется, я должен сделать это, потому что Foo является классом в плагине WordPress. Я пишу плагин, который идет поверх оригинального плагина, и в фильтре, к которому я могу добавить, я получаю объект Foo.
Я открыт для того, чтобы делать это «правильным» способом, если я могу просто изучить «правильный» способ сделать это.
так:
class Foo { // in the original plugin
public function __construct() {
<do some stuff>
}
}
class Bar extends Foo { // in my plugin to extend the original plugin
public function __construct($myFooObject) {
<I want: $this = $myFooObject; but it doesnt work>
<do some stuff special to Bar>
}
}
<?php
class Bar extends Foo { // in my plugin to extend the original plugin
public function __construct($myFooObject) {
foreach (get_object_vars($myFooObject) as $key=>$value){
$this->$key = $value;
}
// <I want: $this = $myFooObject; but it doesnt work>
// <do some stuff special to Bar>
}
}
Это будет не только экземпляр с Foo
свойства, но копировать $myFooObject
Свойства на создание.
Что ж. Вы уже наследуете функции и члены класса Foo. То, что вы только что упустили, это вызвать конструктор родительского класса (конструктор Foo).
Добавьте следующую строку в ваш бар __construct()
:
parent::__constrcut();
Бар теперь выглядит так:
class Bar extends Foo { // in my plugin to extend the original plugin
public function __construct($myFooObject) {
parent::__construct(); // we've added this line to call the parent constructor
<do some stuff special to Bar>
}
}
Вызов родительского конструктора в конструкторе дочернего класса сохраняет целостность ваших объектов, а также позволяет дочернему классу иметь динамический доступ к своему родителю.