多继承是通过使用性状来实现的,但是参数的类型是不能限制的.例如,下面的示例
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已经继承了一个类,而不能继承另一个类。如何实现多重继承和限制类型?
我有个主意。我想知道它能否实现。也就是说,编写一个专门为处理特征类型异常而设计的模块,然后在我的项目开始时将该模块全局包含在内。该模块的逻辑大致如下:
must be of type T, C given中的关键字T和C;use T,如果找到,忽略异常并继续执行代码,否则,抛出异常。我们可以使用set_exception_handler('exception _ handler')来捕获异常。问题是如何忽略此异常并确保程序继续执行?
发布于 2022-07-30 05:46:43
特性不是类,我们只是使用它们在多个类中重用一些代码。您可以创建一个接口,并将其作为方法中的常见类型使用。
发布于 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中的一个方法。
https://stackoverflow.com/questions/73172902
复制相似问题