首页 > 解决方案 > 使用 trait 的类不能覆盖 trait 的静态属性

问题描述

鉴于我的静态属性在我的特质和班级上都是相同的,因此该错误似乎已消失。

trait Sluggable
{
  protected static $column = 'slug'; 
}

class Product
{
  use Sluggable;

  protected static $column = 'code';
}

PHP 致命错误:Product 和 Sluggable 在 Product 的组合中定义了相同的属性($column)。但是,定义不同,被认为是不相容的。班级组成。

我在这两种情况下都尝试过(但失败了):

我不能使用常规类(因为我的目标类“产品”实际上扩展了另一个类)。

任何人都有线索吗?

标签: php

解决方案


来自文档

如果一个 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();

推荐阅读