2013-03-01 2 views
4

Как это делают классы?Использование черт над классами, почему?

Class Main 
{ 
    $this->a = new A(); 
    $this->b = new B(); 
    $this->c = new C(); 

    $this->b->doTranslate($this->a->saySomething()); 
} 

И как это сделать, не так ли?

Class Main { 
    use A; 
    use B; 
    use C; 

    $this->doTranslate($this->saySomething()); 
} 

У меня нет много знаний о черт на всех, но, посмотрев на новых примерах PHP 5.4 признака, они, кажется, только помочь в одном случае. A class only be extended once to use $this together, but we can use multiple traits.

Вопрос 1: Это единственное преимущество использования черт над базовыми классами?

Вопрос 2: Если trait A, B, and C все есть функция с именем example(), когда я пытаюсь $this->example(); как PHP собирается определить, какие черты будут использоваться? Что должно случиться?

Кроме того, вместо написания стены текста; просто представьте мне пример короткого кода с кратким сообщением, который я могу посмотреть и взять на себя. Я не знаком с чертами и не знаю, что они на самом деле.

+2

Я не верю, что черты сопоставимы с классами. Я думаю, что черты сходны с интерфейсами, как указано здесь http://stackoverflow.com/questions/9495408/what-are-possible-use-scenarios-for-traits-in-php – user1477388

+1

Черты являются многократно используемыми фрагментами кода, которые могут быть смешивается с классами, не требуя, чтобы класс «расширил» некоторый другой класс. Это может быть полезно для уменьшения дублирования кода в независимых, но похожих классах. – deceze

ответ

4

Вы можете делать много вещей с чертами. Я использовал его в своих рамках, например, как Singleton и Getter/Setter.

trait Singleton 
{ 
    protected static $_instance; 

    protected function __construct(){} 

    public static function getInstance() 
    { 
     if (null === self::$_instance) { 
      self::$_instance = new static(); 
     } 
     return self::$_instance; 
    } 
} 

Еще одно интересное использование для аспектно-ориентированного программирования. Ответ был бы длинным, чтобы объяснить. Посмотрите here и here.

Вопрос 2: Если черты имеют тот же метод, что и фатальная ошибка. Вы должны использовать оператор insteadof для разрешения конфликтов. Look here

+0

Q1: Разве мы не можем сделать то же самое с классом (на самом деле просто переименование признака в класс в вашем примере), а затем ввести его в другой класс? Это будет работать и до 5.4. Можете ли вы показать мне пример, когда использование класса не может сделать что-то, что может сделать свойство? Q2: достаточно ясно. –

+0

да это правда .. но, как вы сказали в PHP, вы можете расширить только класс ONE. Итак, с чертами вы можете сделать парадигму «не повторяйте себя». – bitWorking

+0

Не только это недальновидное кодирование (и довольно плохая мотивация для чего угодно), это также не всегда возможно таким образом. Как описано, например, здесь: http://stackoverflow.com/questions/7104957/building-a-singleton-trait-with-php-5-4 – hakre

Смежные вопросы