PHP覆盖父类特征的特征方法

标签 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;
}

然后我有我关心的 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

我四处搜索,有很多关于覆盖子类中声明的特征的信息,但我似乎找不到任何关于覆盖父类中的特征的信息。

最佳答案

考虑以下代码:

<?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();

I'm BB::f

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

关于PHP覆盖父类特征的特征方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36431292/

相关文章:

php - mySQL SELECT 同一查询中的两行或多行

带有索引和键的 php array_push

php - 如何填充下拉菜单

javascript - 如何使用 PHP json_encode 输出 JSON 解析兼容的 json? JSON.parse - 由于单转义双引号导致意外的标记 h

php - 内部数组的 array_unique

c# - 不确定如何将 C# 加密函数移植到 PHP

用于日期时间选择器的 C# HttpWebRequest

PHP - 在 MVC View 层(Laravel Blade)中使用数据库

具有多个参数的php mysql查询并获得每个结果

php - 使用 PHP PDO 扩展删除 MySQL 数据库中的多行