Я дам вам нестандартный обходной путь, на который повсеместно смотрят пуристы: гибридный конструктор
И это даже больше зла, чем кажется, потому что на самом деле это просто процедура-обертка:
function Product($i) {
$prod = new Product($i);
return $prod->valid() ? $prod : new InvalidProduct();
}
class Product {
function __construct() { ... }
}
class InvalidProduct extends Product implements Stub { }
$new_prod = Product("oops123"); // what will it be?
Он просто мгновенно проверяет объект. Если что-то не так, и теперь здесь есть хитрость, верните конкретную заглушку или объект NULL. Он может реализовывать несколько интерфейсов, но обычно не вызывает побочных эффектов или печатать сообщение об ошибке, когда это неизбежно. Эта концепция в основном зависит от жизнеспособности переноса объекта-заглушки. Для логики приложения иногда более разумно иметь такой специализированный экземпляр, чем использовать декоративную тестовую логику.
И есть второй вариант: просто залог за исключением.