Как использовать черту PHP в другой черте без конфликта? - PullRequest
0 голосов
/ 02 октября 2018

Итак, в основном это код: в моей характеристике Приветствие я хочу использовать еще одну очень полезную характеристику Word.Но теперь, если класс использует Greeting, он больше не может использовать Word, хотя я использовал псевдоним.

Конечно, я могу использовать insteadof, но для кого-то, использующего мою библиотеку, не очевидно, откуда возникла ошибкаи какие черты вовлечены.Почему здесь конфликт и есть ли уловка синтаксиса, чтобы избежать использования вместо?Спасибо.

trait Word {
    public function hello()
    {
        return 'hello';
    }
}

trait Greeting {
    use Word {
        Word::hello as _word_hello;
    }
    public function greet($name)
    {
        return $this->_word_hello() . " $name";
    }
}

class Test {
    use Word;
    use Greeting;
}

PHP Fatal error:  Trait method hello has not been applied, because there are collisions with other trait methods on Test in traits.php on line 20

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Итак, после небольшого исследования я обнаружил, что оператор as для функций признаков создает псевдоним, но не переименовывает функцию.Таким образом, черта Greeting все еще создает функцию hello в классе, который ее использует.

Смежный вопрос: Почему переименование метода не работает в чертах PHP?

(Как личное замечание, я думаю, что это очень плохой дизайн).

0 голосов
/ 02 октября 2018

Word уже существует в Greeting, поэтому нет необходимости определять его снова в Test, и по этой причине вы получаете эту ошибку:

trait Word {
    public function hello()
    {
        return 'hello';
    }
}

trait Greeting {
    use Word {
        Word::hello as _word_hello;
    }
    public function greet($name)
    {
        return $this->_word_hello() . " $name";
    }
}

class Test {
    #use Word;
    use Greeting;
}
$test = new Test();
echo $test->greet("Ahmad");
...