【问题标题】:static property sharing/defining between children in PHP classesPHP 类中子项之间的静态属性共享/定义
【发布时间】:2020-06-08 08:08:52
【问题描述】:

我对标题所描述的内容存在误解,我想知道是否有另一种方法可以实现我在那里寻找的东西。 我有一个抽象类,它声明了一个没有值的静态属性,并从中实例化了定义该静态属性值的子类。基类还定义了另一个静态属性值,具体取决于第一个,但问题是子类丢失了其他子类中定义的最后一个属性值的第一个属性值,然后第二个属性从父类获取错误值。

这段代码比我解释的更好:

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:: 关键字也是如此。

【问题讨论】:

  • 因为属性是静态的
  • 您可能希望设置$this->path = static::$name . 'Path' 来设置实例属性,而不是覆盖共享静态属性。
  • 当您使用实例时,为什么要使用静态变量?
  • 所以直接在子类中重新定义属性值与在构造函数中的效果不一样,根据this(=>编辑后的帖子)
  • @MarkusZeller 第一次可以从任何地方访问它,而它们是公开的并且不受保护

标签: php oop static


【解决方案1】:

静态属性$path 仅在类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;   
    }
}

【讨论】:

    猜你喜欢
    • 2015-11-03
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 2013-07-12
    • 2018-03-11
    • 1970-01-01
    相关资源
    最近更新 更多