oop — Использование абстрактных классов в php для получения и публикации HTTPData и демонстрации его работы

В настоящее время я изучаю основы программирования на PHP, и у меня возникают проблемы с тем, чтобы обернуть голову вокруг абстрактных классов. У меня есть программа с 3 классами, не включая index.php, чтобы продемонстрировать, что она работает, которая продемонстрирует, что абстрактный класс наследуется двумя другими. Первый класс с именем HTTPData является абстрактным классом только с одним абстрактным методом, который называется getKey ($ key). Два других класса, называемые HTTPGetData и HTTPPostData, расширяют класс HTTPData и оба имеют один и тот же метод getKey ($ key), но не абстрактный. Я не могу жестко закодировать содержимое $ key, поэтому я не могу жестко закодировать $ _GET [«name»], чтобы заставить его работать должным образом, и я также не могу отразить эхо внутри любого из классов. Несмотря на это, я знаю, что $ _GET и $ _POST являются суперглобальными переменными, используемыми для захвата пользовательских данных HTTP, и доступ к ним можно получить, передав ключ, такой как $ _GET [«username»]. Я считаю, что это то, что должно быть возвращено. Я предполагаю, что мой вопрос .. Как мне это сделать, а не выводить какие-либо заявления вообще, и как бы вы это реализовали? Вот диаграмма UML, которую я сделал.

Это код, который я до сих пор:
HTTPData.php:

<?php

abstract class HTTPData {

abstract public function getKey($key);
}
?>

HTTPGetData.php:

<?php

class HTTPGetData extends HTTPData {

public function __construct() {

}

public function getKey() {
return $this->key;
}
}
?>

HTTPPostData:

<?php

class HTTPPostData extends HTTPData{

public function __construct() {

}

public function getKey() {
return $this->key;
}}
?>

index.php:

<?phpif( isset($_GET['key'])) {
/*How would I not echo this?*/
}?>

Я знаю, что это немного, но я серьезно испытываю трудности с пониманием этого в PHP … И любая помощь будет принята с благодарностью. Мои книги просто не учат $ _GET и $ _POST с абстракцией, где я мог бы справиться с такой проблемой. Спасибо за ваше время, и я прошу прощения, если это простой вопрос, который был бы глупым, чтобы не знать ответ на …

0

Решение

Вы можете извлечь $_GET или же $_POST как зависимость, чтобы иметь возможность тестировать ваши классы вне контекста сервера:

abstract class HTTPData
{
private $data;

public function __construct(array $data)
{
$this->data = $data;
}

public function getKey($key)
{
return $this->data[$key] ?? null;
}
}

Тогда ваши конкретные классы просто наследуют этот абстрактный класс:

final class HTTPGetData extends HTTPData
{

}

final class HTTPPostData extends HTTPData
{

}

Наконец, вы можете проверить свои классы, предоставляя $_GET а также $_POST сам:

$_GET = ['foo' => 'bar'];
$_POST = ['baz' => 'quux'];

$httpGetData = new HTTPGetData($_GET);
$httpPostData = new HTTPPostData($_POST);

assert($httpGetData->getKey('foo') === 'bar');
assert($httpGetData->getKey('baz') === null);

assert($httpPostData->getKey('baz') === 'quux');
assert($httpPostData->getKey('foo') === null);

Вот демо.

Вменяемый вопрос будет: но зачем мне два класса, которые имеют одинаковую функциональность и отличаются только по названию? Чтобы ответить на этот вопрос, мы должны взглянуть на концепцию внедрение зависимости (ДИ). С помощью такого инструмента, как DI, вы можете разрешать зависимости автоматически (ну почти). Итак, когда вашему другому классу понадобится объект HTTPGetData или же HTTPGetData (может быть Тип подсказал или настроенный), контейнер DI создаст экземпляр правильного класса с правильным массивом params и пропустит его.

0

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

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

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