игнорировать несуществующий метод - PullRequest
0 голосов
/ 06 июня 2011

Допустим, у вас есть одноэлементный шаблон или что-то еще:

class Smth{  
  public static function Foo(){
    static $instance;
    if(!condition()) return false; // <-- it's nothing...

    if(!($instance instanceof FooClass)) $instance = new FooClass();
    return $instance; // <-- it's a object and has that method
  }
}

, поэтому, если я вызову Smth::foo()->A_foo_method() при достижении condition(), метод будет выполнен, и все в порядке.

Но если condition() не выполнено, очевидно, что я получаю фатальную ошибку, сообщающую, что Smth::foo() не является объектом и т. Д. *

Как я могу просто проигнорировать 2-й случай.?Я имею в виду ничего не делать и не показывать фатальную ошибку.

(кроме проверки условия () вне класса при вызове метода)

Ответы [ 3 ]

2 голосов
/ 06 июня 2011

Посмотрите на шаблон Special Case .

2 голосов
/ 06 июня 2011

Вы не хотите этого делать. Это тихая ошибка, и это не очень хорошая вещь.Когда вы вызываете метод, вы ожидаете, что он что-то сделает (особенно getInstance -подобный метод в шаблоне Singleton, который должен возвращать экземпляр).Так что да, вы должны проверить, возвращает ли foo() реальный объект, прежде чем вызывать A_foo_method().Безмолвный сбой может создать отладочный беспорядок.

1 голос
/ 06 июня 2011

Это потому, что вы возвращаете false из Smth::foo().Это должно вернуть экземпляр Foo, чтобы остальная часть цепочки могла работать.

Я предполагаю, что вы выполняете отложенную загрузку Foo.Посмотрите на следующий простой пример того же действия с объектом БД и посмотрите, масштабируется ли он.

private static $dbh;

public static function DBC() {
    if (self::$dbh === null) {
        self::$dbh = new mysqli($mysql['host'], $mysql['un'], $mysql['pw'], $mysql['db']);
    }

    return self::$dbh;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...