У меня есть этот класс признаков:
trait Example { protected $var; private static function printSomething() { print $var; } private static function doSomething() { // do something with $var } }
И этот класс:
class NormalClass { use Example; public function otherFunction() { $this->setVar($string); } public function setVar($string) { $this->var = $string; } }
Но я получаю эту ошибку: Fatal error: Using $this when not in object context
.
Как я могу решить эту проблему? Я не могу использовать свойства в классе признаков? Или это не очень хорошая практика?
Ваша проблема связана с различиями между методами / свойствами класса и объектами.
- Если вы определяете свойство как статичное, вы должны получить его через свой класс, например classname / self / parent :: $ propertie.
- Если не статичный – то внутри статического свойства, как $ this-> propertytie. Итак, вы можете посмотреть мой код:
trait Example { protected static $var; protected $var2; private static function printSomething() { print self::$var; } private function doSomething() { print $this->var2; } } class NormalClass { use Example; public function otherFunction() { self::printSomething(); $this->doSomething(); } public function setVar($string, $string2) { self::$var = $string; $this->var2 = $string2; } } $obj = new NormalClass(); $obj -> setVar('first', 'second'); $obj -> otherFunction();
Статическая функция printSomething не может получить доступ к не статическому правилу $ var! Вы должны определить их как не статические, так и статические.