Наличие черты в нескольких классах

Возможно, я не понимаю всей системы признаков, поэтому я решил спросить StackOverFlow.

Я сделал свою первую черту...

<?php
trait MY_Stat
{   
  var $dex;
  var $int;
  var $str;
}
?>

Мне никак не удается заставить его работать с моим классом (в другом файле)....

class MY_Mobile
{
  use MY_Stat;

  public function __construct($params = NULL)
  {     
    var_dump($this);
  }
}

Я всегда бью эту стену:

Fatal error: Trait 'MY_Trait' not found in ...\wamp\www\game\application\libraries\MY_Mobile.php

Я хотел бы иметь эту черту во многих классах, а именно в мобильных телефонах, предметах и ​​т. Д. Должен ли я иметь определение черты в том же файле, что и класс?

Кстати, если вы используете codeigniter, как вам удалось его загрузить, вы устанавливаете свои черты во вспомогательный файл, файл библиотеки...?


person SantaClauss    schedule 24.03.2014    source источник
comment
Вы уверены, что оба файла находятся в одном пространстве имен?   -  person code-jaff    schedule 24.03.2014
comment
Codeignter не поддерживает загрузку трейтов, как для классов. Я думаю, вам нужно вручную включить их. @code-jaff Я не думаю, что у него есть проблемы с пространством имен.   -  person Rahil Wazir    schedule 24.03.2014
comment
@RahilWazir Конечно, да, но это не только для CI. Но классовые пространства имён влияют на трейты. Если класс и трейты не используют одно и то же пространство имен, трейт должен быть включен с полным пространством имен.   -  person code-jaff    schedule 24.03.2014
comment
Но глобальное пространство имен по умолчанию \ не влияет на трейты. И вы должны знать, что CI также не поддерживает пространство имен.   -  person Rahil Wazir    schedule 24.03.2014
comment
@RahilWazir Я бы хотел включить их, но я думаю, что мне этого не хватает. Я пытался загрузить их в качестве помощника из автозагрузки, не совсем получилось. Как я мог включить их из класса, чтобы каждый раз, когда я ссылаюсь на свою библиотеку, загружались черты. Разве $this->load->helper/view/library не эквивалентно включению ?   -  person SantaClauss    schedule 24.03.2014


Ответы (2)


Ну, вы можете решить эту проблему, выполнив что-то вроде этого:

Путь:

приложение/помощники/ваш-признак-class.php

Содержание:

<?php
if (!trait_exists('MY_Stat')) {
    trait MY_Stat
    {
        public $dex;
        public $int;
        public $str;
    }
}

В вашей библиотеке просто включите класс признаков (как я уже сказал) вручную. После строки !defined('BASEPATH');.

Ваша библиотека:

include APPPATH . 'helpers/your-trait-class.php';

class YourLibrary {
    use MY_Stat;

и используйте свойства трейт-класса в ваших библиотечных методах, например:

$this->dex = 0.1;
$this->int = 1;
$this->str = 'Hello';
person Rahil Wazir    schedule 24.03.2014

Другая альтернатива, которая работает для меня... где model_base находится в папке модели

@include_once ('model_base.php');  
class device_token extends CI_Model {

        // PHP 5.4 Traits
        use model_base;
person 300baud    schedule 18.01.2015