PHP覆盖父类的特征

时间:2016-04-05 15:52:28

标签: php

我使用的是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;
}

然后我有用户类我关注从那里扩展:

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的{​​{1}}方法与can()特征冲突。但是,Authorizable特征在父类上,因此会引发错误Authorizable

我已经在周围搜索了很多关于在子类中宣布的重写特征的信息,但我似乎无法找到关于来自父类的重写特征的任何信息。

1 个答案:

答案 0 :(得分:5)

请考虑以下代码:

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

我认为特征的工作方式就像复制粘贴代码一样。特性代码被视为它所使用的类中的“复制粘贴”代码,因此您可以假装该特征不是真正继承的,但它的代码只是父类的一部分。