Создание объекта: фатальная ошибка и её обработка.

CRL

Новичок
Создание объекта: фатальная ошибка и её обработка.

Имеется интерфейс:

PHP:
interface iface
{       
   public function method($index);
}
Имеется реализация:

PHP:
class realm implements iface
    {
        PRIVATE
            static $instance;

        private function __construct()
        {

        }

        public static function construct()
        {
            if(!isset(self::$instance))
            {
                $mirror = __CLASS__;
                self::$instance = new $mirror;
            }

            return self::$instance;
        }

        public function method($index)
        {
            return "Вызов публичного метода method() с индексом {$index}";
        }

        public function __clone()
        {
            trigger_error('Клонирование запрещено.', E_USER_ERROR);
        }
Мысль такова - я предполагаю, что заранее мне неизвестно, будет ли реализация синглтоном или нет. Поэтому, я пытаюсь сделать такую проверку:

PHP:
    @$sys = new realm;
    if(is_object($sys) === false)
    {
        $sys = realm::construct();
    }
    print $sys->method(1);
- возникает фатальная ошибка, и здесь она не обрабатывается.

Вариант, как у Котерова:
PHP:
   function err_handler($errno, $msg, $file, $line)
    {
        $sys = realm::construct();
    };

    set_error_handler("err_handler", E_ALL);
    $sys = new realm;
- результат тот же - необрабатываемая фатальная ошибка.

Отсюда возникла мысль - а вообще правильный ли это подход? Нужна ли вообще эта проверка? Если нужна, то как её реализовать? Если не нужна, как разрешить ситуацию с неизвестным заранее вариантом (синглтонным\несинглтонным) создания объекта?
 

CRL

Новичок
Автор оригинала: cDLEON
Вместо trigger_error кидайте исключение.
Если ты имеешь в виду кусок:
PHP:
public function __clone()
{
     trigger_error('Клонирование запрещено.', E_USER_ERROR);
}
, то ошибка-то возникает не здесь - до вызова этого метода дело просто не доходит.

Попробовал поймать ошибку через Exception:
PHP:
try
    {
        @$sys = new realm;
        if(!$sys)
        {
            throw new Exception();
        }
    }
    catch (Exception $error)
    {
       $sys = realm::construct();
    }
- тоже не отлавливается - те же яйца, только в профиль.
Вообще, по логике вещей - фатальная ошибка на то и фатальная, чтобы быть неолавливаемой, но - кажется - кто-то что-то по отлову таких ошибок делал. Правда, поиск тут не помог.
 

CRL

Новичок
Посмотрел.
Сделал попытку отлова ошибки:
PHP:
    function err()
    {
        return $sys = realm::construct();
    }
    ob_start('err');
    $sys = new realm;
    $sys->method(1); // вызов этого метода не выполняется - надо полагать, скрипт уже умер...
- действительно, обработка передаётся обработчику, НО, насколько я понял, работа скрипта всё равно завершается. Иными словами, выполняется и возвращяется только код тела обработчика - но мне-то нужно, чтобы работа скрипта продолжалась, а не чтобы он красиво заявил о своей смерти...

Похоже, действительно полноценно обработать эту ошибку нельзя. Таким образом, проблема меняет свой вектор, и теперь мне нужно понять, как вообще посупать в ситуациях подобного рода - повторюсь и опишу грубо: класс реализует интерфес, но заранее не известно, будет эта реализация синглтонной или нет; по сути, я пытаюст создать некий итератор, который выполняет попытки создания объекта до тех, пока он не будет создан (просто в данном случае - максимум таких попыток = 2 (синглтон\несинглтон)); сейчас мне важно понять - нужно ли это вообще делать или сам курс в корне неверен.
 

CRL

Новичок
Автор оригинала: флоппик
кому неизвестно? классу? интерфейсу? скрипту?
Данный объект предполагается создавать в объекте-фабрике, которая ничего не знает о внутриустройстве класса, экземпляр которого она создаёт.

Опишу предполагаемую схему еще раз: есть интерфейс; интрефейс реализуется несколькими классами для разных, например, стораджей; есть объект-фабрика, который выбирает нужную реализацию интерфейса и создаёт её объект; фабрика не может заранее знать, является реализация синглтонной или нет.
 

HraKK

Мудак
Команда форума
Фабрика должна знать. А если, мега необходимость ( хотя такой случай 1% макс ) то надо делать адаптер.

-~{}~ 07.10.08 10:45:

если уж ну пистец захотелось делать говнодремучий код используйте Reflection
 
Сверху