PHP类逻辑,OOP,验证每个类中的API?

时间:2012-03-28 15:36:01

标签: php oop

好的,我需要一些基础帮助。我正在创建一个引用API的类,我有一些基本问题。我需要API首先连接并验证然后我需要它来提供响应的每个部分。所以这是我的逻辑......

Class getBalance(){

  function validate(){
   Do validation...
  }
  function getAmount(){
   var amount = obeject->amount;
   return amount;
  }
  function getDate(){
   var amount = obeject->date;
   return date;
  }
  function getCount(){
   var amount = obeject->count;
   return count;
  }

}

好的,我的第一个问题是......应该在构造函数中处理验证吗?每次调用都不需要运行,我只需要一次点击API。将它放在构造函数中会导致它在每次调用getBalance :: getAmount(),getBalance :: getDate()等时调用api吗?或者验证应该完全分开?或者我应该从验证中返回该对象,然后每次将其传递给该类?对不起我知道这是基本的,只是寻找最佳实践!感谢。

5 个答案:

答案 0 :(得分:1)

当用户请求网站的“仅登录用户”部分时,将其视为验证登录用户。也就是说,每次发出新请求时都会验证用户 - 大多数网站通过会话执行此操作,因此它在幕后发生而没有用户实际知道(除非他们知道更好:D) - 您基本上需要对调用API,即每个需要有效用户的API请求都需要进行用户验证。

将它置于构造函数中可能不是最好的选择,如果没有别的,Balance类不应该担心验证 - 你应该创建一个Validation类并在需要时静态调用它(当然,一旦您确认,您可以存储该状态并在单个请求期间保持验证真实。)

答案 1 :(得分:1)

最佳做法是尽可能地分离。建设者有两种思想流派:

  • 构造函数应仅用于初始化(两阶段构造)
  • 构造者可以“做事”(一阶段建设)

第二种方法在某些情况下更方便,更明智,但第一种方法使您的框架更容易测试,这非常重要。

您还可以执行某种延迟初始化(使用或不使用构造函数中的调用),其中验证在需要时运行一次,但不是。这增加了代码的详细程度,但它可能更有效:

private $validated = false;
public function getAmount() {
   if (!$this->validated) {
      $this->validate();
   }
   return $this->amount;
}
public function validate() {
   $this->validated = true;
}

答案 2 :(得分:0)

首先,引用中的代码是无效的PHP语法(让我们称之为伪代码)。

如果在构造函数中进行验证,则仅在第一次执行时调用

$instance = new getBalance;

然后,如果您致电$instance->getAmount(); $instance->getDate();等,则不会再次致电。

在不了解您的问题的情况下,我实际上会从构造中调用验证,如:

public function __construct(){
    $this->validate();
}

如果这对您不起作用,请详细说明。

答案 3 :(得分:0)

我认为使用自定义setter和getter ..您可以在设置之前验证所有值

样品

    class Balance{

        private $amount ;
        private $date ;
        private $count  = 0 ;

        function __construct ($amount , $date)
        {
            $this->setAmount($amount);
            $this->setDate($date);

            // Do somthign to count
            $this->count++;
        }


        function getAmount()
        {
            return $this->amount ;
        }

        function getDate()
        {
            return $this->date ;
        }

        function setAmount ($amount)
        {
            //validate Amount
            $this->amount = $amount ;
        }

        function setDate($date)
        {
            //validate date 
            $this->date = $date ;
        }

        function getCount()
        {
            return $this->count ;
        }
    }



    $balance = new Balance(2500,date("Y-n-d",time()));
    echo $balance->getAmount() , " " , $balance->getDate();

我希望这会有所帮助

谢谢

:)

答案 4 :(得分:0)

这是我的解决方案(我不是说这是最好的解决方案):

Class getBalance(){

    private $isValid = false;

    public __construct() {
    //do validation
        if validation pass
            $this->isValid = true;
        else
        $this->isValid = false;
    }

    function getAmount(){
        if($isValid) {
            var amount = obeject->amount;
            return amount;
        }
        else
            return "object not valid";
    }

    function getDate(){
        var amount = obeject->date;
        return date;
    }

    function getCount(){
        var amount = obeject->count;
        return count;
    }
}

一些评论: 我保留一个变量isValid,告诉我对象是否在构造期间通过验证(所以在构造函数中确认)

返回前的每个方法检查isValid是true还是false如果你想要