Можно ли заставить объект возвращать false по умолчанию? - PullRequest
1 голос
/ 25 июля 2009

Я пытался задать это раньше, и перепутал вопрос, поэтому я попробую еще раз. Можно ли заставить объект возвращать false по умолчанию, если поместить в оператор if? Что я хочу:

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

Есть ли способ, которым это возможно? Это не совсем необходимо, но спасло бы меня несколько строк кода. спасибо!

Ответы [ 11 ]

3 голосов
/ 25 июля 2009

Нет, PHP не поддерживает перегрузку операторов. Может быть, они добавят его в будущей версии.

2 голосов
/ 25 июля 2009

Используйте ключевое слово instanceof.

Например,

$result = Users->insertNewUser();

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

Информация здесь.

1 голос
/ 14 июля 2010

Мне недавно пришлось сделать нечто подобное, используя шаблон нулевого объекта. К сожалению, нулевой объект возвращал истину, и рассматриваемая переменная иногда была фактическим нулевым значением (из параметра функции по умолчанию). Лучший способ, которым я придумал, был if ((string) $ var) {хотя это не сработало бы для пустых массивов.

1 голос
/ 16 августа 2009

Я пытался сделать это сам и нашел решение, которое, кажется, работает.

В ответ на других, которые пытались ответить на вопрос, сказав спрашивающему использовать другое решение, я также будупопытайтесь объяснить причину вопроса. Ни первоначальный постер, ни я не хотим использовать исключение, потому что цель состоит не в том, чтобы использовать функции обработки исключений, а в том, чтобы накладывать это бремя на любой код, в котором мы используем этот класс. Суть, по крайней мере для меня, заключалась в том, чтобы иметь возможность использовать этоКласс легко в другом 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 '';
  }
}

Возможно, более интересная реализацияbe:

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

class CustomException extends FalseException { }

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

Используя тот же тестовый код, что и раньше, $ false оценивается как ложное.

1 голос
/ 25 июля 2009

Использовать это? Не очень удачное решение, но делает то, что вы хотите:

<?php

    class Foo
    {
        private $valid = false;

        public function Bar ( )
        {
            // Do stuff
        }

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

?>

Ноль считается ложным , один считается истинным PHP

0 голосов
/ 25 июля 2009
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);
    }
  }
}

Существует миллион способов обработки ошибок. Все зависит от сложности ошибки и количества вариантов восстановления.

0 голосов
/ 25 июля 2009

Как насчет использования оператора Implicit Cast, подобного следующему C #?

примерно так:

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

Тогда вы можете перейти ...

    var dog = new DogObject();

    if(!dog)
    {
        Console.WriteLine("dog was false");
    }
0 голосов
/ 25 июля 2009

При каких условиях вы хотите if($dog) оценить как ложное? Вы не можете делать то, что буквально просили, но, возможно, условное можно заменить чем-то, что делает то, что вы хотите.

0 голосов
/ 25 июля 2009

Если я понимаю, о чем вы спрашиваете, думаю, вы захотите сделать это:

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

The! значит нет. Так что вы можете прочитать это: «Если не собака, или если собака НЕ ​​верна»

0 голосов
/ 25 июля 2009

Я не уверен насчет самого объекта. Возможно. Вы можете попробовать что-то вроде: добавить открытое свойство в класс 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!"
}

Просто мысль.

...