PHP让函数设置成员变量或让它返回结果

时间:2016-04-15 09:46:02

标签: php conventions

我一直在想些什么,我希望有人可以为我澄清。

假设我们有一个班级

class Test
{
    private $value;

    function first()
    {
        if("this"=="that") {
            $neededVariable = 1;
        }
    }
    function second()
    {
        $this->first();
        //I need to evaluate something that was done in function first
        if($neededVariable===1) {
            //do something
        }
}

现在最好的做法是什么?据我所知,有两种选择:

  1. first()函数将成员变量设置为$this->value = 1;,并使用second()函数访问该变量。
  2. 2. first()函数可以返回$neededVariable

    他们都给出了相同的结果,但我担心是否有最好的做法。也许一个人比另一个人有更好的表现,或者仅仅因为它是选择1/2的惯例。

    非常感谢任何答案!

    提前致谢:)

3 个答案:

答案 0 :(得分:1)

我认为1号更好。

因为如果你使用no.2,每次调用second()时,first()也将在func second中调用。(首先需要大量cpu使用时对cpu不好)

但是,2号也有一些好东西。每次你想使用func秒时,你应该先调用func,除非$ value为null。如果你想在不同的页面中使用这个类,那就不好了。

答案 1 :(得分:0)

在你提到的第一种方法中,我们只是调用一个例程(函数),并且已经开始使用创建的成员变量的空间,因此不再需要内存, 在第二个时,如果从该子例程返回值,则需要另一个临时变量来存储该数据。它们都有相同的结果,但你不知不觉中你将在第二种方法中为该临时变量创建一个更多的内存块。

    class Test
    {
        private $value;

        function first()
        {
            if("this"=="that") {
                $neededVariable = 1;
            }
    return $neededVariable;
        }
        function second()
        {
    //either you create a variable or use directly the function in if..      
   //both will require that temporary memory block.
            $var = $this->first();  //or if($this->first() == 1)
            if($var ===1) {
                //do something
            }

    }

答案 2 :(得分:0)

在$ this中存储第一个结果意味着修改对象的状态。简单地使用它来传递结果是糟糕的设计,因为代码的读者会认为对象状态的修改具有更深层的含义。更糟糕的是,调用second()也会以与first()相同的方式修改对象的状态 - 这是你的代码用户期望的吗?

如果修改对象的状态是first()的预期目的,并且用户会清楚第二个()具有相同的效果,那么设置$ this - > first()中的值和在second()中调用first()是很好的设计。

但是,如果您只想共享逻辑,只需编写一个只重用逻辑的函数。这样,您可以将设置状态与重用逻辑分开。

class Test
{
    private $value;

    private function evaluate() {
      $neededVariable = 0;
      if ("this"=="that") {
         $neededVariable = 1
      }
      return $neededVariable;
    }

    function first()
    {
       $this->value = $this->evaluate();
    }

    function second()
    {
        $neededVariable = $this->evaluate();
        if($neededVariable===1) {
            //do something
        }
    }
}