происходит с кодом, подобным 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();
Пытаясь выполнить метод вне условного блока, ваш объект не может быть определен.
Вопросы, относящиеся:
Поскольку toArray()
создает массив Объекта, и Вы не можете сделать Object[]
в DataObject[]
только путем кастинга его. toArray(DataObject[])
создает массив DataObject
.
И да, это - недостаток класса Наборов и способа, которым Дженерики были shoehorned в Java. Вы ожидали бы, что Collection<E>.toArray()
мог возвратить массив E, но он не делает.
Интересная вещь об эти toArray(DataObject[])
вызов: Вы не должны заставлять "a" выстроить достаточно большой, таким образом, можно назвать его с toArray(new DataObject[0])
, если Вам нравится.
Вызов как toArray(new DateObject[0])
на самом деле лучше, если Вы используете .length
позже для получения длины массива. если начальная длина была большой, и тот же массив возражают, что Вы передали, был возвращен тогда, можно столкнуться NullPointerException
несколько с спустя
, я задал вопрос ранее о дженериках Java и был указан на этот FAQ, который был очень полезен: http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html
Гарантировать безопасность типов при кастинге массива как Вы предназначило (DataObject[] dataArray = (DataObject[]) objectArray;
), JVM должна будет осмотреть каждый объект в массиве, таким образом, это не на самом деле простая операция как бросок типа. Я думаю вот почему, что необходимо передать экземпляр массива, который toArray()
тогда заполняет операция.