Случается, когда вы пытаетесь получить доступ к объекту объекта, пока нет объекта.
Типичный пример для non-object notice будет
$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object
В этом случае $users
представляет собой массив (а не объект), и он не имеет никаких свойств.
Это похоже для доступа к несуществующему индексу или ключу массива (см. Примечание: Undefined Index ).
Этот пример значительно упрощен. Чаще всего такое уведомление сигнализирует неконтролируемое возвращаемое значение, например. когда библиотека возвращает NULL
, если объект не существует или просто неожиданное значение, отличное от объекта (например, в результате Xpath, структуры JSON с непредвиденным форматом, XML с неожиданным форматом и т. д.), но код не проверяет такой условие.
Поскольку эти не-объекты часто обрабатываются дальше, часто возникает фатальная ошибка при вызове метода объекта для не-объекта (см.: Неустранимая ошибка: вызов члену function ... на не-объекте ), останавливая скрипт.
Его можно легко предотвратить, проверив условия ошибки и / или переменную, соответствующую ожиданию. Здесь такое уведомление с примером DOMXPath:
$result = $xpath->query("//*[@id='detail-sections']/div[1]");
$divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object
Проблема заключается в доступе к свойству nodeValue
первого поля, пока он не был проверен, существует ли он или нет в $result
коллекция. Вместо этого он платит, чтобы сделать код более явным, назначив переменные объектам, на которых работает код:
$result = $xpath->query("//*[@id='detail-sections']/div[1]");
$div = $result->item(0);
$divText = "-/-";
if ($div) {
$divText = $div->nodeValue;
}
echo $divText;
Связанные ошибки:
Взгляните на ВИХРЕВАЯ библиотека :
#include <stdio.h>
#include <curl/curl.h>
int main(void)
{
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se");
res = curl_easy_perform(curl);
/* always cleanup */
curl_easy_cleanup(curl);
}
return 0;
}
BTW, если C++ строго не требуется. Я поощряю Вас пробовать C# или Java. Это намного легче и существует встроенный путь.
Существует свободная библиотека TCP/IP, доступная для Windows, который поддерживает HTTP и HTTPS - использование, это очень просто.
CUT_HTTPClient http;
http.GET("http://folder/file.htm", "c:/tmp/process_me.htm");
можно также ПОЛУЧИТЬ файлы и сохранить их в буфере памяти (через CUT_DataSource
производные классы). Вся обычная поддержка HTTP там - ПОМЕЩЕНА, ГОЛОВА, и т.д. Поддержка прокси-серверов является бризом, как защищенные сокеты.
Вы не упоминаете платформы, таким образом, я даю Вам ответ для Win32.
Один простой способ загрузить что-либо с Интернета URLDownloadToFile
с IBindStatusCallback
набор параметра к NULL
. Для создания функции более полезной интерфейс обратного вызова должен быть реализован.
Можно сделать это с программированием сокета, но это хитро для реализации частей протокола, должен был надежно выбрать страницу. Лучше пользоваться библиотекой, как неон . Это, вероятно, будет установлено в большинстве дистрибутивов Linux. В соответствии с FreeBSD пользуются библиотекой выборки.
Для парсинга данных, потому что много страниц не используют допустимый XML, необходимо реализовать эвристику, не реальный находящийся в yacc синтаксический анализатор. Можно реализовать эти регулярные выражения использования или машину изменения состояния. Поскольку то, что Вы пытаетесь сделать, включает много эмпирических, Вы - более обеспеченное использование языка сценариев, как Perl. Из-за высокой сетевой задержки Вы не будете видеть разницы в производительности.
Попытайтесь пользоваться библиотекой, как QT, который может считать данные со всех концов сети и вытащить данные из xml документа. Это является примером того, как считать канал xml. Вы могли использовать канал eBay, например.