如果我不能决定应该使用哪个后代,这会闻到这种味道吗?

时间:2017-10-28 13:34:37

标签: php

abstract class X
{
    private $v;

    protected function setV($v)
    {
        $this->v = $v;
    }

    public function getV()
    {
        return $v;
    }
}

class A extends X
{
    public function doIt()
    {
        parent::setV(1);
    }
}

class B extends X
{
    public function doIt()
    {
        parent::setV(2);
    }
}

$a = new A();
$a->doIt();

$b = new A();
$b->doIt();

但如果我想使用getV(),我可以调用

$a->getV()$b->getV()

  • 听起来很傻。哪一个使用?说实话,我希望看到类似的东西:

    X :: getv时();

这是不可能的,实例必须存在/

1 个答案:

答案 0 :(得分:2)

这取决于“你想要什么”。 Firstable,可以使用X::getV()方法,但您需要将v成员和getV方法设为静态,如下所示。

<?php

abstract class X
{
    private static $v;

    protected static function setV($v)
    {
        self::$v = $v;
    }

    public static function getV()
    {
        return self::$v;
    }
}

class A extends X
{
    public function doIt()
    {
        self::setV(2);
    }
}

class B extends X
{
    public function doIt()
    {
        self::setV(1);
    }
}

$a = new A();
$a->doIt();

echo X::getV();
// prints 2
// but be aware, that ANY instance of X children class will change the same X::$v value
$b = new B();
$b->doIt();

echo X::getV();
// prints 1

静态成员(如X::$v)只存储一次,它们被“绑定”到类中,而不是该类的实例。

<?php

class Foo
{
    public static $v = 5;
}

$instance1 = new Foo();
$instance2 = new Foo();
echo Foo::$v;
echo $instance1::$v;
echo $instance2::$v;
// prints 5, 5, 5

$instance1::$v = 10;
echo Foo::$v;
echo $instance1::$v;
echo $instance2::$v;
// prints 10, 10, 10