如何在PHP类中扩展静态继承数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在PHP类中扩展静态继承数组相关的知识,希望对你有一定的参考价值。

假设我有一个静态数组,我想在子类中添加更多值。由于php没有静态构造函数,我真的不知道如何以干净的方式实现这一点(我绝对不希望在类定义下添加任何内容而无法更改自动加载器)

这是我想要实现的(显然不起作用)

class Parent{
    public static $meta = [1,2,3];
}

class Child extends Parent{
    public static $meta = array_merge(parent::$meta,[4,5]);

}
答案

您正在重新定义子类中的属性,这是不推荐的。你可以检查here替代品

此外,父类不是类的允许名称。解决方案是实现返回属性的静态方法。像这样

class ParentClass{
    public static $meta = [1,2,3];

    public static function getMeta() {
        return self::$meta;
    }
}

class Child extends ParentClass{
    public static function getMeta() {
        return array_merge(parent::getMeta(),[4,5]);
    }
}

var_dump(Child::getMeta());

结果是

array(5) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
}

你可以在这里查看:https://3v4l.org/v8Mtm

希望这有帮助。

另一答案

你想要的内容中的vars是不可能的。相反,我建议通过getter方法为var提供acccess。除此之外,我建议保护静态var,以防止从外部进行不必要的访问。

使用后期静态绑定,您可以在父类中提供静态函数,该函数将自己的var与继承类中的变量合并。

class A {
    protected static $meta = [1,2,3];

    public static function getMeta() {
        if (__CLASS__ == static::class) {
            return self::$meta;
        }
        return array_merge(self::$meta, static::$meta);
    }
}

class B extends A {
    protected static $meta = [4,5];
}

var_dump(B::getMeta());

__CLASS__ == static::class的比较仅适用于此示例 - 如果您使用辅助数组并且只想添加新选项,您可以忽略它并使用简单的return self::$meta + static::$meta;

请记住,这仅适用于一级继承。如果在子类中需要一系列新的$ meta变量,那么您也要在子类中覆盖getMeta方法。

另一答案

我可以想象这样做的唯一方法(不使用构造函数或添加类定义)是使用如此的define consts;

/* FOO CLASS FILE */
define('FOO_META', [1, 2, 3]);

class Foo{
    public static $meta = FOO_META;
}

/* BAR CLASS FILE */
define('BAR_META', array_merge(FOO_META, [4, 5, 6]));

class Bar extends Foo{
    public static $meta = BAR_META;
}

echo 'Foo-Meta = ' . implode(', ', Foo::$meta) . '<br>';
echo 'Bar-Meta = ' . implode(', ', Bar::$meta) . '<br>';

类属性只能在类定义中指定const值。您将需要使用构造函数(或其他一些方法)动态执行此操作。如果您使用上述方法,我建议使用如下命名空间:

define('fooMETA', [1, 2, 3]);
define('barMETA', array_merge(fooMETA, [4, 5, 6]));

编辑:如果这些类只包含这一个属性,为什么不自己使用这些定义呢?它们本质上是相同的,没有额外的开销。

以上是关于如何在PHP类中扩展静态继承数组的主要内容,如果未能解决你的问题,请参考以下文章

PHP 后期静态绑定问题

如何访问在mapreduce中扩展reducer的静态内部类中的静态变量?

扩展方法

TypeScript:继承类中静态方法的自引用返回类型

php延迟静态绑定

记一次抽象类中定义的静态变量,多个子类继承后,在方法中被重写引起的问题