【问题标题】:Argument value is not being passed in PHP classes参数值未在 PHP 类中传递
【发布时间】: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-&gt;objForm-&gt;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-&gt;objForm-&gt;isPost() &amp;&amp; !empty($this-&gt;required)) - isPost 接受一个参数,$field 不能为空,所以 PHP 会抛出一个致命错误
  • 您好,是的,这是肯定的问题,我只是不知道如何解决它。
  • 您可以将方法的签名更改为public function isPost(string $field = ""): bool 或在if($this-&gt;objForm-&gt;isPost("") &amp;&amp; !empty($this-&gt;required)) 中传递一个空字符串
  • @aaandri98 如果您有答案,请将其设为答案,而不是评论!
  • @aaandri98 我看到代码$this-&gt;isPost() 可能需要进行相同的更改

标签: php php-8


【解决方案1】:

为了不改变太多代码库(改变方法的所有引用),你应该这样改变isPost()函数的签名:

public function isPost(string $field = ""): bool 

【讨论】:

  • 谢谢,这确实起到了作用,我很想知道你对更改代码库的意思的看法,因为项目刚刚开始,我很想应用一种更有效的方法
  • 如果希望该方法在任何地方都有效,您应该在对 isPost() 方法的每个引用中添加一个空字符串 - 这也是一个答案,但会迫使您检查整个前面引用的函数的每个引用的代码库
猜你喜欢
  • 2013-01-10
  • 2013-12-30
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 2012-03-15
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
相关资源
最近更新 更多