Php 是否可以在默认情况下使对象返回false?

Php 是否可以在默认情况下使对象返回false?,php,if-statement,boolean-expression,Php,If Statement,Boolean Expression,我以前试过问这个问题,但把问题搞砸了,所以我会再试一次。当放入if语句时,是否可能在默认情况下使对象返回false?我想要的是: $dog = new DogObject(); if($dog) { return "This is bad;" } else { return "Excellent! $dog was false!" } 这有可能吗?这不是完全必要的,但可以为我节省一些代码行。谢谢 在“if语句”中添加某些内容只是将其中的变量作为布尔值进行求值 在您的示例中,$do

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

$dog = new DogObject();
if($dog)
{
   return "This is bad;"
}
else
{
   return "Excellent!  $dog was false!"
}
这有可能吗?这不是完全必要的,但可以为我节省一些代码行。谢谢

在“if语句”中添加某些内容只是将其中的变量作为布尔值进行求值

在您的示例中,$dog必须始终为false才能起作用。无法判断变量何时将在布尔表达式中求值

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

在“if语句”中添加某些内容只是将其中的变量作为布尔值进行计算

在您的示例中,$dog必须始终为false才能起作用。无法判断变量何时将在布尔表达式中求值


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

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

class DogObject
{
    var $isValid = false;

    public function IsValid()
    {
        return $isValid;
    }
}
然后,当您实例化它时,它默认为false

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

只是想一想。

我不确定这个物体本身。可能的您可以尝试类似的方法,向DogObject类添加公共属性,然后将其默认设置为false。比如

class DogObject
{
    var $isValid = false;

    public function IsValid()
    {
        return $isValid;
    }
}
然后,当您实例化它时,它默认为false

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

只是想一想。

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

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

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

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

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

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

在什么条件下你希望
If($dog)
计算为假?你不能按字面上的要求去做,但也许条件可以被你想要的东西所取代。

在什么条件下你想让if($dog)计算为false?你不能按字面上的要求去做,但也许条件式可以被你想要的东西所取代。

像下面的C#那样使用隐式Cast操作符怎么样

像这样:

    class DogObject
    {
        public static implicit operator bool(DogObject a)
        {
            return false;
        }
    }
然后你可以去

    var dog = new DogObject();

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

使用隐式Cast操作符(如下面的C#)怎么样

像这样:

    class DogObject
    {
        public static implicit operator bool(DogObject a)
        {
            return false;
        }
    }
然后你可以去

    var dog = new DogObject();

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

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

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

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

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


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

使用instanceof关键字

比如说

$result = Users->insertNewUser();

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

使用instanceof关键字

比如说

$result = Users->insertNewUser();

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

用这个吗?这不是一个真正简洁的解决方案,但能满足您的需求:

<?php

    class Foo
    {
        private $valid = false;

        public function Bar ( )
        {
            // Do stuff
        }

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

?>


零被认为是假的,一个被PHP认为是真的使用这个?这不是一个真正简洁的解决方案,但能满足您的需求:

<?php

    class Foo
    {
        private $valid = false;

        public function Bar ( )
        {
            // Do stuff
        }

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

?>


零被认为是错误的,一被PHP认为是正确的。我自己也在尝试这样做,并找到了一个似乎可行的解决方案

对于其他试图回答问题的人,我会告诉提问者使用不同的解决方案,我也会尝试解释问题的原因。无论是原始海报还是我都不想使用异常,因为重点不是使用异常处理特性,而是将此负担放在我们使用此类的任何代码上。至少对我来说,关键是能够在其他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.';
}

一个稍微有趣的实现可能是:

class FalseException extends Exception {
  final public function __toString() {
    return '';
  }
}

class CustomException extends FalseException { }

$false = new CustomException('Something went wrong.');

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

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

对于其他试图回答问题的人,我会告诉提问者使用不同的解决方案,我也会尝试解释问题的原因。无论是原始海报还是我都不想使用异常,因为重点不是使用异常处理特性,而是将此负担放在我们使用此类的任何代码上。至少对我来说,关键是能够在其他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.';
}

一个稍微有趣的实现可能是:

class FalseException extends Exception {
  final public function __toString() {
    return '';
  }
}

class CustomException extends FalseException { }

$false = new CustomException('Something went wrong.');

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

我最近不得不使用null对象模式做类似的事情。不幸的是,null对象返回true,并且所讨论的变量有时是实际的null值(来自函数的默认参数)。我想到的最好的方法是if((string)$var){尽管这对空数组不起作用