Избегайте глобальных внутри функции

0

Я создаю форумную систему на PHP, и я спотыкаюсь над раздражающей проблемой при написании кода для вставки новой темы. Я использую кучу объектов, таких как User, Post и Topic, все они берут объект PDO в свой конструктор (инъекция зависимостей).

Примечание. Я знаю, что подобные вопросы были заданы раньше, но все ответы, которые я нашел, рекомендуют использовать инъекцию зависимостей, и в этом случае я не считаю это очень понятным или удобным в использовании, поскольку будет не менее 3, а иногда и больше, зависимостей для ввода многих различных функций.

В настоящее время, когда я создаю новую тему (поток), она вызывает страницу синтаксического анализа, которая выполняет всю проверку: пользователь должен быть зарегистрирован, заголовок должен иметь длину не менее 3 символов и т.д. Чтобы избежать вложенных if, я обертываю весь этот код внутри функции, поэтому я могу просто использовать return чтобы выйти, когда что-то пойдет не так.

Проблема заключается в том, что моя функция не имеет доступа к объектам User, Post и Topic, созданным на странице init, которая требуется на всех страницах автоматически.

Я знаю об dependency injection, но мне не имеет смысла передавать четыре разных объекта в качестве параметров моей функции.

Здесь приведен пример кода для этой функции newTopic, которая находится внутри страницы синтаксического анализа, упомянутой выше:

if(!empty($_POST['newTopic']))
    newTopic();

function newTopic()
{
    //Check that the user is connected
    if(!$User->isConnected())
        return false;

    //Other checks ...
    $Topic->new($author, $title, $content);
}

Конечно, объекты $User и $Topic недоступны внутри функции. Я могу либо передать его как параметр, либо использовать global. Я знаю, что использование global не рекомендуется, однако я не думаю, что передача четырех разных объектов для каждой функции намного лучше.

Вопрос: Что самое лучшее в этом случае? Передавать мои объекты в качестве параметров функции newTopic? Использовать global? Использовать вложенные, if вместо функции?

  • 0
    Мой голос за инъекцию зависимости. Кроме того, способ кодирования - это смешивание функций и классов, почему бы не иметь класс Topic, у которого есть метод create? (это все еще будет использовать внедрение зависимости, но по крайней мере сделает его ООП и согласованным)
  • 0
    @ user3238482 В настоящее время я использую страницу синтаксического анализа с функцией newTopic для проверки ввода пользователя, отображения сообщения об ошибках и всего, и класс `Topic` отвечает в основном за доступ к БД. Та же проблема возникает, если я выполняю проверку внутри класса `Topic`, так как он также не имеет доступа к классу` User` (например, чтобы проверить, вошел ли пользователь в систему).
Показать ещё 1 комментарий
Теги:
dependency-injection
function
global-variables

2 ответа

0

Вы можете отделить логику создания новой темы, такую как проверки, возможно, операции с БД и т.д., И создание нового объекта класса Topic. Обратите внимание, что создание объекта Topic необходимо, чтобы он был постоянным сразу. Класс темы может быть только структурой данных темы.

0

Может быть хорошим местом для строителя.

$builder = new TopicBulder()->setAuthor($author)->setTitle($title)->setContent($content)->getTopic();

Где TopicBuilder - это класс с каждым возвращаемым методом и ссылкой на $ this.

class TopicBuilder {
private $topic;

function __construct() {
    $this->topic = new Topic();
}

public function setAuthor($author) {
    $this->topic->setAuthor($author);
    return $this;
}

....

public function getTopic() {
    return $this->topic.
}

}

Или что-то более чистое, чем это;)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню