Случается, когда вы пытаетесь получить доступ к объекту объекта, пока нет объекта.
Типичный пример для 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;
Связанные ошибки:
Я думаю, что это - порядок расширений:
порядок расширений:
brace expansion
, расширение тильды, параметр,variable
и арифметическая замена расширения и команды (выполненный слева направо вид), разделение слова, иpathname expansion
.
Поэтому, если Вашей переменной заменяют, расширение фигурной скобки больше не происходит. Это работает на меня:
eval ls $dirs
Быть очень осторожным с оценкой. Это выполнит материал дословно. Таким образом, если директора будут содержать f{m,k}t*; some_command
, то some_command будет выполняться после законченного ls. Это выполнит строку, которую Вы даете eval
в текущей оболочке. Это передаст /content/dev01 /content/dev02
ls, существуют ли они или нет. При помещении *
после того, как материал делает его расширением пути, и это опустит несуществующие пути:
dirs=/content/{dev01,dev02}*
я не на 100% уверен в этом, но это имеет смысл мне.
Здесь превосходное обсуждение того, что Вы пытаетесь сделать.
короткий ответ - то, что Вы хотите массив:
dirs=(/content/{dev01,dev01})
, Но то, что Вы делаете с результатами, может стать более сложным, чем, к чему Вы стремились, я думаю.
Это не имя файла globbing, это - расширение фигурной скобки. Различие является тонким, но оно существует - в имени файла globbing Вы только получил бы существующие файлы в результате, в то время как в расширении фигурной скобки можно генерировать любой вид строки.
http://www.gnu.org/software/bash/manual/bashref.html#Brace-Expansion
http://www.gnu.org/software/bash/manual/bashref.html#Filename-Expansion
Теперь, это - то, что работало на меня:
#!/bin/sh
dirs=`echo ./{dev01,dev02}`
ls $dirs