Использование $ this, когда не в контексте объекта

#php

#php

Вопрос:

может быть, это раннее утро, или я полностью слеп, но почему я получаю «Фатальную ошибку: Использование $ this, когда не в контексте объекта» в следующем коде. Там нет ничего статичного.

Класс:

 <?php

class Property
{

    /**
     * @var string[]
     */
    private $values;

    public function __contruct($file)
    {
        $this->values = parse_ini_file($file, false);
    }

    /**
     * @return string
     */
    public function get($key, $default = null)
    {
        if (key_exists($key, $this->values)) { //<-- error
            return $this->values[$key];
        }
        return $default;
    }
}
  

Тест:

 <?php

class PropertyTest extends Test
{

    public function testGet()
    {
        $prop = new Property($this->getResource('test.properties'));
        $this->assertEquals('foo', $prop->get('test.entry', 'xyz')); 
        $this->assertEquals('bar', $prop->get('test.entry2', 'xyz'));
        $this->assertEquals('xyz', $prop->get('test.entry3', 'xyz'));
        $this->assertEquals(null, $prop->get('test.entry3'));
    }
}
  

Редактировать

Комментарии к ошибке указывают на трассировку. Ошибка возникает при запуске PropertyTest-> testGet() в первом $prop-> get(), вызванном первой строкой метода Property-> get().

Решение

Помимо найденной опечатки xdazz и устаревания, на которое указал Фил, пользователь985935 был прав. 🙂

Короче говоря, мой загрузчик классов использовал статический get, а ошибка PHPUnit вводит в заблуждение мои исследования и мою информацию, которую я предлагаю вам для поиска моей проблемы. Извините.

Комментарии:

1. Разве это не должно быть array_key_exists() ?

2. Просто тестирование, кажется, что key_exists() это допустимая функция, по крайней мере, в 5.3.6. Кроме того, не удается воспроизвести эту ошибку

3. Что говорится в полном сообщении об ошибке, включая ссылки на файлы и строки?

4. @Phil Для обратной совместимости может использоваться следующий устаревший псевдоним: key_exists()

5. Я добавил объяснение к своим ссылкам на строки. Это очень странно, поскольку конструктор работает, а $prop-> get() определенно не является статичным.

Ответ №1:

В вашем коде опечатка.

 public function __contruct($file)
  

который должен быть

 public function __construct($file)
  

Комментарии:

1. Спасибо. В настоящее время я нахожусь на работе и не могу повторно протестировать его, но представляется весьма вероятным, что это может вызвать проблему. Так что это было действительно ранним утром 😉

Ответ №2:

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

Ключевое слово $ this указывает на методы, которые находятся только внутри объекта, вы не можете использовать $ this вне объекта, я думаю, это и есть причина вашей проблемы

Комментарии:

1. Это ошибка: ‘Неустранимая ошибка: использование $ this, когда не в контексте объекта’ итак, как бы вы проанализировали возвращенную ошибку тогда?

2. @BoltClock если бы вы проанализировали ошибку, а не просто основывали ее на коде, который пользователь разместил здесь, то есть на мысли о проблеме, мы можем не видеть ее непосредственно в том, что было опубликовано, но это может происходить где-то еще в приложении, я уже сталкивался с той же проблемой в нескольких своих разработках, и я сталкивался с этой ошибкой уже много раз. 😉

3. @daGrevis это просто вопрос того, как мы должны уметь анализировать вещи. хехехе. 😉