我使用的是 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;
}
}
The EntrustUserTrait
has a can()
与方法相冲突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
我相信特征就像复制粘贴代码一样工作。特征代码在其所使用的类中被视为“复制粘贴”代码,因此您可以假装该特征并未真正继承,但它的代码只是父类的一部分。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)