Чтобы углубить мое понимание ООП, я решил реорганизовать часть своего кода, используя абстрактный класс. Идея примерно;
Эта проблема;
Дочерний класс расширяет абстрактный класс по назначению, но PHP предупреждает меня, что $helper
аргумент отсутствует в конструкторе абстрактного класса. Я полагаю, что вызывается конструктор, потому что в моем дочернем классе его нет, и это нормально, но так как вы не вызываете абстрактный класс напрямую, как мне заставить это работать? Пример кода ниже;
abstract class Parent_Abstract
{
public $input_helper_methods;
public function __construct( $helpers = NULL )
{
//set the helper methods
$this->input_helper_methods = $helpers;
}
}
Переменная $helpers
в данный момент находится в другом файле, который находится вверху файла вместе с абстрактным классом. Опять же, я думаю, что есть проблема с тем, как это делается. Когда я понимаю структуру, я хотел бы использовать автозагрузчик, но пока просто ручное было бы хорошо. Это содержимое этого файла;
class RD_Form_Input_Helper_Methods
{
private $var = 'something';
}
$helpers = new RD_Form_Input_Helper_Methods;
Надеюсь, в этом есть какой-то смысл. Спасибо, что нашли время, чтобы прочитать / ответить.
Другой пример;
//"helper" classes. I would like these methods to be available to Child_One and Child_Two
class Helper_Functions {}
class Formatting_Functions {}abstract class Parent_Abstract()
{
private $helper_functions;
private $formatting_functions;
public function __construct( $object_one, object_two )
{
$this->helper_functions = $object_one;
$this->helper_functions = $object_two;
}
}
class Child_One extends Parent_Abstract
{
//I can use any of the properties or methods from the Helper_Functions or Formatting_Function class
}
class Child_Two extends Parent_Abstract
{
//I can use any of the properties or methods from the Helper_Functions or Formatting_Function class
}
Дочерний класс расширяет абстрактный класс по назначению, но PHP предупреждает меня, что
$helper
аргумент отсутствует в конструкторе абстрактного класса.
Вы получите такое предупреждение, только если абстрактный конструктор класса потребует $helper
параметр. Но ваш код отличается, $helper
параметр является необязательным:
abstract class Parent_Abstract
{
public $input_helper_methods;
public function __construct( $helpers = NULL )
{ ############### $helpers is optional
Теперь, как я цитирую, у него также есть другое имя $helper
= / = $helpers
,
Так что, скорее всего, пример кода, который вы приводите в своем вопросе, неполон и содержит ошибки.
Давайте просто наметим новый, смоделированный после вашего вопроса:
abstract class AbstractBaseClass
{
private $helper;
function __construct($helper)
{
$this->helper = $helper;
}
}
class Concrete extends AbstractBaseClass
{
}
Коротко о различиях: $helper
поле (или свойство) частный и не общественности; $helper
Требуется параметр ctor.
Использование этого кода и создание конкретного дочернего класса приводит к вашей указанной ошибке:
// Warning: Missing argument 1 for AbstractBaseClass::__construct()
$obj = new Concrete();
Это потому, что помощник отсутствует. Чтобы сделать это очень просто, давайте предположим, что помощник на самом деле является секретным числом, которое вам нужно в сложных вычислениях, выполняемых такими конкретными классами. Число 42
:
$obj = new Concrete(42);
Теперь ошибка исчезла. И helper
поле правильно инициализировано:
print_r($obj);
Concrete Object
(
[helper:AbstractBaseClass:private] => 42
)
Как видите, частный поле абстрактного класса установлено. Помощник (здесь номер 42) был назначен на него.
То, что вы ищете, это статические переменные.
В этом примере я использую переменную с именем $text
а не ваш оригинал $helpers
, Переменная, однажды установленная, будет одинаковой во всех дочерних классах.
Определите абстрактный класс с public static
переменная. Кроме того, опционально определите функция получения, это позволит вам получить доступ к значению статической переменной в качестве свойства каждого дочернего класса.
abstract class Parent_Abstract
{
public static $text;
public function __get($name)
{
// return the static variable's value
return $name == 'text' ? self::$text : null;
}
}
Определите 2 дочерних класса:
class Child1 extends Parent_Abstract
{
}
class Child2 extends Parent_Abstract
{
}
Теперь, чтобы проверить … Установите значение статической переменной, затем создайте экземпляр дочерних классов и проверьте значение $text
на каждом объекте;
Parent_Abstract::$text = 'hello world';
$child1 = new Child1();
$child2 = new Child2();
echo $child1->text . "\n";
echo $child2->text;
Вы увидите, что значение одинаково для обоих детей.