Класс PHP, использующий то же имя, что и функция черты

У меня есть следующий код в качестве образца.

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?
}
}

Я мог бы указать все детали, почему это необходимо, но я хочу, чтобы этот вопрос был простым. Расширение от класса клиента не является ответом здесь из-за моей конкретной ситуации.

Возможно ли, чтобы у признака было то же имя функции, что и у класса, использующего его, но вызывали функцию признака в дополнение к функции классов?

В настоящее время он будет использовать только функцию классов (так как кажется, что он переопределяет черты)

4

Решение

Вы можете сделать это следующим образом:

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
8

Другие решения

Да, Вы можете сделать это так же, вы можете использовать несколько функций 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";
}
}
1

По вопросам рекламы [email protected]