2009-07-25 52 views
1

我曾试着问过这个问题,并且弄错了这个问题,所以我会再试一次。放入if语句时,是否有可能使对象在默认情况下返回false?我想要的:是否有可能使对象默认返回false?

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

有没有一种方法,这是可能的?这不是完全必要的,但会为我节省一些代码行。谢谢!

+0

好的,让我澄清一点,因为我认为在试图简化问题时,人们并不了解它的核心。所以在这里: 我使用的是Zend Framework,这意味着我经常使用模型(对于那些不知道它们本质上是插入/更新/使用数据库的任何快捷方式的人)。我经常在我的一个控制器中调用Users-> insertNewUser()。如果成功,它将返回一个Zend_Db_Table_Rowset。但是,可以说用户名已经存在。我不想回复错误,因为那不会告诉我哪里出了问题。 – Ethan 2009-07-25 18:56:02

+0

我喜欢这个问题,因为它有一个狗对象,你试过隐式重载吗? – 2009-07-25 18:56:40

+0

相反,我创建了一个名为modelResult的对象,它携带了模型未能执行其功能的原因。我想要的是能够回到控制器中,能够说出$ result = Users-> insertNewUser()。如果($结果){返回$结果} else {(检查什么WENT错误和说为什么)}。我知道我可以通过检查$ result的类型来做到这一点。我知道有很多方法可以做到这一点。但是,我只是想知道是否可以让我的ModelResult对象返回false,因为它会更容易使用。有没有办法做到这一点?如果答案是否定的,那么我会管理。 – Ethan 2009-07-25 19:01:01

回答

3

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

0

把一些东西放在“一个if语句”中,就是简单地将其中的变量评估为布尔值。

在您的示例中,$ dog将需要为始终为 false才能工作。没有办法知道什么时候您的变量即将在布尔表达式中进行评估。

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

+0

好吧,从技术上来说,这里有falsy和truthy。例如,如果你把$ string =“”,然后做如果($字符串),$字符串将被视为false。这与int 0是一样的。我只是想知道是否有办法让DogObject虚伪。 – Ethan 2009-07-25 18:44:59

+1

好的,我明白你想要做什么。我认为有人在你的其他线索中提到了这一点,但你真正想要做的是尝试/捕捉。您尝试插入,然后捕获抛出的任何异常。 – thedz 2009-07-25 19:00:14

0

我不确定对象本身。可能。你可以尝试类似的方法,在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!" 
} 

只是一个想法。

+0

是的,但想法是,它会更多地沿着以下方向: $ dog = couldReturnDogObjectButCouldAlsoBeArray(); if($ dog)...等 如果$ dog不一定是DogObject,并且我调用了IsValid(),那么我的程序就会崩溃。但是,如果我可以在if语句中使DogObject为false,那么当它是一个数组时,我可以返回true,并且当它是DogObject时返回false。 – Ethan 2009-07-25 18:50:06

0

如果我理解你问,我想你想这样做:

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

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

+0

对不起,如果这不是你正在寻找的...如果它不只是留下一个信息,不要让我失望很多,我无法理解你的问题......我想我会给它一个镜头。 – micmoo 2009-07-25 18:45:18

0

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

0

如何使用像下面的C#隐式演员操作符?

像这样:

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

然后你可以去...

var dog = new DogObject(); 

    if(!dog) 
    { 
     Console.WriteLine("dog was false"); 
    } 
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); 
    } 
    } 
} 

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

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.

1

使用此?不是一个真正的纯溶液,但你想要做什么:

<?php 

    class Foo 
    { 
     private $valid = false; 

     public function Bar () 
     { 
      // Do stuff 
     } 

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

?> 

零被认为是,一个是由PHP

认为 真正
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.'; 
} 

//我打印$假,只是为了确保无意外发生的事情。

的输出是:

是假的。 确实是错误的。

我测试过这一点,如果你有这个类里面的一些声明的变量,如它的工作原理,甚至:

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。

1

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

相关问题