Почему черта не переопределяет метод в классе?

Интересно, работает ли мой php-интерпретатор правильно или я неправильно понимаю черты. Вот мой кусок кода:

<?php

trait ExampleTrait{
public function foo()
{
echo 'y';
}
}

class ExampleClass
{
use ExampleTrait;

public function foo()
{
echo 'x';
}
}

$exCl = new ExampleClass();

$exCl->foo();

Я предполагаю, что это должно показать «у», но вместо этого оно показывает «х». Зачем?

1

Решение

Прочитайте это внимательно Черта документации Я рекомендую опробовать каждый пример и внести свои изменения, чтобы убедиться, что вы его понимаете. Вот мой пример, надеюсь, это поможет:

<?php
class A {
public function foo() {
echo "x";
}
}

class B extends A {}

$test = new B();
$test->foo();

// result X

Это довольно ясно, я думаю, так что теперь давайте используем черту:

<?php
class A {
public function foo() {
echo "x";
}
}

trait T {
public function foo() {
echo "y";
}
}

class B extends A {
use T;
}

$test = new B();
$test->foo();

// result y

Как видите, метод Trait перезаписывает метод базового класса. А теперь давайте создадим метод foo в классе B

<?php
class A {
public function foo() {
echo "x";
}
}

trait T {
public function foo() {
echo "y";
}
}

class B extends A {
use T;
public function foo() {
echo "z";
}
}

$test = new B();
$test->foo();

// result z

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

4

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

Других решений пока нет …

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