首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在利用特征实现多重继承时,如何键入提示特征?

在利用特征实现多重继承时,如何键入提示特征?
EN

Stack Overflow用户
提问于 2022-07-30 04:39:09
回答 2查看 164关注 0票数 3

多继承是通过使用性状来实现的,但是参数的类型是不能限制的.例如,下面的示例

代码语言:javascript
复制
trait T{
    function t(){
        echo 'trait';
    }
    // Omit many other codes
}

class B{ } // Assume that B is a third-party module

class C extends B{ // Assume that C must inherit the module B
    use T;
}

// Some functions in some classes in the following client code may need to use several methods in T, like the following.
function f(T $t){ // Type-hinting for the trait T, but there is a problem
    $t->t();
}

f(new C);

沙箱测试发现一个错误 Fatal error: Uncaught TypeError: f(): Argument #1 ($t) must be of type T, C given

如果将f(T $t)更改为f(C $t)f($t),就可以了,但这不是我想要的。如果将该特性更改为接口,它将无法工作,因为不能在接口中写入函数体。如果将特征更改为类,它将无法工作,因为C已经继承了一个类,而不能继承另一个类。如何实现多重继承和限制类型?

我有个主意。我想知道它能否实现。也就是说,编写一个专门为处理特征类型异常而设计的模块,然后在我的项目开始时将该模块全局包含在内。该模块的逻辑大致如下:

  1. 匹配异常消息must be of type T, C given中的关键字T和C;
  2. 使用ReflectionClass获取C的代码块;
  3. 在C代码块中搜索关键字use T,如果找到,忽略异常并继续执行代码,否则,抛出异常。

我们可以使用set_exception_handler('exception _ handler')来捕获异常。问题是如何忽略此异常并确保程序继续执行?

EN

回答 2

Stack Overflow用户

发布于 2022-07-30 05:46:43

特性不是类,我们只是使用它们在多个类中重用一些代码。您可以创建一个接口,并将其作为方法中的常见类型使用。

票数 0
EN

Stack Overflow用户

发布于 2022-07-30 06:15:15

PHP不支持多重继承,因此它使用特性和接口来克服这个限制。PHP并不将一个特性作为一个类(正如您所经历的那样)。

我相信你是在强迫PHP去做一些它根本做不到的事情。当功能的代码不属于父类或接口时,特性被用作“载体”或独立的包,以增强、扩展和注入一些功能到类中。

例如,我创建了数据库访问特性,以赋予特定类读写数据的能力,一旦我将口香糖功能封装到一个特性中,一些类就可以进行API调用了。

你可以争论这些是否是好例子,或者这些具体的例子是否应该是特征(我可能会同意)。但关键是,特征通常用于添加不应该出现在父类中的内容。在我的例子中,我选择将它们作为特性添加,因为当大多数子类不使用这些方法时,添加到父类中的代码似乎太多了,而且多个类需要访问该功能。

在你的情况下

function f(T $t){ $t->t(); }

会是,

function f(C $c){ $c->t(); }

因为C正在使用T,而t()是T中的一个方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73172902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档