php,子类无法访问父类私有属性,子类实例化再赋值后,子类所添加的新成员属性不存在

代码如下:classhumanBeing{private$name;private$age;private$gender;functionsay(){echo"Mynam... 代码如下:

class humanBeing{
private $name;
private $age;
private $gender;

function say(){
echo "My name is {$this->name} and I am {$this->age} years old. I am {$this->gender}.<br />";
}

function dance(){
$this->left();
$this->right();
$this->go();
}

private function left(){
echo 'Left, left!<br />';
}

private function right(){
echo 'Right,right!<br />';
}

private function go(){
echo 'Go,go,go!<br />';
}
}

class student extends humanBeing{

}

$student1=new student;

$student1->name='zhangsan';
$student1->age=20;
$student1->gender='male';

$student1->dance();

$student1->say();

====================================================
调用say()函数时,输出的结果为:
My name is and I am years old. I am .

新添加的三个成员属性全不见。为什么?
有人说子类中没有从父类继承过来的成员属性,不能在类外新建,但是以下例子可以正确运行:

<?php
class Person
{
private $name;
}

class Man extends Person
{

}

$m = new Man();
$m->name="zhangsan";
echo $m->name;
?>

似乎很矛盾....这个怎么回事呢?
展开
 我来答
iostream210
2012-01-08 · TA获得超过912个赞
知道小有建树答主
回答量:588
采纳率:0%
帮助的人:387万
展开全部
我把涉及到这个问题的知识点,可以和大家分享一下:
1.父类humanBeing , 子类student , 实例对象 $m (注意:$m是子类student 的实例,和humanBeijing没有直接关系)
2.private 的属性.仅在本类里使用;任何子类、实例对象都无法访问,更别说赋值。这个在书本上都一直是这么说滴。。哈哈。。。

根据以上知识点,来看你这个问题:
$student1=new student;
/*实例一个student的对象,此时注意,这个对象并不会继承父类humanBeing的三个 private变量$name,$age,$gender*/

$student1->name='zhangsan';
$student1->age=20;
$student1->gender='male';
/*这里需要注意.很多人会误以为是给父类humanBeing的三个属性赋值了,这是错的。这里的赋值,仅仅是给子类student的三个属性赋值,这里也许会有人问,子类student那有什么属性呀?在php中,所有的变量,不要求申明,在类中属性也是一样的,不要求申明,而且类中,默认都是public。所以上面的这三行代码,仅仅是子类student的三个属性赋值,和父类humanBeing的三个属性,没有任何关系,仅仅名字一样而已*/

function say(){
echo "My name is {$this->name} and I am {$this->age} years old. I am {$this->gender}.<br />";
}
/*这个是父类humanBeing的公有方法,(默认的是public的),这个方法中 $this -> name.这里的$this 是指父类student,$this -> name是指父类student的属性,从始至终,它并没有被赋值,所以它是空的,(而且它也不能被赋值,因为是private),这里的$student1->name='zhangsan';赋值操作,仅仅是修改子类student的$name */

我想这么回答,你应该非常清楚了吧

再来理解后面的例子,就很容易了。
$m->name="zhangsan";
/*仅仅是给子类Man的属性赋值,而且因为可以省略声明,默认又是public的,所以能直接赋值,当然也可以输出了*/

class Person{
private $name;
}
/*可以直接把private $name;去掉,因为后面的赋值,跟它没有任何关系,直接修改成*/
class Person{
}
更多追问追答
追问
估计你写了错别字,我看的有点晕了...
这个是父类humanBeing的公有方法,(默认的是public的),这个方法中 $this -> name.这里的$this 是指父类student,$this -> name是指父类student的属性,从始至终,它并没有被赋值,所以它是空的,(而且它也不能被赋值,因为是private

“父类student”是不是应该改成“子类student”?还是“父类humanBeing”?
追答
哈哈。。是些错了。这里是指父类 humanBeing.,
tongfans
2012-01-08 · TA获得超过1127个赞
知道小有建树答主
回答量:683
采纳率:0%
帮助的人:734万
展开全部
这两句没问题
$student1->dance();
$student1->say();

问题出在这三句:
$student1->name='zhangsan';
$student1->age=20;
$student1->gender='male';
这三个都是私有成员,不能直接赋值,可以在基类中实现公共的Set方法或者构造函数来赋值。
追问
应该说是子类根本“不能继承”才对吧?不是访问不到的问题吧...
但是我记得似乎如果子类无法继承父类的私有成员属性,再赋值,就等于新建成员属性了啊。看下面例子就可以正确运行:
name="zhangsan";
echo $m->name;
?>

这个怎么回事呢?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
隋龙飞
2012-01-08 · TA获得超过511个赞
知道小有建树答主
回答量:380
采纳率:0%
帮助的人:251万
展开全部
因为父类的私有属性是不可访问的。子类继承的时候,当然也就不存在这3个属性,所以咯,也没有办法赋值和取值了。
追问
也就是说,在创建对象时,不能直接在类外部新建成员属性了。是吧?但是我记得似乎如果子类无法继承父类的私有成员属性,再赋值,就等于新建成员属性了啊。看下面例子就可以正确运行:
name="zhangsan";
echo $m->name;
?>

这怎么解释呢?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lxc2015
2012-01-08
知道答主
回答量:4
采纳率:0%
帮助的人:6166
展开全部
简单解决
class humanBeing{
private $name;
private $age;
private $gender;
修改为
public $name;
public $age;
public $gender;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式