慕粉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>";
?>
父类Human中定义的$weight变量是protected访问权限的,所以父类中的$weight是可以被继承的,在子类NbaPlayer构造方法中并没有新建的$weight的这个属性,而是调用的的父类的$weight属性。所以你在外部调用$jordan->weight输出的时候由于protected访问权限不够所以是不能输出的。
你可以在$jordan= new NbaPlayer('jordan','198cm','98kg','bull','23');
这一行代码后面加一行代码:var_dump($jordan);查看对象的结构。然后你会看到如下输出:
注意看,里面有一个["height":"Human":private]=> NULL,还有一个["height"]=> string(5) "198cm"。前者是父类中的height,但是由于访问权限是private所以不能访问,后者则是在构造函数中新建的$height。再看weight只有一个,["weight":protected]=> string(4) "98kg" ,是从父类中继承的,protected访问权限的。
你在子类NbaPlayer 的构造方法中这一行:$this->height=$height;
这里$this->height其实并不是父类中的$height属性,而是在子类NbaPlayer 中新建了一个与父类中$height属性同名的另一个属性,两个属性是不一样的。
在子类NbaPlayer 构造方法中新建的的$height属性是默认的访问权限,所以在你调用这一行:echo $jordan->height."</br>";的时候也能输出。
PHP面向对象编程
70153 学习 · 361 问题
相似问题
回答 1
回答 1