#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>