PHP方法返回没有值

时间:2012-11-30 18:32:37

标签: php oop return

我正处于迁移到100%OO php的阶段,我最终遇到了很多像这样的问题。对不起,如果你发现它很愚蠢,我只是想在开始时让我的OO编程实践很好,这样我就不用再修复它了。

这样做可以吗?

private function _some_funct($args) {
    // Some code here....
    if ($something) return;

    //Rest of code
}

基本上,这里有2个问题。

  1. 使用返回后没有值可以吗?我使用它很多并没有遇到任何缺点,但从未在其他人的代码中看到它。我只看到返回false

  2. 这样停止功能一般还是应该重新考虑我的程序结构?

  3. 使用它的例子就是我正在制作的CMS。

    public function _init_engines() {
        $this->_session_engine = $this->_dep['SessionEngine'];
        $this->_login_engine = $this->_dep['LoginEngine'];
        if ($this->_dep['User'] == false) return;   
        $this->_security_engine = $this->_dep['SecurityEngine'];
        //Other engines go here.......
    }
    

    所以我让系统启动会话并设置会话变量,然后检查用户是否已登录。如果用户未登录,则LoginEngine负责处理并加载“登录”模块。加载Login模块后,我不希望其他引擎被实例化,因为它们不需要。我本可以使用 die 退出,但这会阻止整个脚本执行。像这样,我的脚本完成执行,其他不是引擎的东西,比如基准测试和其他一些东西仍然被执行,这正是我想要的。再说一遍,我应该在这里重新考虑我的逻辑还是你认为这样做好吗?

3 个答案:

答案 0 :(得分:2)

没有值的

return如果符合以下条件,则可以:

  1. 您的界面明确表示 - docblock状态@return void(如果函数中不需要结果值)或类似@return sometype|null sometype string int,{{1}等等。
  2. 使用此类函数/方法的返回值的代码在使用返回值之前检查isset() - 如果使用您的代码(或您自己)的人忘记检查它,这可能会导致错误。
  3. 没有值的

    return如果符合以下条件则不行:

    1. 发生错误 - 改为使用例外。例外处理更容易,因为您可以:
      1. 在外部范围内的任何地方捕捉它们,甚至全球
      2. 传递好的错误消息
      3. 扩展异常类以提供其他功能
      4. 确切地检查抛出了什么类型的异常
    2. 预计会有一些特定的结果类型 - 在这种情况下,你可能会考虑一些默认的“空”结果,或者如果出现问题则再次使用例外 - 它仍然比isset好得多,因为它更难忘记 - 异常是说出错误的“大声”方式。
    3. 请不要使用die()exit()来“处理”错误 - 向用户展示错误的技术细节是一种非常糟糕的做法。

      至于你的_init_engines()方法 - 如果不了解其余方法,很难说它是对还是错。

      如果您对PHP中的OOP示例感兴趣,我建议您查看Symfony

答案 1 :(得分:0)

这深入研究单回归点与多回归宗教战斗,但她我们走了......

使用许多返回而没有任何值或实际需要作为执行流控制以避免继续执行函数是非常糟糕的形式。这是一个神奇的'goto'声明阵营。是的,你可以做到这一点,但我会投票否决实际做到这一点,特别是如果在一些常见情况下,你的功能不会早期退回几次。

为什么不重构你的函数,所以它没有返回,但不执行它不需要的代码? 如果您发现您的函数/方法很容易重构,那么它可能是一个信号,意味着您可能希望将它们分解为更简洁的方法/函数。

  public function _init_engines() {
    $this->_session_engine = $this->_dep['SessionEngine'];
    $this->_login_engine = $this->_dep['LoginEngine'];
    if ($this->_dep['User'] != false){ 
         $this->_security_engine = $this->_dep['SecurityEngine'];
    } else if (){
       //Other engines go here.......
    } 
    //no useless return needed
  }

答案 2 :(得分:0)

正如其他人所说,使用return;没有任何缺点。您通常会看到return false;,因为通常最好在可能的情况下返回有意义的内容,以确定函数的作用。如果你处于“不管它做了什么,那没关系”,那么return;是完全可以接受的。

关于多次返回,当条件足以确定执行不应继续时,我更喜欢使用多个退出点。例如,如果您需要User ID并且没有收到,可能没有必要检查其余数据。在这种情况下,您可以使用return RES_INVALID_USERID之类的内容立即结束该功能。在这种情况下,我更喜欢多个return而不是if..else链(当它们嵌套时更糟糕)。