PHP:从子类访问受保护的变量

Posted

技术标签:

【中文标题】PHP:从子类访问受保护的变量【英文标题】:PHP: Accessing protected var from child class 【发布时间】:2017-01-12 12:22:24 【问题描述】:

我正在学习 php,但我被以下代码卡住了:

<?php

class dogtag 

    protected $Words;



class dog 

    protected $Name;
    protected $DogTag;

    protected function bark() 
        print "Woof!\n";
    



class poodle extends dog 

    public function bark() 
        print "Yip!\n";
    



$poppy = new poodle;
$poppy->Name = "Poppy";
$poppy->DogTag = new dogtag;
$poppy->DogTag->Words = "My name is
Poppy. If you find me, please call 555-1234";

var_dump($poppy);

?>

这是我得到的:

PHP Fatal error:  Uncaught Error: Cannot access protected property poodle::$Name

这对我来说很奇怪,因为我应该从子类访问受保护的变量和函数。

谁能解释一下我哪里错了?

非常感谢。

【问题讨论】:

【参考方案1】:

确实可以从子类访问受保护的变量。但是,您没有从子类内部访问您的变量。

如果您将变量设为public,则可以从类外部访问它们。

文档:http://php.net/manual/en/language.oop5.visibility.php

例子:

Class Dog 

   private $privateProperty = "private"; //I can only be access from inside the Dog class
   protected $protectedProperty = "protected"; //I can be accessed from inside the dog class and all child classes
   public $publicProperty = "public"; //I can be accessed from everywhere.




Class Poodle extends Dog 

   public function getProtectedProperty()
       return $this->protectedProperty; //This is ok because it's inside the Poodle (child class);
   



$poodle = new Poodle;
echo $poodle->publicProperty; //This is ok because it's public
echo $poodle->getProtectedProperty(); //This is ok because it calls a public method.

【讨论】:

谢谢@Daan,但我不确定我明白了。你的意思是我试图从子类的实例($poppy)而不是从子类定义(类贵宾犬扩展......)访问它? 这意味着您不是从狗类内部访问它,而是从外部访问它。 我很抱歉,但我不明白。我正在尝试从继承自 dog 类的 poodle 子类访问 $Name 。我创建了一个贵宾犬 ($poppy) 的实例,并尝试更改受保护的 var $Name。我知道我不能使用私有 var 执行此操作,但 $Name 是受保护的。因此,由于 $poppy 是贵宾犬类的一个实例,我应该能够修改受保护的父母的 var。感谢您的耐心等待。 我已经添加了一个示例,希望这可以解决问题。 非常感谢,现在我明白了!祝你有美好的一天。,【参考方案2】:

您无法访问“Words”属性,您需要将其公开

【讨论】:

【参考方案3】:

您可以将 magic 方法添加到您的类中 - 这将允许您从类外部访问和操作私有属性。

class foo
    private $bah;

    public function __construct()
        $this->bah='hello world';
    
    public function __get( $name )
        return $this->$name;
    
    public function __set( $name,$value )
        $this->$name=$value;
    
    public function __isset( $name )
        return isset( $this->$name );
    
    public function __unset( $name )
        unset( $this->$name );  
    


$foo=new foo;
echo $foo->bah;

$foo->bah='banana';
echo $foo->bah;

【讨论】:

以上是关于PHP:从子类访问受保护的变量的主要内容,如果未能解决你的问题,请参考以下文章

从包外的子类访问受保护的变量

如何在子类中访问超类的“受保护的静态”变量,子类位于不同的包中......?

子类从 Java 中的父类更改受保护的变量

我们可以在父类的帮助下访问不同包中的受保护变量吗?

我可以在 Java 中公开受保护的成员吗?我想从子类访问它

在 kotlin 中,如何从子类访问父类中受保护的静态成员