11

我正处于迁移到 100% OO php 的阶段,我最终遇到了很多这样的问题。因此,如果您觉得它很愚蠢,请原谅,我只是想在一开始就使我的 OO 编程实践良好,以便以后不必修复它们。

这样做可以吗?

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

    //Rest of code
}

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

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

  2. 通常以这种方式停止功能是否可以,或者我应该重新考虑我的程序结构?

使用它的例子是我正在制作的 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 会处理并加载“登录”模块。加载登录模块后,我不希望实例化其他引擎,因为它们不需要。我本可以使用dieexit但这会阻止整个脚本执行。像这样,我的脚本完成执行,其他不是引擎的东西,比如基准测试和其他一些东西仍然被执行,这正是我想要的。同样,我应该在这里重新考虑我的逻辑还是您认为这种方式可以?

4

3 回答 3

5

return如果满足以下条件,则没有值是可以的:

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

return在以下情况下,没有值是不行的:

  1. 发生错误 - 请改用异常。异常更容易处理,因为您可以:
    1. 在外部范围内的任何地方捕获它们,甚至在全球范围内
    2. 传递漂亮的错误消息
    3. 扩展异常类以提供附加功能
    4. 准确检查抛出了什么类型的异常
  2. 一些特定的结果类型是预期的 - 在这种情况下,您可能会考虑一些默认的“空”结果,或者如果出现问题,再次使用异常 - 它仍然比isset因为它更难忘记要好得多 - 异常是一种“响亮”的方式说发生了错误。

并且请不要使用die()exit()“处理”错误 - 向用户显示错误的技术细节是一种非常糟糕的做法。

至于你的_init_engines()方法——在不知道其余部分的情况下,真的很难说它是对还是错。

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

于 2012-11-30T19:04:54.050 回答
0

正如其他人所说,使用return;. 您通常会看到return false;,因为通常最好在可能的情况下返回有意义的东西来确定函数做了什么。如果你处于“做什么都可以”的状态,那return;是完全可以接受的。

关于多次返回,我更喜欢在条件足以确定不应继续执行时使用多个退出点。例如,如果您需要一个User ID而您没有收到一个,那么检查其余数据可能没有意义。在这种情况下,您可能会立即使用return RES_INVALID_USERID. 在这种情况下,我更喜欢多个return而不是一个链if..else(当它们嵌套时更糟)。

于 2012-11-30T19:04:28.987 回答
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
  }
于 2012-11-30T18:37:55.213 回答