PHP передает экземпляр объекта в конструктор абстрактного класса

Чтобы углубить мое понимание ООП, я решил реорганизовать часть своего кода, используя абстрактный класс. Идея примерно;

  • Один «родительский» абстрактный класс, который служит основой для расширения всех дочерних классов.
  • Один «вспомогательный» класс, имеющий ряд методов, которые понадобятся детям абстрактного класса.
  • класс «помощник» будет использоваться другими классами, поэтому я не хочу, чтобы это было неотъемлемой частью абстрактного класса.

Эта проблема;

Дочерний класс расширяет абстрактный класс по назначению, но 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
}

1

Решение

Дочерний класс расширяет абстрактный класс по назначению, но 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) был назначен на него.

2

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

То, что вы ищете, это статические переменные.

В этом примере я использую переменную с именем $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;

Вы увидите, что значение одинаково для обоих детей.

-1

По вопросам рекламы [email protected]