NSDictionary с заказанными ключами

Неустранимая ошибка: использование $ this, если не в контексте объекта

$this - специальная переменная в PHP , которая не может быть назначена. Если он доступен в контексте, где он не существует, эта фатальная ошибка указывается.

Эта ошибка может возникнуть:

  1. Если нестатический метод называется статическим , Пример:
    class Foo {
       protected $var;
       public function __construct($var) {
           $this->var = $var;
       }
    
       public static function bar () {
           // ^^^^^^
           echo $this->var;
           //   ^^^^^
       }
    }
    
    Foo::bar();
    
    Как исправить: снова просмотрите свой код, $this может использоваться только в контексте объекта и никогда не должен использоваться в статическом методе. Кроме того, статический метод не должен обращаться к нестатистическому свойству. Используйте self::$static_property для доступа к статическому свойству.
  2. Если код из метода класса был скопирован в нормальную функцию или только глобальную область и , сохраняя специальную функцию $this переменная. Как исправить: Просмотрите код и замените $this на другую переменную замещения.

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

  1. Вызов нестатический метод как статический: PHP Неустранимая ошибка: использование $ this, если не в объектном контексте
  2. Копировать код: Неустранимая ошибка: использование $ this, если не в объекте context
  3. Все «Использование $ this, если не в контексте объекта» Вопросы по Stackoverflow

78
задан Cœur 31 December 2018 в 18:46
поделиться

3 ответа

Решение наличия связанного NSMutableArray ключей не так плохо. Это старается не разделять NSDictionary на подклассы, и если Вы осторожны с записью средств доступа, не должно быть слишком трудно сохранить синхронизируемым.

23
ответ дан Abizern 24 November 2019 в 10:40
поделиться

Если Вы собираетесь разделить NSDictionary на подклассы, необходимо реализовать эти методы как минимум:

  • NSDictionary
    • -count
    • -objectForKey:
    • -keyEnumerator
  • NSMutableDictionary
    • -removeObjectForKey:
    • -setObject:forKey:
  • NSCopying/NSMutableCopying
    • -copyWithZone:
    • [1 16]
  • NSCoding
    • -encodeWithCoder:
    • -initWithCoder:
  • NSFastEnumeration (для Leopard)
    • -countByEnumeratingWithState:objects:count:

самый легкий способ сделать, что Вы хотите, состоит в том, чтобы сделать подкласс NSMutableDictionary, который содержит собственный NSMutableDictionary it, которым это управляет и NSMutableArray для хранения упорядоченного множества ключей.

, Если Вы никогда не собираетесь кодировать свои объекты, Вы могли мыслимый пропуск, реализовывая -encodeWithCoder: и -initWithCoder:

, Все Ваши реализации метода в этих 10 методах выше тогда или пойдут непосредственно через Ваш размещенный словарь или Ваш заказанный ключевой массив.

7
ответ дан Ashley Clark 24 November 2019 в 10:40
поделиться

Быстро и грязно:

Если вам нужно заказать свой словарь (в данном случае «myDict»), сделайте следующее:

     NSArray *ordering = [NSArray arrayWithObjects: @"Thing",@"OtherThing",@"Last Thing",nil];

Затем, когда вам нужно заказать свой словарь, создайте индекс:

    NSEnumerator *sectEnum = [ordering objectEnumerator];
    NSMutableArray *index = [[NSMutableArray alloc] init];
        id sKey;
        while((sKey = [sectEnum nextObject])) {
            if ([myDict objectForKey:sKey] != nil ) {
                [index addObject:sKey];
            }
        }

Теперь объект индекса * будет содержать соответствующие ключи в правильном порядке. Обратите внимание, что это решение не требует наличия всех ключей, что является обычной ситуацией, с которой мы имеем дело ...

3
ответ дан 24 November 2019 в 10:40
поделиться