2016-10-12 2 views
1

Раньше у меня было несколько классов библиотек с теми же методами. Понял, что я узнаю немного больше о двух важных аспектах кодирования; Черты и сухие.PHP traits - не может использовать метод, определенный в признаке

У меня есть следующая особенность:

<?php 

namespace App\Berry; 

trait Lib 
{ 
    public function getIDs() 
    { 
     $oClass = new \ReflectionClass(get_called_class()); 
     $aConstants = $oClass->getConstants(); 
     foreach($aConstants as $sKey => $mValue) 
     { 
      if(!is_int($mValue)) 
      { 
       unset($aConstants[$sKey]); 
      } 
     } 
     return array_values($aConstants); 
    } 
} 

Следующий класс:

namespace App\Berry; 

use Lib; 

class postType 
{ 
    const POST_TYPE_BLOG_ID  = 1; 
    const POST_TYPE_BLOG_LABEL = __('blog', 'lib'); 

    const POST_TYPE_PAGE_ID  = 2; 
    const POST_TYPE_PAGE_LABEL = __('page', 'lib'); 

    const POST_TYPE_NEWS_ID  = 3; 
    const POST_TYPE_NEWS_LABEL = __('news', 'lib'); 
} 

И зову его, как это в моем PicturesController классе:

$cPostTypesLibrary = new postType(); 
$this->set('aPostTypes', $cPostTypesLibrary->getIDs()); 

Теперь мне, это кажется почти таким же, как сказать мне в примере docs (об использовании множественные черты)

Единственная разница у меня есть у меня есть use вне моего класса из-за получения cannot use class because it is not a trait

Что я здесь отсутствует?

ответ

2

Вашего класс не использует признак, вы вместо того, чтобы с помощью other использования use ключевого слова и пытаетесь импортировать Lib класс из одно и то же пространство имен в одно и то же пространство имен.

Чтобы правильно использовать черты, вернитесь к documentation и посмотрите, где они расположены. Оператор use помещается внутри определения класса. В вашем случае, это будет выглядеть следующим образом:

namespace App\Berry; 

class postType 
{ 
    use Lib; 
    // ... 
} 
+0

Хорошо так, глядя на вопрос, который я связан в моем посте я угадывание 'use' идет в определение класса, когда класс не в том же пространстве имен? –

+0

Нет, вы помещаете его в определение класса, когда оно является _trait_, и вы хотите, чтобы этот класс использовал этот признак. Вы указываете _outside_, когда хотите использовать этот _class_ внутри своего, но вы не хотите вводить полное пространство имен класса каждый раз, когда хотите его ссылаться. –

+0

Хорошо, спасибо! Теперь я понимаю. –

2

Вы должны объявить черту внутри классу

class postType 
{ 
    use Lib; 
} 
Смежные вопросы