有没有办法直接在PHP中通过Derived Class对象访问基类属性

时间:2013-06-09 20:49:39

标签: php class base derived

在php中,有没有办法直接通过派生类类型的对象直接访问任何基类属性。

例如:

class a  
{  
    public $name="Something"; 

    function show()
    {
        echo $this->name;
    }
}; 
class b extends a  
{  
     public $name="Something Else";  

     function show()
     {
         echo $this->name;
     }
};

$obj = new b();
$obj->show();

它会打印字符串“Something Else”,但如果我想访问Base class Function show,

它似乎不像在c ++中完成的那样工作

obj.a::show();  

1 个答案:

答案 0 :(得分:4)

由于您覆盖了子级中的$name,因此该属性将具有子级的属性值。您无法访问父值。任何其他方式都没有意义,因为属性是公共的,这意味着属性对于子(和外部)是可见的,对它的修改将改变基本值。因此,它实际上是该实例的同一属性和值。

具有两个相同名称的单独属性的唯一方法是将基本属性声明为private,将子属性声明为非私有,然后调用可以访问基本属性的方法,例如

class Foo
{
    private $name = 'foo';

    public function show()
    {
        echo $this->name;
    }
}

class Bar extends Foo
{
    public $name = 'bar';

    public function show()
    {
        parent::show();
        echo $this->name;
    }
}

(new Bar)->show(); // prints foobar

由于您的C ++示例调用正在使用scope resolution operator ::,您可能正在寻找class/static properties

class Foo
{
    static public $name = 'foo';

    public function show()
    {
        echo static::$name; // late static binding
        echo self::$name;   // static binding
    }
}

class Bar extends Foo
{
    static public $name = 'bar';

    public function show()
    {
        parent::show(); // calling parent's show()
        echo parent::$name; // calling parent's $foo
    }
}

(new Bar)->show(); // prints barfoofoo