происходит с кодом, подобным xyz->method()
, где xyz
не является объектом и, следовательно, method
не может
Это фатальная ошибка, которая остановит сценарий (уведомление о прямой совместимости: это станет захватывающей ошибкой, начиная с PHP 7).
Чаще всего это знак что в коде отсутствуют проверки условий ошибок. Убедитесь, что объект фактически является объектом перед вызовом его методов.
Пример типичного будет
// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);
В приведенном выше примере запрос не может и prepare()
назначит false
на $statement
. Попытка вызвать метод execute()
приведет к Fatal Error, потому что false
является «не объектом», потому что значение является логическим.
Выясните , почему ваша функция вернула логическое значение вместо объекта. Например, проверьте объект $pdo
для последней произошедшей ошибки. Подробности о том, как отлаживать это, будут зависеть от того, как обрабатываются ошибки для конкретной рассматриваемой функции / объекта / класса.
Если даже сбой ->prepare
не выполняется, то ваш дескриптор
// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);
базы данных
// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);
не попал в текущий объем . Найдите, где он определился. Затем передайте его как параметр, сохраните его как свойство или поделите его через глобальную область.
Другой проблемой может быть условное создание объекта, а затем попытка вызова метода вне этого условного блока. Например,
if ($someCondition) {
$myObj = new MyObj();
}
// ...
$myObj->someMethod();
Пытаясь выполнить метод вне условного блока, ваш объект не может быть определен.
Вопросы, относящиеся:
Вообще говоря, плагины jQuery являются пространствами имен на объеме jQuery. Вы могли осуществить простую проверку, чтобы видеть, существует ли пространство имен:
if(jQuery().pluginName) {
//run plugin dependent code
}
dateJs однако не является плагином jQuery. Это изменяет/расширяет объект даты JavaScript и не добавляется как пространство имен jQuery. Вы могли проверить, существует ли метод, в котором Вы нуждаетесь, например:
if(Date.today) {
//Use the dateJS today() method
}
, Но Вы могли бы столкнуться с проблемами, где API перекрывает собственный API Даты.
Я настоятельно рекомендовал бы, чтобы Вы связали библиотеку DateJS своим плагином и зарегистрировали то, что Вы сделали его. Ничто не более печально, чем необходимость выследить зависимости.
Однако по легальным причинам, Вы не можете всегда быть в состоянии связать все. Также никогда не повреждает быть осторожным и проверить на существование плагина с помощью ответ Eran Galperin .
Этот вид подхода должен работать.
var plugin_exists = true;
try {
// some code that requires that plugin here
} catch(err) {
plugin_exists = false;
}
Для обнаружения подключаемых модулей jQuery я счел более точным использовать скобки:
if(jQuery().pluginName) {
//run plugin dependent code
}