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