是否可以使对象默认返回false?

时间:2009-07-25 18:38:43

标签: php if-statement boolean-expression

我之前试过问这个问题,搞砸了这个问题,所以我会再试一次。当放入if语句时,是否可以使对象默认返回false?我想要的是什么:

$dog = new DogObject();
if($dog)
{
   return "This is bad;"
}
else
{
   return "Excellent!  $dog was false!"
}

这有可能吗?这不是完全必要的,但会省去一些代码行。谢谢!

11 个答案:

答案 0 :(得分:3)

不,PHP不支持运算符重载。也许他们会在未来版本中添加它。

答案 1 :(得分:2)

使用instanceof关键字。

例如

$result = Users->insertNewUser();

if($result instanceof MyErrorClass){
  (CHECK WHAT WENT WRONG AND SAY WHY)
} else {
  //Go on about our business because everything worked.
}

Info is here.

答案 2 :(得分:1)

用这个?不是一个真正的整洁解决方案,但做你想要的:

<?php

    class Foo
    {
        private $valid = false;

        public function Bar ( )
        {
            // Do stuff
        }

        public function __toString ( )
        {
            return ( $this -> valid ) ? '1' : '0';
        }
    }

?>

零被视为 false ,PHP被认为是 true

答案 3 :(得分:1)

我自己试图这样做,并找到了似乎有效的解决方案。

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

例如,我们可能希望执行以下操作:

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。

答案 4 :(得分:1)

我最近不得不使用null对象模式做类似的事情。不幸的是,null对象返回true,有问题的变量有时是一个实际的空值(来自函数的默认参数)。我提出的最好的方法是if((string)$ var){虽然这对空数组不起作用。

答案 5 :(得分:0)

将某些内容放在“if语句”中只是将变量作为布尔值进行评估。

在您的示例中,$ dog需要始终 false才能生效。无法判断您的变量何时将在布尔表达式中进行评估。

这里的最终目的是什么?你想保存哪些代码?

答案 6 :(得分:0)

我不确定对象本身。可能。您可以尝试类似的方法,将一个公共属性添加到DogObject类,然后默认设置为false。如。。

class DogObject
{
    var $isValid = false;

    public function IsValid()
    {
        return $isValid;
    }
}

然后当你实例化它时,它默认是假的。

$dog = new DogObject();
if($dog->IsValid())
{
   return "This is bad;"
}
else
{
   return "Excellent!  $dog was false!"
}

只是一个想法。

答案 7 :(得分:0)

如果我理解你的要求,我想你想这样做:

if (!$dog){
     return "$dog was false";
}

!意思不是。所以,你可以读到,“如果不是狗,或狗是不是真的”

答案 8 :(得分:0)

在什么条件下,您希望if($dog)评估为false?你不能做你真正要求的事情,但也许有条件的东西可以取代你想要的东西。

答案 9 :(得分:0)

如何使用Implicit Cast Operator,如下面的C#?

像这样:

    class DogObject
    {
        public static implicit operator bool(DogObject a)
        {
            return false;
        }
    }

然后你可以去...

    var dog = new DogObject();

    if(!dog)
    {
        Console.WriteLine("dog was false");
    }

答案 10 :(得分:0)

class UserController
{
  public function newuserAction()
  {
    $userModel = new UserModel();
    if ($userModel->insertUser()) {
      // Success!
    } else {
      die($userModel->getError());
    }
  }
}

class UserController
{
  public function newuserAction()
  {
    $userModel = new UserModel();
    try {
      $userModel->insertUser()
    }
    catch (Exception $e) {
      die($e);
    }
  }
}

有一百万种方法可以处理错误。这一切都取决于错误的复杂性和恢复选项的数量。