java私有属性和公共属性_私有属性,公共及保护属性和方法,构造函数的继承|面向对象编程 筋斗云网络...

论坛 期权论坛 脚本     
已经匿名di用户   2022-4-20 22:06   3185   0

====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=小甜甜去掉,什么效果? // 无权访问

*/

%E7%BB%A7%E6%89%BF%E8%8C%83%E5%9B%B4.jpg

====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());

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP