Внедрение в конструктор и использование метода

У меня есть пара функций, которые я переписываю в классы ООП. Я все еще очень плохо знаком с ООП и использую это для изучения основных понятий ООП.

Это мой первый класс, написанный с учетом следующих

  • Модульное тестирование / тестирование изоляции

  • Класс должен делать только одно

  • Повторное удобство

Этот класс принимает 4 переменные, заданные пользователем, и проверяет их на соответствие параметрам, заданным в URL, а затем возвращает 4 условия, по одному для каждого набора переменных.

Вот класс (Я удалил некоторые методы и свойства, которые делают то же самое, что и isAuthorReferrer() метод)

namespace PG\Single\Post\Navigation;

/**
* Test set values against the super global given. Returns conditional properties
* which is boolean values. true is returned on success and false on failure
*
* @param $superGlobalVar Super global to test the values against
* @param (string) $authorReferrer
* @param (string) $dateReferrer
* @param (string) $searchReferrer
* @param (string) $taxReferrer
*
*/
class RequestReferrerHandler implements RequestReferrerHandlerInterface
{
/**
* @var (array) $superGlobalVar
*/
protected $superGlobalVar;

/**
* @var (bool) $isAuthorReferrer
*/
protected $isAuthorReferrer;

//OTHER PROPERTIES

/**
* Public constructor method
*
* @param $SuperGlobalVar  Super global to get data from
*/
public function __construct($superGlobalVar = null, $authorReferrer= null, $dateReferrer = null, $searchReferrer = null, $taxReferrer = null )
{
/**
* Properties
*/
$this->superGlobalVar = $superGlobalVar;
$this->authorReferrer = $authorReferrer;
$this->dateReferrer   = $dateReferrer;
$this->searchReferrer = $searchReferrer;
$this->taxReferrer    = $taxReferrer;

/**
* Conditional methods, all returns boolean values
*/
$this->isAuthorReferrer();
//etc
}

/**
* Test $authorReferrer against $superGlobalVar
*
* @return (bool) true on success or false on failure
*/
public function isAuthorReferrer()
{
if ($this->authorReferrer && isset($this->superGlobalVar[$this->authorReferrer])) {
$isAuthorReferrer = true;
} else {
$isAuthorReferrer = false;
}
return $this->isAuthorReferrer = $isAuthorReferrer;
}

//OTHER METHODS, SAME AS isAuthorReferrer() METHOD

/**
* Returns an array of super global variables
* @return (array) $this->getRequest
*/
public function getSuperGlobalVar()
{
return $this->superGlobalVar;
}

}

Я прочитал несколько постов, в которых говорилось, что вы должны использовать инжектор конструктора, поэтому я написал об этом мой класс.

У меня есть несколько проблем, одна из которых заключается в создании моих методов в конструкторе

МОЙ ТЕСТ

$a = new PG\Single\Post\Navigation\RequestReferrerHandler($_GET, 'aq', 'dq', 'sq', 'tq');
?><pre><?php var_dump($a); ?></pre><?php

С кодом выше, я получаю следующий вывод

object(PG\Single\Post\Navigation\RequestReferrerHandler)#496 (9) {
["superGlobalVar":protected]=>
array(1) {
["tq"]=>
string(10) "category 1"}
["isAuthorReferrer":protected]=>
bool(false)
["isDateReferrer":protected]=>
bool(false)
["isSearchReferrer":protected]=>
bool(false)
["isTaxReferrer":protected]=>
bool(true)
["authorReferrer"]=>
string(2) "aq"["dateReferrer"]=>
string(2) "dq"["searchReferrer"]=>
string(2) "sq"["taxReferrer"]=>
string(2) "tq"}

Если я удаляю мои методы из конструктора, мои четыре условных свойства возвращаются NULL, но я получаю правильные логические значения, если я вызываю методы, такие как

?><pre><?php var_dump($a->isAuthorReferrer()); ?></pre><?php

Результаты из var_dump() является:

если aq установлено

bool(true)

если aq не установлен

bool(false)

МОЙ ВОПРОС

Правильно ли я использую методы в конструкторе и правильно ли настроен мой класс?

-1

Решение

Функция конструктора заключается в создании объекта, после которого можно применять методы. Кроме того, цель конструктора — еще одна убедительная причина, по которой конструктор должен иметь возможность завершить работу без каких-либо проблем, иначе конструкция объекта может потерпеть неудачу, что приведет к утечке памяти. Поэтому это не очень хороший ООП дизайн для вызова методов внутри конструктора.
Кроме того, вы усложняете расширение или даже изменение дизайна класса, в котором методы вызываются внутри конструктора. Построение объекта будет зависеть от наличия методов, которым оно должно предшествовать.
Я предпочитаю init-метод для вызова методов, которые вы хотели бы выполнить перед остальным кодом. Когда я хочу загрузить файл конфигурации, я устанавливаю его в конструкторе и читаю в init-методе.

1

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector