我在父类中定义了,$height私有属性,但是还能在外边被访问到

来源:4-2 访问控制-PHP面向对象编程

慕粉3564441

2016-10-26 23:57

<?php


class Human{

public $name ;

private $height ;

protected $weight;

private $ishungry=true;

public function eat($food){

echo $this->name."'s eating ".$food."\n";}

public function info(){

echo "hunman:".$this->name.";".$this->height.";".

$this->ishungry."\n";

}

}


class NbaPlayer extends Human{

private $age="40";

function __construct($name,$height,$weight,$team,$playernumber){

echo "in nbaplayer construct\n";

$this->name=$name;

$this->height=$height;

$this->weight=$weight;

$this->team=$team;

$this->playnumber=$playernumber;

echo $this->height."\n";

echo $this->weight."\n";

//设置为私有属性但是外部可以调用private $height ;


}

//定义方法

public function run(){

echo "Running\n";

}

public function jump(){

echo "Jumping\n";

}

public function dribble(){

echo "Dribbling\n";

}

public function shoot(){

echo "Shooting\n";

}

public function dunk(){

echo "Dunking\n";

}

public function pass(){

echo "passing\n";

}

public function getage(){

echo $this->name."'s age is".($this->age-5);

}


}

$jordan= new NbaPlayer('jordan','198cm','98kg','bull','23');

echo $jordan->height."</br>";

//echo $jordan->weight."</br>";

echo $jordan->ishungry."</br>";

?>


写回答 关注

2回答

  • weibo_向前走_333_04036087
    2016-10-27 18:56:43

        父类Human中定义的$weight变量是protected访问权限的,所以父类中的$weight是可以被继承的,在子类NbaPlayer构造方法中并没有新建的$weight的这个属性,而是调用的的父类的$weight属性。所以你在外部调用$jordan->weight输出的时候由于protected访问权限不够所以是不能输出的。

        你可以在$jordan= new NbaPlayer('jordan','198cm','98kg','bull','23');

        这一行代码后面加一行代码:var_dump($jordan);查看对象的结构。然后你会看到如下输出:

    http://img.mukewang.com/5811dd250001a97c14310084.jpg

        注意看,里面有一个["height":"Human":private]=> NULL,还有一个["height"]=> string(5) "198cm"。前者是父类中的height,但是由于访问权限是private所以不能访问,后者则是在构造函数中新建的$height。再看weight只有一个,["weight":protected]=> string(4) "98kg" ,是从父类中继承的,protected访问权限的。


    慕粉3564...

    这就说明要是能继承,它就先继承,如果不能继承父类,他就自己构造一个函数。这个要是这么理解就OK了...

    2016-10-29 14:33:30

    共 1 条回复 >

  • weibo_向前走_333_04036087
    2016-10-27 10:32:22

    你在子类NbaPlayer 的构造方法中这一行:$this->height=$height;

    这里$this->height其实并不是父类中的$height属性,而是在子类NbaPlayer 中新建了一个与父类中$height属性同名的另一个属性,两个属性是不一样的。

    在子类NbaPlayer 构造方法中新建的的$height属性是默认的访问权限,所以在你调用这一行:echo $jordan->height."</br>";的时候也能输出。

    慕粉3564...

    但是echo $jordan->weight."</br>";这个不能输出啊,同样是在子类NbaPlayer 构造方法中新建的$weight的这个属性

    2016-10-27 14:03:28

    共 1 条回复 >

PHP面向对象编程

从容应对面试官的知识宝典,带你握面向对象的最重要的核心能力

70153 学习 · 361 问题

查看课程

相似问题