[PHP]关于子类继承构造函数及其怎么去实例化赋值的问题
<?php//基类classAnimal{//基类的属性public$name;//名字//基类的构造函数publicfunction__construct($name)...
<?php
//基类
class Animal
{
//基类的属性
public $name; //名字
//基类的构造函数
public function __construct( $name )
{
$this->name = $name;
}
}
//派生类
class Person extends Animal
//Person类继承了Animal类
{
public $personSex; //性别
public $personAge; //年龄
//继承类的构造函数
function __construct( $personSex,$personAge )
{
parent::__construct( "heiyeluren" );//请注意这里·············这里直接赋值了
//使用parent调用了父类的构造函数
$this->personSex = $personSex;
$this->personAge = $personAge;
}
function printPerson()
{
print( $this->name. " is " .$this->
personSex. ",this year " .$this->
personAge );
}
}
//实例化Person对象
$personObject = new Person( "male", "21");
//执行打印
$personObject->printPerson();
//输出:heiyeluren is male,this year 21
=============================================
以上程序没有任何问题,可如果把派生类中的继承构造函数按照原来的直接复制过来,注意哦!是连父类的那个构造函数的变量也复制过来,还有哦!如果连方法体也复制过来!该如何去实例化才不会报错!
1,先说下我的理解看看对不对,如果把变量复制过来的话不复制构造函数体,那么这个变量在子类中没有被定义,所以会出现警告,可是他不是继承了父类吗?那个父类的属性难道继承不来,难道不算是已经定义过?
2,如果构造方法体也继承过来为什么不行呢?如果行?怎么实例化?或者不会出错
求大神详解一下,十分感谢! 展开
//基类
class Animal
{
//基类的属性
public $name; //名字
//基类的构造函数
public function __construct( $name )
{
$this->name = $name;
}
}
//派生类
class Person extends Animal
//Person类继承了Animal类
{
public $personSex; //性别
public $personAge; //年龄
//继承类的构造函数
function __construct( $personSex,$personAge )
{
parent::__construct( "heiyeluren" );//请注意这里·············这里直接赋值了
//使用parent调用了父类的构造函数
$this->personSex = $personSex;
$this->personAge = $personAge;
}
function printPerson()
{
print( $this->name. " is " .$this->
personSex. ",this year " .$this->
personAge );
}
}
//实例化Person对象
$personObject = new Person( "male", "21");
//执行打印
$personObject->printPerson();
//输出:heiyeluren is male,this year 21
=============================================
以上程序没有任何问题,可如果把派生类中的继承构造函数按照原来的直接复制过来,注意哦!是连父类的那个构造函数的变量也复制过来,还有哦!如果连方法体也复制过来!该如何去实例化才不会报错!
1,先说下我的理解看看对不对,如果把变量复制过来的话不复制构造函数体,那么这个变量在子类中没有被定义,所以会出现警告,可是他不是继承了父类吗?那个父类的属性难道继承不来,难道不算是已经定义过?
2,如果构造方法体也继承过来为什么不行呢?如果行?怎么实例化?或者不会出错
求大神详解一下,十分感谢! 展开
2个回答
展开全部
“该如何去实例化才不会报错!”不明白你说的这一句,你把会报错的代码贴出来。
另外,对你的写法感到奇怪:
$name,$personSex, $personAge 这3个东西都是public的,还要什么构造函数,任何实例生成后都可以直接修改它的
如果你希望$name同样被其子孙使用,那么应该protected,如果其子孙类定义内并不使用它,那么应该private,当然,你应该在Animal定义内提供getter、setter来访问这一属性,或者用构造函数设定它,然后只提供getter方法(只读属性)
另外,对你的写法感到奇怪:
$name,$personSex, $personAge 这3个东西都是public的,还要什么构造函数,任何实例生成后都可以直接修改它的
如果你希望$name同样被其子孙使用,那么应该protected,如果其子孙类定义内并不使用它,那么应该private,当然,你应该在Animal定义内提供getter、setter来访问这一属性,或者用构造函数设定它,然后只提供getter方法(只读属性)
更多追问追答
追问
那估计是我的理解有误,刚刚接触这个!只想着能运行就满足了,另外也没想那么多封装的问题!
function __construct( $personSex,$personAge )
{
parent::__construct( $name );
····
}
我第一次写的时间是这样,所以出了个未定义的变量name
Notice: Undefined variable: name in····
追答
php是可以像javascript那样在function里面嵌套function的,我看了一下,估计是你对类内的成员是实例的成员(动态成员)还是类的成员(静态成员)没搞清楚,对类和类的实例没仔细分析
$name在父类中是实例成员,是运行时有意义,$name是public的,所以,子类也有了$name,并且也是实例成员,你不能期望 某个动态的父亲的$name 自动“继承”(复制)给某个动态的儿子,它们两者的$name除了表示都有个$name变量外没有关系
从这个意义上说,public、protected的成员只是在名字上被子孙共享,在值上是私有的。让类的变量在值上也是整个家族共享的,只有一个办法,就是让它是静态的(static)
下面的代码是可以的
function __construct( $personSex,$personAge )
{
//parent::__construct( "heiyeluren" );
parent::__construct($this->name);
$this->personSex = $personSex;
$this->personAge = $personAge;
}
$personObject = new Person( "male", "21");
$personObject->name = 'aaa';
$personObject->printPerson();
展开全部
不知所云...是把子类构造函数变成这样吗?$this->name = $name;
function __construct( $name,$personSex,$personAge )
{
$this->name = $name;
//使用parent调用了父类的构造函数
$this->personSex = $personSex;
$this->personAge = $personAge;
}
function __construct( $name,$personSex,$personAge )
{
$this->name = $name;
//使用parent调用了父类的构造函数
$this->personSex = $personSex;
$this->personAge = $personAge;
}
追问
子类构造函数在继承时间为什么不可以这样写
function __construct( $personSex,$personAge )
{
parent::__construct( $name ){
$this->name=$name
}
$this->personSex = $personSex;
$this->personAge = $personAge;
}
追答
函数体内嵌函数体,PHP还能有这种写法???父类的构造函数函数体已经写好了啊,子类就只能调用啊。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询