php访问修饰限定符,php面向对象语法4:访问修饰限定符,public,protected,private...

访问修饰限定符:

用于描述,一个成员(属性,方法)在哪里才能被访问到!

tip:

PHP是采用类的概念,进行成员的限制访问的!

PHP将访问的代码,分成三大区域:类内,类外,继承链类内!

是根据:

目标成员在哪里定义 与 目标成员在哪里访问(看当前访问->属性/方法的代码在哪里执行)的位置 来决定类内,类外还是继承链类内!<?php

class A{

public function iam_a(){

var_dump($this->property);

}

}

class B extends A{

//在B类中定义

public $property='phpphphp';

public function iam_b(){

var_dump($this->property);

}

}

class C extends B{

public function iam_c(){

var_dump($this->property);

}

}

/*public $property='phpphphp';公共的,指的是,成员在本类内,继承链上的类内,与类外,都可以被访问!*/

//明确目标成员$property是在B类中定义的。

$c=new C;

// $c->property;在B类外执行,可以访问到

echo $c->property;

echo '


';

// iam_c()中的$this->property是在B类的继承链内,可以访问到

$c->iam_c();

// iam_b()中的$this->property是在B类内,可以访问到

$c->iam_b();

//iam_a()中的$this->property是在B类的继承链内,可以访问到

$c->iam_a();运行结果:

string(8) "phpphphp"

string(8) "phpphphp"

string(8) "phpphphp"

string(8) "phpphphp"

protected $property=’phpphphp’;

保护的,指的是,成员在本类内,继承链(子类,父类)上的类内 可以被访问$c=new C;

// $c->property;在B类外执行,不能访问到

var_dump($c->property);

// iam_c()中的$this->property是在B类的继承链内,可以访问到

$c->iam_c();

// iam_b()中的$this->property是在B类内,可以访问到

$c->iam_b();

//iam_a()中的$this->property是在B类的继承链内,可以访问到

$c->iam_a();运行结果:

PHP Fatal error: Cannot access protected property C::$property in /usercode/file.php on line 25

private $property=’phpphphp’

私有的,指的是,只有本类内,可以访问!$c=new C;

// $c->property;在B类外执行,不能访问到

var_dump($c->property);

// iam_c()中的$this->property是在B类的继承链内,不能访问到

$c->iam_c();

// iam_b()中的$this->property是在B类内,可以访问到

$c->iam_b();

//iam_a()中的$this->property是在B类的继承链内,不能访问到

$c->iam_a();运行结果:

NULL

NULL

string(8) "phpphphp"

NULL

PHP Notice: Undefined property: C::$property in /usercode/file.php on line 25

PHP Notice: Undefined property: C::$property in /usercode/file.php on line 19

PHP Notice: Undefined property: C::$property in /usercode/file.php on line 4

如何选择:

一个原则,尽量体现封装性。封装性,指的是,尽量隐藏内部实现,而仅仅开发外部操作接口!语法上,就是,将不需要外部使用的属性,方法,都私有化(保护化),而仅仅留下一些必要的公共方法!

一个类至少有一个公共方法,可以在类外调用。

如果一个类没有打算被继承,成员可以多用private。如果一个类是作为一个基础类,设计时就有打算被子类继承的,某些成员就会用到protected。还是看具体的业务要求。

tip:

1、一般情况下,如果出现重写,那么以重写后的定义位置为准。

(例外是私有属性在本类内访问时不能被重写。)<?php

class A{

public function iam_a(){

var_dump($this->property);

}

}

class B extends A{

//在B类中定义public $property

public $property='phpphphp';

public function iam_b(){

var_dump($this->property);

}

}

class C extends B{

//C类定义了同名属性

public $property='chongxiechongxiechongxie';

public function iam_c(){

var_dump($this->property);

}

}

$c=new C;

echo $c->property;

echo '


';

//确定了下面三个方法中$this都是C类对象,先查找C类中有没有定义property属性,如果没有,再往父类找。

$c->iam_c();

$c->iam_b();

$c->iam_a();运行结果:

chongxiechongxiechongxie

string(24) "chongxiechongxiechongxie"

string(24) "chongxiechongxiechongxie"

string(24) "chongxiechongxiechongxie"

注意:重写父类的属性或者方法时,访问控制修饰符一定要比父类的同名属性或者方法弱。private 最强,public最弱。

例外:

私有属性在本类内访问时不能被重写。<?php

class A{

public function iam_a(){

echo '在继承链内访问
';

var_dump($this);

var_dump($this->property);

echo '


';

}

}

class B extends A{

//在B类中定义private $property

private $property='phpphphp';

public function iam_b(){

echo '类内访问
';

var_dump($this);

var_dump($this->property);

echo '


';

}

}

class C extends B{

//在C类中定义同名属性

public $property='chongxiechongxiechongxie';

public function iam_c(){

echo '在继承链内访问
';

var_dump($this);

var_dump($this->property);

echo '


';

}

}

$c=new C;

echo '在类外访问'.$c->property;//在类外访问

echo '


';

$c->iam_c();//在继承链内访问

$c->iam_b();//在B类内访问

$c->iam_a();//在继承链内访问运行结果:

在类外访问chongxiechongxiechongxie

在继承链内访问string(24) "chongxiechongxiechongxie"

object(C)#1 (2) {

["property"]=>

string(24) "chongxiechongxiechongxie"

["property":"B":private]=>

string(8) "phpphphp"

}

string(24) "chongxiechongxiechongxie"

类内访问,不能被重写,string(8) "phpphphp"

如果有知道原因的同学,请留个言解答下,谢谢

object(C)#1 (2) {

["property"]=>

string(24) "chongxiechongxiechongxie"

["property":"B":private]=>

string(8) "phpphphp"

}

string(8) "phpphphp"

在继承链内访问string(24) "chongxiechongxiechongxie"

object(C)#1 (2) {

["property"]=>

string(24) "chongxiechongxiechongxie"

["property":"B":private]=>

string(8) "phpphphp"

}

string(24) "chongxiechongxiechongxie"

以上就是php面向对象语法4:访问修饰限定符,public,protected,private的内容,更多相关内容请关注PHP中文网(www.php.cn)!

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值