如何在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类中扩展静态继承数组的主要内容,如果未能解决你的问题,请参考以下文章