Изучение ООП на PHP. Это правильный способ сделать это?

#php #oop

#php #ооп

Вопрос:

Я только начал учиться делать ооп, и я просто хотел собрать самый базовый набор кода, чтобы убедиться, что я все правильно понимаю. Я хотел захватить запись формы в переменной $ _POST и передать ее объекту, чтобы он выводил что-то обратно в браузер. Нет SQL, никаких мер безопасности, просто подтверждение понимания.

Вот форма:

 <html>
    <head>
       <title>SignUp Form</title>
    </head>
    <body>
        <?php
        if(!empty($_POST['name'])) {
              include_once "class.php";
        } else {
        ?>
             <form method="post" action="signup.php">
                  <label for="name">Enter name below:</label></br>
                  <input type="text" name="name" id="name"></br>
                  <input type="submit" value="Submit">
             </form>
         <?php
         }
          echo $name->processName($_POST['name']); ?>
     </body>
</html>
  

И вот класс:

 <?php

class Process {

public $entry;

function __construct($entry) {
    $this->entry = $entry;
}

public function processName($entry) {
    return "You entered " . $this->entry . ".";
}

}
$name = new Process($_POST['name']); ?>
  

Сейчас это работает без ошибок, но не похоже, что мне нужно вводить $_POST в echo-операторе на странице формы и в объекте на странице класса. Это правильно? Должен ли я вместо этого собирать это в свойстве $entry. Это работает, но я не думаю, что выполнение правильное. Заранее спасибо!

Комментарии:

1. ИМХО, не стоит размещать элементы данных как общедоступные. Вместо этого используйте геттеры и сеттеры.

2. Строка echo $name->processName($_POST['name']); выполняется каждый раз при загрузке страницы, независимо от того, включен класс или нет. Если class.php если он не включен, вы должны получить сообщение об ошибке, предупреждение или уведомление, в зависимости от вашей конфигурации.

3. Я бы рекомендовал вам проверить laravel.

4. @MichaelCalkins вау, это быстро обострилось! Также этот вопрос помечен как ООП, поэтому направление OP в laravel на самом деле не является допустимым комментарием.

Ответ №1:

Ваше право, вам не нужно вводить переменную $ _POST в эту функцию, вы можете изменить ее на this, и она будет работать без ввода post:

 public function processName() {
    return "You entered " . $this->entry . ".";
}
  

Поскольку прямо сейчас processName функция ничего не делает с общедоступной $entry переменной класса, она просто повторяет то, что вы вводите при вызове функции.

Вместо этого вы, вероятно, захотите сделать:

Изменить public $entry; на protected $entry;

Затем:

 public function getEntry() {
    return $this->entry;
}
  

Затем в вашем html, после построения класса, вы можете просто поместить this, чтобы получить $entry переменную:

 echo $name->getEntry();
  

Комментарии:

1. s/protected/private

2. @PeeHaa — Может быть допустимо, чтобы он был защищен. Зависит от его использования

3. Да, может быть допустимым. Но эмпирическое правило должно быть private , если protected не требуется.

4. Вам нужно обязательно включить скрипт с классом выше html

Ответ №2:

Исходя из фона фреймворка Symfony. Вы могли бы сделать что-то прямо так:

 <?php
class Process
{
    protected $post_var;
    public function __construct($p)
    {
        $this->post_var = $p;
    }

    public function getData()
    {

        //checking if not post request
        if(count($this->post_var) == 0) {
            return false;
        }

        $result_arr = [];

        //populating $result_arr with $_POST variables
        foreach ($this->post_var as $key => $value) {
            $result_arr[$key] = $value;
        }

        return $result_arr;
    }
}

$process = new Process($_POST);
$data = $process->getdata();
if($data)
{
    echo $data["name"];
}
?>

<form action="" method="post">
    <input type="text" name="name"/>
    <input type="submit" name="submit"/>
</form>