我使用Laravel 5.1,但這不是特定於該框架,它更多的是一般的PHP問題。PHP重寫父類的trait特性方法
有指定用性狀的父類:
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()
方法與衝突Authorizable
特質。但是,Authorizable
特徵位於父類中,因此會引發錯誤Required Trait wasn't added to App\Api\V1\Models\User
。
我周圍搜索了很多關於在子類中聲明的重寫特徵的信息,但我似乎無法從父類中找到任何有關重寫特徵的信息。
根本不需要做任何改變。 'can'會覆蓋父母的'can'。 – apokryfos
除了沒有,它會拋出關於不應用特徵的錯誤,因爲它與另一個特徵發生衝突。不過,我認爲這是一些邊緣情況,因爲下面的例子確實有效並且覆蓋了其他特徵。雖然我不確定它們有什麼不同。 – jdforsythe