0

所以我有这个代码,见下文。我在获取受保护的值时运行错误。认为受保护的值将被继承。我正在弄清楚为什么我们需要调用parent::__construct(),而我们只能扩展一个类。

如果你能告诉我什么是错的,我怎样才能以正确的方式做到这一点,那就太棒了。

    <?php 
    /**
    * DogWords
    */

    class DogWords
    {
        protected $words = array('Wrr', 'Grr', 'Weeee', 'Houou');
    }

    /**
    * Dog Class
    */
    class Dog extends DogWords
    {
        protected $dogname = NULL;
        protected $dogwords = NULL;

        public function __construct($dogname)
        {
            $this->dogname = $dogname;
            $this->dogwords = new DogWords;
        }

        public function bark()
        {
            echo $this->dogname . "; Bark, bark, bark...";
        }
    }

    /**
    * Poodle
    */
    class Poodle extends Dog
    {

    }

    $Amy = new Poodle('DogConstructor');
    echo $Amy->dogwords->words[1];      // Fatal Error...
    echo $Amy->bark();      // DogConstructor; Bark, bark, bark...
 ?>
4

4 回答 4

2

Protected成员不能在子类范围之外使用,如果要在子类范围之外访问它应该声明为public.

请从这里学习文档

于 2013-10-21T17:49:02.813 回答
1

如果您假装将变量保留为protected,为什么不执行以下操作:

class DogWords
{
    protected $words = array('Wrr', 'Grr', 'Weeee', 'Houou');
}

/**
* Dog Class
*/
class Dog extends DogWords
{
    protected $dogname;
    protected $dogwords;

    public function __construct($dogname)
    {
        $this->dogname = $dogname;
        $this->dogwords = new DogWords;
    }

    public function bark()
    {
        return $this->dogname . "; Bark, bark, bark...";
    }
}

/**
* Poodle
*/
class Poodle extends Dog
{
     public function getDogWords()
     {
         return $this->dogwords->words;
     }
}

$Amy = new Poodle('DogConstructor');
$words = $Amy->getDogWords();
var_dump($words[1]);
var_dump($Amy->bark());

示例:http ://codepad.org/GsmmHxev

于 2013-10-21T17:56:36.090 回答
0

错误来自以下事实:“声明为受保护的成员只能在类本身以及继承的类和父类中访问”。

http://www.php.net/manual/en/language.oop5.visibility.php

为了访问它们,您需要将它们都公开:

class DogWords
{
    public $words = array('Wrr', 'Grr', 'Weeee', 'Houou');
}

/**
 * Dog Class
 */
class Dog extends DogWords
{
    protected $dogname = NULL;
    public $dogwords = NULL;

//... rest of the code

$Amy = new Poodle('DogConstructor');
echo $Amy->dogwords->words[1];      // Fatal Error...
echo $Amy->bark();      // DogConstructor; Bark, bark, bark...
?>

现在打印:“GrrDogConstructor;吠,吠,吠……”

于 2013-10-21T17:52:44.577 回答
0

根据OOP的规则,protected成员只能从基类和派生类(立即非立即)内部访问,而不能从其他任何地方访问。

但是在这里你试图访问类的受保护成员,dogdogwords使用echo $Amy->dogwords->words[1]子类poodle的对象,即Amy。因此,根据原则,您不能以这种方式访问​​它。

完全合法...

于 2013-10-21T18:55:57.537 回答