php - PHP 类中子项之间的静态属性共享/定义
问题描述
我对标题描述的内容存在误解,我想知道是否有另一种方法可以实现我在那里寻找的东西。我有一个抽象类,它声明了一个没有值的静态属性,并且我从中实例化了定义该静态属性值的子类。基类还根据第一个定义了另一个静态属性值,但问题是子类丢失了其他子类中定义的最后一个属性值的第一个属性值,然后第二个属性从父类中获取了错误的值。
这段代码比我解释的更好:
abstract class A
{
protected static $name;
protected static $path;
public function __construct()
{
static::$path = static::$name."Path";
}
public function getPath()
{
return static::$path;
}
}
class B extends A
{
protected static $name = "B";
}
class C extends A
{
protected static $name = "C";
}
$b = new B();
$c = new C();
echo $b->getPath();
我希望 echo 打印“Bpath”,但不幸的是它打印了“CPath”。如果我评论实例化 C 类的行,那么打印效果很好。
编辑: 问题是如果我执行此代码:
abstract class A
{
protected static $name;
protected static $path;
public function __construct()
{
static::$path = static::$name."Path";
}
public function getPath()
{
return static::$path;
}
public function getName()
{
return static::$name;
}
}
class B extends A
{
protected static $name = "B";
}
class C extends A
{
protected static $name = "C";
}
$b = new B();
$c = new C();
echo $b->getName();
印刷的名字是“B”,很好。因此,在子类属性中重新定义值的事实与在构造函数中执行它的结果不同,即使使用 static:: 关键字。
解决方案
静态属性$path
只在 class 上定义一次A
。任何地方的设置static::$path
都将始终设置A::$path
,因此该值在所有类之间共享。
如果您protected static $path;
在两个子类上声明,您会看到不同的结果,例如:
class B extends A {
protected static $name = "B";
protected static $path;
}
现在每个类都有自己的静态$path
属性,它们可以独立设置。
使用实例属性会更有意义,而不是使用静态属性向后弯曲:
abstract class A {
protected static $name;
protected $path;
public function __construct() {
$this->path = static::$name . 'Path';
}
public function getPath() {
return $this->path;
}
}
推荐阅读
- python - Python Pandas GroupBy Max Date
- r - R data.table 使用 binom.test 快速添加
- apache-spark - Log4j 生成的日志不会被 Yarn 删除
- linux - 在 Linux 驱动程序中执行引导 ROM 功能
- python - 如何使用 Python Selenium 将数据从脚本元素 (HTML) 抓取到 CSV
- python-3.x - 如何使用python在selenium的h3标签类中提取文本?
- nginx - NGINX如何将域名解析为IP地址
- python-3.x - 如何对文件中行中数字的所有值求和
- java - 什么是 Java 中的未经检查的调用?
- xamarin.forms - Xamarin.Forms Shell - 冷启动应用程序打开