PHP 让函数设置一个成员变量或让它 return 结果

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

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

假设我们有一个 class

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

它们都给出相同的结果,但如果有最佳实践,我正在措辞。也许一个比另一个有更好的性能,或者仅仅是因为选择选项 1/2 是惯例。

非常感谢任何答案!

提前致谢:)

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

    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
            }

    }

我觉得1号更好

因为如果你使用 no.2,每次调用 second() 时,first() 也会在 func second 中调用。(当 first 需要大量 cpu 时,对 cpu 不利用法)

不过2号也有一些好东西。每次你想第二次使用 func 时,你应该先调用 func,除非 $value 将为 null。如果您想在不同的页面中使用此 class,这很糟糕。

将first 的结果存储在$this 中意味着修改对象的状态。仅仅使用它来传递结果是糟糕的设计,因为代码的 reader 将假定对象状态的修改具有更深层次的含义。更糟糕的是,调用 second() 也会以与 first() 相同的方式修改对象的状态 - 这是您代码的用户所期望的吗?

如果修改对象的状态是 first() 的预期目的,并且用户很清楚 second() 会产生相同的效果,则设置 $ first() 中的 this->value 并在 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
        }
    }
}