php - 使用 trait 的类不能覆盖 trait 的静态属性
问题描述
鉴于我的静态属性在我的特质和班级上都是相同的,因此该错误似乎已消失。
trait Sluggable
{
protected static $column = 'slug';
}
class Product
{
use Sluggable;
protected static $column = 'code';
}
PHP 致命错误:Product 和 Sluggable 在 Product 的组合中定义了相同的属性($column)。但是,定义不同,被认为是不相容的。班级组成。
我在这两种情况下都尝试过(但失败了):
- 改用
public
修饰符 - 在 PHP 7.2 和 8.0 上
- 有或没有属性类型提示
我不能使用常规类(因为我的目标类“产品”实际上扩展了另一个类)。
任何人都有线索吗?
解决方案
来自文档:
如果一个 trait 定义了一个属性,那么一个类不能定义一个具有相同名称的属性,除非它是兼容的(相同的可见性和 初始值),否则会发出致命错误。
一个简单的解决方案是覆盖类的构造函数中的值,但在您的情况下,有一个静态属性,因此您不能这样做。
您必须更改方法并使用具有更大灵活性的方法,并且可以在特征中将它们声明为抽象。
trait AbstractSluggable {
abstract protected static function getColumn();
}
class Product
{
use AbstractSluggable;
protected static function getColumn() {
return 'code';
}
public static function demo() {
return self::getColumn();
}
}
echo Product::demo();
或者,如果由于某些原因您必须按原样放置 Sluggable 特征,则可以创建另一个特征并告诉类将其与insteadof
trait Sluggable
{
protected static function getColumn() {
return 'slug';
}
}
trait AbstractSluggable {
abstract protected static function getColumn();
}
class Product
{
use Sluggable,AbstractSluggable {
AbstractSluggable::getColumn insteadof Sluggable;
}
protected static function getColumn() {
return 'code';
}
public static function demo() {
return self::getColumn();
}
}
echo Product::demo();
推荐阅读
- visual-studio - VS-Code 无法捕获 firebase 身份验证异常 (Flutter)
- angular - 功能组件中实现的服务-httpclient返回可观察表时出错
- javascript - 如何在 d3 上标记力导向图?
- c# - C# - 如何在不改变 DateTime 格式的情况下改变文化
- html - CSS - 在不改变 HTML 的情况下将图像对齐到右上角和左上角
- javascript - 运行在此变量/对象上的 JQuery 包含
- swift - 如何从 Firebase 检索字典?(Xcode 10,斯威夫特)
- javascript - 如何将选中和未选中的复选框数据添加到 Firebase
- math - Domino 布局 - 重叠框
- java - Nosuchmethoderror:org.glassfish.jersey.internal.l10n.LocalizableMessageFactory