【发布时间】:2021-07-30 12:43:29
【问题描述】:
我有一个场景,我想使用面向对象的 PHP8 创建一个用户,我有我的 users.php 页面,我有表单,这个问题似乎是我不认为我的对象表单中的方法($ objForm) 被正确传递给我的对象验证 ($objValidation):
users.php
<?php
use A\B\App\Session;
use A\B\App\Login;
use A\B\App\User;
use A\B\App\Form;
use A\B\App\Validation;
require_once("../../vendor/autoload.php");
$session = new Session();
if(!$session->isLogged()) {
Login::redirectTo("login");
}
$objForm = new Form();
// passing in the object to validation
$objValidation = new Validation($objForm);
$objUser = new User();
if($objForm->isPost("name")) {
$objValidation->expected = ["name"];
$objValidation->required = ["name"];
$objValidation->special = ["email" => "email"];
$objValidation->postFormat = ["password" => "password"];
$email = $objForm->getPost("email");
$existingUser = $objUser->getUserByEmail($email);
if($existingUser) {
$objValidation->addToErrors("user_exists");
}
if($objValidation->isValid()) {
echo "good";
} else {
echo "bad";
}
}
?>
<form action="" method="post">
<p>
<input type="text" name="name" placeholder="User name" required="">
</p>
<?php echo $objValidation->validate('user_exists'); ?>
<p>
<input type="email" name="email" placeholder="User email" required="">
</p>
<p>
<input type="password" name="password" placeholder="Password" required="">
</p>
<p>
<input type="submit" name="" value="Add user">
</p>
</form>
我只是试图回应是或否,看看它是否通过了这一点,所以我实际上并没有调用方法来创建用户,因为代码之前失败了。
以下是我的 2 节课:
Form.php
<?php
declare(strict_types = 1);
namespace A\B\App;
class Form
{
public function isPost(string $field): bool
{
if(!empty($field)) {
if(isset($_POST[$field])) {
return true;
}
return false;
} else {
if(!empty($_POST)) {
return true;
}
return false;
}
}
public function getPost(string $field)
{
if(!empty($field)) {
return $this->isPost($field) ? strip_tags($_POST[$field]) : null;
}
}
public function getPostArray(array $field): array
{
$out = [];
if($this->isPost()) {
foreach($_POST as $key => $value) {
if(!empty($field)) {
if(in_array($key, $expected)) {
$out[$key] = strip_tags($value);
}
} else {
$out[$key] = strip_tags($value);
}
}
}
return $out;
}
}
这里是验证类:
验证.php
<?php
declare(strict_types = 1);
namespace A\B\App;
class Validation
{
private array $error = [];
public array $message = ["user_exists" => "This user exists in the Db"];
public array $expected = [];
public array $required = [];
public array $post = [];
private $objForm;
public array $test = [];
public array $postRemove = [];
public array $postFormat = [];
public array $special = [];
public function __construct(Form $form)
{
$this->objForm = $form;
}
public function process()
{
if($this->objForm->isPost() && !empty($this->required)) {
$this->post = $this->objForm->getPostArray($this->expected);
if(!empty($this->post)) {
foreach($this->post as $key => $value) {
$this->check($key, $value);
}
}
}
}
public function check($key, $value)
{
if(!empty($this->special) && array_key_exists($key, $this->special)) {
$this->checkSpecial($key, $value);
} else {
if(in_array($key, $this->required) && empty($value)) {
$this->addToErrors($key);
}
}
}
public function checkSpecial($key, $value)
{
switch($this->special[$key]) {
case 'email':
if(!$this->isEmail($value)) {
$this->addToErrors($key);
}
break;
}
}
public function isEmail($email)
{
if(!empty($email)) {
$result = filter_var($email, FILTER_VALIDATE_EMAIL);
return !$result ? false : true;
}
return false;
}
public function isValid()
{
$this->process();
if(empty($this->errors) && !empty($this->post)) {
// remove unwanted fields
if(!empty($this->postRemove)) {
foreach($this->postRemove as $value) {
unset($this->post[$value]);
}
}
// format required fields
if(!empty($this->postFormat)) {
foreach($this->postFormat as $key => $value) {
$this->format($key, $value);
}
}
return true;
}
return false;
}
public function format($key, $value)
{
switch($value) {
case 'password':
$this->post[$key] = Login::passwordEncrypt($this->post[$key]);
break;
}
}
public function addToErrors($key)
{
$this->errors[] = $key;
}
public function validate($key)
{
if(!empty($this->errors) && in_array($key, $this->errors)) {
return $this->wrapWarn($this->message[$key]);
}
}
public function wrapWarn($mess)
{
if(!empty($mess)) {
return "<span class=\"warn\" >{$mess}</span>";
}
}
}
我已经测试了 validations.php 和 form.php 中的其他虚拟函数,它们都可以工作,所以问题肯定是在与这两个类的通信之间。处理方法未识别或未从 $this->objForm->isPost() 调用中获取值。这是我收到的错误消息,它告诉我没有传入任何值:
致命错误:未捕获的 ArgumentCountError:参数太少 函数 A\B\App\Form::isPost(), 0 传入 /Applications/MAMP/htdocs/project/src/App/Validation.php 第 41 行 并且恰好 1 预计在 /Applications/MAMP/htdocs/project/src/App/Form.php:10 堆栈跟踪: #0 /Applications/MAMP/htdocs/project/src/App/Validation.php(41): A\B\App\Form->isPost() #1 /Applications/MAMP/htdocs/project/src/App/Validation.php(94): A\B\App\Validation->process() #2 /Applications/MAMP/htdocs/project/src/Pages/users.php(36): A\B\App\Validation->isValid() #3 {main} 抛出 /Applications/MAMP/htdocs/project/src/App/Form.php 第 10 行
注意:由于卡住了,我还没有对所有内容应用类型声明/提示。
【问题讨论】:
-
问题出在这一行
if($this->objForm->isPost() && !empty($this->required))-isPost接受一个参数,$field不能为空,所以 PHP 会抛出一个致命错误 -
您好,是的,这是肯定的问题,我只是不知道如何解决它。
-
您可以将方法的签名更改为
public function isPost(string $field = ""): bool或在if($this->objForm->isPost("") && !empty($this->required))中传递一个空字符串 -
@aaandri98 如果您有答案,请将其设为答案,而不是评论!
-
@aaandri98 我看到代码
$this->isPost()可能需要进行相同的更改