Я использую Laravel 5.1, но это не относится к этой структуре, это скорее общий вопрос PHP.
Существует родительский класс с указанными признаками:
namespace Illuminate\Foundation\Auth; use Illuminate\Auth\Authenticatable; use Illuminate\Database\Eloquent\Model; use Illuminate\Auth\Passwords\CanResetPassword; use Illuminate\Foundation\Auth\Access\Authorizable; use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract; use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract; use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract; class User extends Model implements AuthenticatableContract, AuthorizableContract, CanResetPasswordContract { use Authenticatable, Authorizable, CanResetPassword; }
Тогда у меня есть класс User, о котором я хочу сказать,
namespace App\Api\V1\Models; use Illuminate\Foundation\Auth\User as Authenticatable; use Zizaco\Entrust\Traits\EntrustUserTrait; class User extends Authenticatable { use EntrustUserTrait { EntrustUserTrait::can insteadof \Illuminate\Foundation\Auth\Access\Authorizable; } }
EntrustUserTrait
имеет метод can()
который конфликтует с EntrustUserTrait
Authorizable
. Однако свойство Authorizable
принадлежит родительскому классу, поэтому это порождает ошибку. Required Trait wasn't added to App\Api\V1\Models\User
.
Я обыскал вокруг, и есть много информации об переопределении признаков, объявленных в дочернем классе, но я не могу найти ничего о переопределении признаков из родительского класса.
Рассмотрим следующий код:
<?php trait AA { function f() { echo "I'm AA::f".PHP_EOL; } } class A { use AA; } trait BB { function f() { echo "I'm BB::f".PHP_EOL; } } class B extends A { use BB; } $b = new B(); $b->f();
Я BB :: f
Я считаю, что черты работают как код для копирования. Код признака обрабатывается как «скопированный» код в классе, в котором он используется, поэтому вы можете притворяться, что этот признак на самом деле не унаследован, но его код является частью родительского класса.