为了账号安全,请及时绑定邮箱和手机立即绑定

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

<?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 回答

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

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

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

http://img1.sycdn.imooc.com//5811dd250001a97c14310084.jpg

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


0 回复 有任何疑惑可以回复我~
#1

慕粉3564441 提问者

这就说明要是能继承,它就先继承,如果不能继承父类,他就自己构造一个函数。这个要是这么理解就OK了...
2016-10-29 回复 有任何疑惑可以回复我~

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

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

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

1 回复 有任何疑惑可以回复我~
#1

慕粉3564441 提问者

但是echo $jordan->weight."</br>";这个不能输出啊,同样是在子类NbaPlayer 构造方法中新建的$weight的这个属性
2016-10-27 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信