Кастинг массива Объектов в массив моего намеченного класса

Неустранимая ошибка: вызов функции-члена ... на не-объект

происходит с кодом, подобным 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();

Пытаясь выполнить метод вне условного блока, ваш объект не может быть определен.

Вопросы, относящиеся:

29
задан Norill Tempest 16 July 2018 в 14:40
поделиться

2 ответа

Поскольку 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

38
ответ дан vaxquis 28 November 2019 в 01:49
поделиться

Гарантировать безопасность типов при кастинге массива как Вы предназначило (DataObject[] dataArray = (DataObject[]) objectArray;), JVM должна будет осмотреть каждый объект в массиве, таким образом, это не на самом деле простая операция как бросок типа. Я думаю вот почему, что необходимо передать экземпляр массива, который toArray() тогда заполняет операция.

3
ответ дан Henning 28 November 2019 в 01:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: