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


PHP Let function set a member variable OR let it return the result

我一直在想一些事情,希望有人能帮我澄清。

假设我们有一个类

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.first()函数可以返回$neededVariable

他们都给出了相同的结果,但我在犹豫是否有最佳实践。也许其中一个比另一个有更好的表现,或者只是因为选择1/2是惯例。

非常感谢您的回答!

提前感谢:)

我认为1号更好。

因为如果使用2,每次调用second()时,first()也会在func-second中被调用。(首次需要大量使用cpu时对cpu不利)

但2号也有一些好东西。每次要使用func second时,除非$value为null,否则应该先调用func。如果你想在不同的页面中使用这个类,这是很糟糕的。

将first的结果存储在$中意味着修改对象的状态。简单地使用它来传递结果是糟糕的设计,因为代码的读者会认为修改对象的状态有更深的意义。更糟糕的是,调用second()也会像调用first()一样修改对象的状态——这是代码用户所期望的吗?

如果修改对象的状态是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
        }
    }
}

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

    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
            }
    }