====A笔记部分====
继承了哪些东西?
子类可以做什么扩充?
构造函数如何继承的?
私有属性/方法如何继承?
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/****
代码部分
****/
//
classHuman{
private$wife='小甜甜';
publicfunctioncry(){
echo'5555
';
}
}
classStuextendsHuman{
publicfunctionsubtell(){
echo$this->wife;
}
}
$lisi=newStu();
$lisi->cry();// 5555
$lisi->subtell();// 出错如下
/*
未定义的属性,wife属性
Undefined property: Stu::$wife in D:\www\1108\03.php on line 44
问:父类不是有wife属性吗? 为什么没继承过来?
答: 私有的属性,可以理解不能继承.
(其实能继承过来,只不过无法访问)
public protected private中,
public protected 都可以继承,并拥有访问和修改的权限
这就好比说,家产已经继承了,愿意卖就卖,愿意改就改.
而私有的,就像先祖的牌位,继承下来
但是无权动,只能供着.
*/
====B笔记部分====
继承时,继承来Protcted/public 属性/方法
完全继承过来,属性子类.
继承来 父类private属性/方法,
但不能操作
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/****
代码部分
****/
classHuman{
// private $wife = '小甜甜';
public$age=22;
publicfunctioncry(){
echo'5555
';
}
publicfunctionpshow(){
echo$this->wife,'
';
}
}
classStuextendsHuman{
private$wife='凤姐';
public$height=180;
publicfunctionsshow(){
parent::pshow();
echo$this->wife,'
';
}
}
$lisi=newStu();
// print_r($lisi);
$lisi->sshow();// ???
/*
根据图来思考:
如果把Stu类中的 wife=凤姐去掉,什么效果? // 未定义属性
如果把Human类中的 wife=小甜甜去掉,什么效果? // 无权访问
*/

====C笔记部分====
子类继承父类的属性/方法,可以修改或增加
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/****
代码部分
****/
classsixty{
protected$wine='1斤';
publicfunctionplay(){
echo'谈理想
';
}
}
classnineextendssixty{
publicfunctionplay(){
echo'玩网游,宅!
';
}
publicfunctionmomo(){
echo'妹子,认识一下
';
}
publicfunctionshowW(){//受保护,需要定义public类
echo$this->wine,'
';
}
}
$s9=newnine();
$s9->showW();echo'
';// 父类有的,继承过来
$s9->play();// 父类有的,继承过来,可以修改/覆盖(overide).
$s9->momo();// 父类没有,可以添加
/***
上面所说的继承过来的大环境,
是指 protected /public
**/
====D笔记部分====
继承时的权限变化
继承自父类的属性/方法
权限只能越来越宽松或不变,不能越来越严格.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/****
代码部分
****/
classHuman{
publicfunctioncry(){
echo'555
';
}
}
classStuextendsHuman{
protectedfunctioncry(){
echo'5959
';
}
}
/*
Fatal error: Access level to Stu::cry() must be public (as in class Human) in D:\www\1108\06.php on line 36
子类的cry比父类的cry方法,权限要严格.
这不行,继承时,权限只能越来越宽松或不变,不能越来越严格.
*/
构造方法的继承
答: 构造方法也是可以继承的,
而且继承的原则和普通方法一样.
进而,如果子类也声明构造函数,则父类的构造函数,被覆盖了!
如果父类构造函数被覆盖了,自然,只执行子类中新的构造函数.
引发一个问题:
如果是一个数据库操作类,或者model类
我们肯定是要继承过去再使用,不能直接操作model类.
而model类的构造函数,又做了许多初始化工作.
我重写的model类的构造函数之后,导致初始化工作完不成了,怎么办?
答: 如果子类继承时,子类有构造函数,保险一点,调用 parent::__construct
这一点和java的面向对象,也有不同.
在java中,实例化子类时, 父类的构造函数运行,且先运行
然后运行子类的构造函数
另外: java中构造函数不是 __construct(),而是和类名相同的方法理解为构造函数.
在一些比较教材或者,老的代码中,你也有可能这种情况.
即 与类名相同的函数做构造函数----这是PHP4时代的残留.
请记住,你不要这样写
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
classHuman{
publicfunction__construct(){
echo'呱呱坠地!
';
}
}
classStuextendsHuman{
}
$ming=newStu();// 呱呱坠地,这说明构造函数也是可以继承的
classKingextendsHuman{
publicfunction__construct(){
echo'红光满屋,终日不散
';
}
}
$zhu=newKing();
echo'
';
classMysql{
protected$conn=NULL;
publicfunction__construct(){
$this->conn=mysql_connect('localhost','root','111111');
}
publicfunctionquery($sql){
returnmysql_query($sql,$this->conn);
}
}
/*
$mysql = new Mysql();
var_dump($mysql->query('use test')); // true,query成功
*/
classMyDbextendsMysql{
publicfunction__construct(){
// 如果子类继承时,有构造函数,保险一点
parent::__construct();
// 然后再写自己的业务逻辑
}
publicfunctionautoInsert(){
return$this->query('use test');
}
}
$mydb=newMyDb();// 看看问题出在哪儿?
var_dump($mydb->autoInsert());