【问题标题】:PHP: Accessing protected var from child classPHP:从子类访问受保护的变量
【发布时间】: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

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

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

非常感谢。

【问题讨论】:

    标签: php class parent-child protected


    【解决方案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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-22
        • 2023-01-13
        • 2023-04-09
        • 1970-01-01
        • 2014-05-14
        • 2012-11-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多