У меня есть следующий код в качестве образца.
trait sampletrait{
function hello(){
echo "hello from trait";
}
}
class client{
use sampletrait;
function hello(){
echo "hello from class";
//From within here, how do I call traits hello() function also?
}
}
Я мог бы указать все детали, почему это необходимо, но я хочу, чтобы этот вопрос был простым. Расширение от класса клиента не является ответом здесь из-за моей конкретной ситуации.
Возможно ли, чтобы у признака было то же имя функции, что и у класса, использующего его, но вызывали функцию признака в дополнение к функции классов?
В настоящее время он будет использовать только функцию классов (так как кажется, что он переопределяет черты)
Вы можете сделать это следующим образом:
class client{
use sampletrait {
hello as protected sampletrait_hello;
}
function hello(){
$this->sampletrait_hello();
echo "hello from class";
}
}
Редактировать :
Ой, забыл $ this-> (спасибо JasonBoss)
Изменить 2:
Только что провёл исследование по «переименованию» функций черты.
Если вы переименовываете функцию, но не перезаписываете другую (см. Пример), обе функции будут существовать (php 7.1.4):
trait T{
public function f(){
echo "T";
}
}
class C{
use T {
f as public f2;
}
}
$c = new C();
$c->f();
$c->f2();
Вы можете только изменить видимость:
trait T{
public function f(){
echo "T";
}
}
class C{
use T {
f as protected;
}
}
$c->f();// Won't work
Да, Вы можете сделать это так же, вы можете использовать несколько функций trait
как это.
Попробуйте этот фрагмент кода здесь
<?php
ini_set('display_errors', 1);
trait sampletrait
{
function hello()
{
echo "hello from trait";
}
}
class client
{
use sampletrait
{
sampletrait::hello as trait_hello;//alias method
}
function hello()
{
$this->trait_hello();
echo "hello from class";
}
}