【问题标题】:How can I make a custom exception object evaluate to false in an if condition?如何在 if 条件下使自定义异常对象评估为 false?
【发布时间】:2009-07-24 21:35:04
【问题描述】:

我只是想知道如果将我的对象放在 if 语句中,是否有任何方法可以使我的对象返回 false。原因是我正在制作一个自定义异常类。我希望能够按照以下方式做一些事情

class Dog{

   public function lookAround()
   {
        if(seeDog())
        {
            return bark;
        }
        else
        {
            return sit;
        }
   }

   public function seeDog()
   {
        if(object == Dog)
        {
             return "husky";
        } 
        else
        {
             return Dog_Exception(no_see);
        }
   }
} 

我知道这是一个非常愚蠢的例子。然而,关键是,就这个对象而言,if(seeDog()) 测试将为字符串“husky”和Dog_Exception 对象评估true。如果可能的话,如果放在if 条件下,我希望Dog_Exception 评估为false。例如,这样我就不必使用if(typeof(seeDog()) == Dog_Exception) 等构造。我怀疑这是可能的,但任何帮助都会很棒。谢谢!

【问题讨论】:

  • 你们错过了问题的重点。异常是使用错误的对象。将其更改为“结果”或其他任何内容。这一点与此无关,只是“是否有可能在放入 if 语句时使对象返回 false”
  • 大家好,因为我的问题措辞很愚蠢,所以我在这里重新提出了我的问题:stackoverflow.com/questions/1182710/… 感谢那些帮助过的人。

标签: php object boolean-expression


【解决方案1】:

为什么要返回异常?不应该扔吗?

【讨论】:

  • +1。您究竟希望 lookAround() 返回什么?一个字符串?一个布尔值?例外?
  • 我想要的只是一个对象,我们称之为 DogObject,如果我输入 $dog = new DogObject(); if(!$dog) { echo "耶,$dog 返回错误!"。 } 回声的“耶...”。本质上,我想知道是否可以让对象返回 false。
【解决方案2】:

诸如 try catch 之类的呢?你需要抛出异常而不是返回它。

function inverse($x) {
if (!$x) {
    throw new Exception('Division by zero.');
}
    else return 1/$x;
}

try {
    echo inverse(5) . "\n";
    echo inverse(0) . "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

通过:http://us3.php.net/manual/en/language.exceptions.php

【讨论】:

    【解决方案3】:
    class Dog{
    
       public function lookAround()
       {
            try
            {
                if(seeDog())
                {
                    return bark;
                }           
            }
            catch(Dog_Exception $e)
            {
                return sit;
            }
       }
    
       public function seeDog()
       {
            if(object == Dog)
            {
                 return "husky";
            } 
            else
            {
                 throw Dog_Exception(no_see);
            }
       }
    }
    

    【讨论】:

    • 应该是throw new Dog_Exception(no_see);,除非Dog_Exception是一个返回Dog_Exception实例的函数。
    【解决方案4】:

    我自己尝试这样做,并找到了一个似乎可行的解决方案。

    为了回应其他试图通过告诉提问者使用不同解决方案来回答问题的人,我还将尝试解释问题的原因。原始海报或我都不想使用异常,因为重点不是使用异常处理功能,而是将负担放在我们使用此类的任何代码上。至少对我而言,重点是能够使用它在可能以非面向对象或非基于异常的样式编写的其他 PHP 代码中无缝地类。许多内置 PHP 函数的编写方式使得不成功进程的结果为 false 是可取的。同时,我们可能希望能够在我们自己的代码中以一种特殊的方式处理这个对象。

    例如,我们可能想做这样的事情:

    if ( !($goodObject = ObjectFactory::getObject($objectType)) ) {
      // if $objectType was not something ObjectFactory could handle, it
      // might return a Special Case object such as FalseObject below
      // (see Patterns of Enterprise Application Architecture)
      // in order to indicate something went wrong.
      // (Because it is easy to do it this way.)
      //
      // FalseObject could have methods for displaying error information.
    }
    

    这是一个非常简单的实现。

    class FalseObject {
      public function __toString() {
        // return an empty string that in PHP evaluates to false
        return '';
      }
    }
    
    $false = new FalseObject();
    
    if ( $false ) {
      print $false . ' is false.';
    } else {
      print $false . ' is true.';
    }
    
    print '<br />';
    
    if ( !$false ) {
      print $false . ' is really true.';
    } else {
      print $false . ' is really false.';
    }
    

    // 我打印 $false 只是为了确保没有意外发生。

    输出为:

    是假的。 真的是假的。

    我已经对此进行了测试,即使您在类中声明了一些变量,它也可以工作,例如:

    class FalseObject {
      const flag = true;
      public $message = 'a message';
      public function __toString() {
        return '';
      }
    }
    

    一个更有趣的实现可能是:

    class FalseException extends Exception {
      final public function __toString() {
        return '';
      }
    }
    
    class CustomException extends FalseException { }
    
    $false = new CustomException('Something went wrong.');
    

    使用与之前相同的测试代码,$false 的计算结果为 false。

    【讨论】:

    • 不幸的是,这种方法不适用于我的 php 安装。 (php v5.3.5)
    • 显然他们改变了它,所以如果你有成员变量,它将评估为 true。
    猜你喜欢
    • 1970-01-01
    • 2021-06-22
    • 2020-09-08
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多