我之前试过问这个问题,搞砸了这个问题,所以我会再试一次。当放入if语句时,是否可以使对象默认返回false?我想要的是什么:
$dog = new DogObject();
if($dog)
{
return "This is bad;"
}
else
{
return "Excellent! $dog was false!"
}
这有可能吗?这不是完全必要的,但会省去一些代码行。谢谢!
答案 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.
}
答案 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);
}
}
}
有一百万种方法可以处理错误。这一切都取决于错误的复杂性和恢复选项的数量。