Статические индексаторы?

Примечание: попытка получить свойство ошибки, отличной от объекта

Случается, когда вы пытаетесь получить доступ к объекту объекта, пока нет объекта.

Типичный пример для 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;

Связанные ошибки:

114
задан AustinWBryan 5 September 2018 в 21:44
поделиться

3 ответа

Нотация индексатора требует ссылки на 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"] нотация индексатора использования.

68
ответ дан AustinWBryan 24 November 2019 в 02:36
поделиться

Я полагаю, что это, как полагали, не было ужасно полезно. Я думаю, что это - позор также - пример, который я склонен использовать, Кодирует, где Encoding.GetEncoding("foo") мог быть Encoding["Foo"]. Я не думаю, что это подходило бы очень часто, но кроме чего-либо еще, что это просто чувствует себя немного непоследовательным, чтобы не быть доступным.

я должен был бы проверить, но я подозреваемый это уже доступно в IL (Промежуточный язык).

88
ответ дан Rohit416 24 November 2019 в 02:36
поделиться

Как обходное решение, можно определить индексатор экземпляра на одиночном элементе/статическом объекте (скажите, что ConfigurationManager является одиночным элементом, вместо того, чтобы быть статическим классом):

class ConfigurationManager
{
  //private constructor
  ConfigurationManager() {}
  //singleton instance
  public static ConfigurationManager singleton;
  //indexer
  object this[string name] { ... etc ... }
}
7
ответ дан ChrisW 24 November 2019 в 02:36
поделиться
Другие вопросы по тегам:

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