Случается, когда вы пытаетесь получить доступ к объекту объекта, пока нет объекта.
Типичный пример для 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;
Связанные ошибки:
Нотация индексатора требует ссылки на this
. Так как статические методы не имеют ссылки на конкретный экземпляр класса, Вы не можете использовать this
с ними, и следовательно Вы не можете использовать нотацию индексатора на статических методах.
решение Вашей проблемы использует шаблон "одиночка" следующим образом:
public class Utilities
{
private static ConfigurationManager _configurationManager = new ConfigurationManager();
public static ConfigurationManager ConfigurationManager => _configurationManager;
}
public class ConfigurationManager
{
public object this[string value]
{
get => new object();
set => // set something
}
}
Теперь можно звонить Utilities.ConfigurationManager["someKey"]
нотация индексатора использования.
Я полагаю, что это, как полагали, не было ужасно полезно. Я думаю, что это - позор также - пример, который я склонен использовать, Кодирует, где Encoding.GetEncoding("foo")
мог быть Encoding["Foo"]
. Я не думаю, что это подходило бы очень часто, но кроме чего-либо еще, что это просто чувствует себя немного непоследовательным, чтобы не быть доступным.
я должен был бы проверить, но я подозреваемый это уже доступно в IL (Промежуточный язык).
Как обходное решение, можно определить индексатор экземпляра на одиночном элементе/статическом объекте (скажите, что ConfigurationManager является одиночным элементом, вместо того, чтобы быть статическим классом):
class ConfigurationManager
{
//private constructor
ConfigurationManager() {}
//singleton instance
public static ConfigurationManager singleton;
//indexer
object this[string name] { ... etc ... }
}