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