变量到另一个php文件

时间:2015-07-30 16:49:09

标签: php

我有一个带有public function register($data)的php文件(register.php),其中验证了错误。然后计算错误,如果没有找到错误,则通过验证。

register.php:

class ARegister {

    public function register($data) {
      $user = $data['userData'];

      //validate provided data
      $errors = $this->validateUser($data);

        if(count($errors) == 0) {
        //first validation
        }
    }

    public function validateUser($data, $botProtection = true) {

    $id     = $data['fieldId'];
    $user   = $data['userData'];
    $errors = array();
    $validator = new AValidator();

       if( $validator->isEmpty($user['password']) )

            $errors[] = array( 
            "id"    => $id['password'],
            "msg"   => Lang::get('password_required')
             );


      return $errors;
   }

问题是,我需要将已验证数据的确认信息发送到我的其他php文件(othervalidation.php),我已经进行了另一次验证:

othervalidation.php:

<?php
require 'register.php';

if ( !empty($action) ) {

     switch ( $action ) {

        case 'process_payment':

        try {  

            $instance = new ARegister();

            if($instance->validateUser($data, $errors)) {
            throw new Exception('Validation error');    
            }

        }   catch (Exception $e) {
            $status = false;
            $message = $e->getMessage();
        }
     }

如何将$ errors变量的结果发送到我的其他验证(othervalidation.php)?

2 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情:

class ARegister {

private $error = 0;

public function register($data) {

    if (!$this->validateUser($data)){

        $this->error++;
    }
}

public function getErrorCount(){
    return $this->error;
}

public resetErrorCount(){
    $this->error = 0;
}

或者通过引用传递错误:

public function register(&$error, $data) {

    if (!$this->validateUser($data)){

        $error++;
    }
}

就个人而言,我会在同一个方法中进行所有验证(在封装类中),使用错误消息参数(通过引用传递)来返回验证失败的原因并使用return语句返回true或false。

class MyClass{

        public function validation(&$errorMessage, $firstParameter, $secondParameter){

            $success = false;

            if (!$this->firstValidation($firstParameter)){

                $errorMessage = "this is not working pal.";
            }
            elseif (!this->secondeValidation($firstParameter)){

                $errorMessage = "Still not working buddy...";
            }
            else{

                $success = true;
            }

            return $success;
        }

        private function firstValidation($firstParameter){

            $success = false;

            return $success;
        }

        private function secondeValidation($secondParameter){

            $success = false;

            return $success;
        }
    }

在您的其他档案中:

<?php
        $instance = new MyClass();

        $errorMessage = "";

        if ($instance->validation($errorMessage, $firstParameter, $secondParameter)){

            echo "Woot, it's working!!!";
        }
        else{

            echo $errorMessage;
        }
    ?>

这些代码解决方案之一是否符合您的需求?

来自蒙特利尔的Jonathan Parent-Lévesque

答案 1 :(得分:0)

我查看了你的新代码设计,这是我发现的新问题。

首先,在您的注册函数中,您将validate变量用作整数,而validate函数返回一个数组。你有两种可能性。

您可以更改注册方法,以检查错误数组是否为空:

if(empty($errors)) {
        //first validation
}

Count也有效,但我仍然喜欢空,因为它在语法上更清晰。此外,如果参数不是数组或可数对象,则count函数返回1,如果参数为NULL,则返回0。正如我所说,它是当前案例中的一种功能性解决方案,但在其他一些情况下,它可能会导致意外结果。

在你的方法声明中,我看到你期待一个布尔值(botProtection)。

public function validateUser($data, $botProtection = true) {

但是你提供了一个错误参数

if($instance->validateUser($data, $errors)) {

您没有向我提供errors变量的声明,但它可能与您的函数所期望的bot保护参数不匹配。 PHP正在使用输入输入,它很有用,但是,再次,你必须小心很难找到的错误。对于公共函数,您应始终确保提供的参数不会导致代码崩溃的方式。

在您的代码中,data参数似乎是一个数组。您可以使用参数提示强制使用这样的数组:

public function register(array $data) {
public function validateUser(array $data, $botProtection = true) {

甚至特定的类(就好像你在条件中使用“实例”一样)

public function register(MyDataClass $data) {
public function validateUser(MyDataClass $data, $botProtection = true) {

另外,你甚至没有在validateUser方法中使用botProtection参数。

在同一个函数调用上:

if($instance->validateUser($data, $errors)) {

您期望一个布尔值(true或false),但该方法返回一个数组。如果您想按照当前设计的方式使用代码,您必须像这样使用它

if(!empty($instance->validateUser($data, $errors)) {

在这里,我不太确定是否有必要使用异常。设计这样的代码不是更容易吗?

if(!empty($instance->validateUser($data, $errors)) {

        $message = 'Validation error';   
}

在验证功能中,“isEmpty”功能是否也验证客户端是否提供了密码?

如果是这种情况,您可以像这样验证它:

if(!in_array($user['password']) or empty($user['password']))

通过这些更正,您的代码应该正常运行。

以下是我如何设计代码的示例(考虑提供的代码示例):

class ARegister {

    public function register($data) {

      $user = $data['userData']; //don't declare it here, all the user validations must be done in validateUser($data, &$errors)

      $errors = array();

      if($this->validateUser($data, $errors)) {
        //first validation
       }
    }


    /**
    * Note: If you are not returing more than one error at the time, $errors should be a string instead of an array.
    */
    public function validateUser($data, array &$errors) {

        $isValid = false;

       if (in_array($data['fieldId']) and in_array($data['fieldId']['password']) and in_array($data['userData'])){

           if(!in_array($data['userData']['password']) or empty($data['userData']['password'])){

                $errors[$data['fieldId']['password']] = Lang::get('password_required');
            }
            else{
                $isValid = true;
             }
}       
        else{

            //an invalid data array had been provided
        }

      return $isValid;
   }

对于下一部分,如果代码直接在视图中执行并且您是初学者,则创建一个程序外部控制器文件(所有函数都将公开...)。如果您是专业人士,您必须创建一个类来封装治疗。

您不能直接在视图中进行治疗。视图是一个愚蠢的占位符,用于数据表示和收集客户端的输入。它必须做的唯一动作是显示控制器发送的数据,并将客户端的输入发送回控制器。

数据处理是控制人员的责任。

if (!empty($action) ) {

         $errors =array();

         switch ( $action ) {

            case 'process_payment':

                $instance = new ARegister();

                if($instance->validateUser($data, $errors)) {

                    //the user is valid, do the treatment
                }
                else

                    PageManager::dispayError($errors);
                }

                unset($instance);
         }
    }

以下是一个如何集中显示错误的示例

/**
     * Can be more complexe than that, but I'm at my father's home at four hundred kms away from Montreal right now..
     */
     public static function dispayError($errors, $size = 4){

         if (is_numeric($size)){

             if ($size < 0){
                 $size = 1;
             }
             elseif($size > 5){
                 $size = 5;
             } 
         }
         else{
             $size = 4;
         }

         if (is_scalar($errors)){

             echo '<h' . $size . 'class="ERROR_MESSAGE">' . $errors . '</h' . $size . '><br>';
         }
         elseif (is_array($errors)){

            foreach ($errors as $error){

                if (is_scalar($error)){

                    echo '<h' . $size . 'class="ERROR_MESSAGE">' . $error . '</h' . $size . '><br>';
                }
            }
         }
     }

当然,您也可以支持多种消息:

public static function dispayError($errors, $size = 4){

    self::displayMessage("ERROR_MESSAGE", $errors, $size=4);
}

private static displayMessage($class, $messages, $size=4)

好吧,花了我两个小时才写出来。我希望你现在有足够的资料来构建一个高效,可重用且同样重要的安全代码设计。

成功,

来自蒙特利尔的Jonathan Parent-Lévesque