1

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

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

有没有办法做到这一点?这不是完全必要的,但会为我节省一些代码行。谢谢!

4

11 回答 11

3

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

于 2009-07-25T19:02:32.370 回答
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.
}

信息在这里。

于 2009-07-25T19:15:02.987 回答
1

用这个?不是一个真正整洁的解决方案,但可以满足您的需求:

<?php

    class Foo
    {
        private $valid = false;

        public function Bar ( )
        {
            // Do stuff
        }

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

?>

零被认为是的,一个被PHP认为是真的

于 2009-07-25T19:44:22.270 回答
1

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

为了回应其他试图通过告诉提问者使用不同的解决方案来回答问题的人,我还将尝试解释问题的原因。原始海报或我都不想使用异常,因为重点是不要使用异常处理功能并将负担放在我们使用此类的任何代码上。至少对我而言,重点是能够使用它在可能以非面向对象或非基于异常的样式编写的其他 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。

于 2009-08-16T02:07:15.820 回答
1

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

于 2010-07-14T10:29:30.797 回答
0

将某些内容放入“if 语句”中只是将那里的变量评估为布尔值。

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

你在这里的最终目的是什么?您要保存哪些代码行?

于 2009-07-25T18:42:01.837 回答
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!"
}

只是一个想法。

于 2009-07-25T18:43:00.943 回答
0

如果我理解您的要求,我认为您想这样做:

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

这 !意味着没有。所以你可以读到,“如果不是狗,或者如果狗不是真的”

于 2009-07-25T18:43:19.493 回答
0

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

于 2009-07-25T18:44:57.507 回答
0

使用像下面的 C# 这样的隐式转换运算符怎么样?

像这样:

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

那你可以去...

    var dog = new DogObject();

    if(!dog)
    {
        Console.WriteLine("dog was false");
    }
于 2009-07-25T18:54:27.253 回答
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);
    }
  }
}

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

于 2009-07-25T19:07:47.960 回答