PHP类中访问控制的一些Tips

PHP类中访问控制的一些Tips

包括PHP在内的大部分面向对象的编程语言,都提供了对类的变量或方法的访问控制。这是实现面向对象封装能力的基础。变量其实就是数据,而方法函数就是处理这些数据的操作,根据最少知识原则,一些数据你不需要知道它的存在。这时,就需要使用private私有的变量和方法,私有的变量或方法只有这个类自己可以访问。而有些变量和方法自己的子类需要使用,但又不能暴露给外部,那么我们就会使用protected,也就是受保护的。最后就是公开不管类内部、外部还是继承的子类都可以使用的public公共变量或方法了。

我们通过变量的访问控制先来复习一下这三种访问控制符的作用。

class A {
private $private;
protected $protected;
public $public;

public function setPrivate($p){
$this->private = $p;
}

public function setProtected($p){
$this->protected = $p;
}

public function setPublic($p){
$this->public = $p;
}

public function testA(){
echo $this->private, '===', $this->protected, '===', $this->public, PHP_EOL;
}
}

class B extends A{
public function testB(){
echo $this->private, '===';
echo $this->protected, '===', $this->public, PHP_EOL;
}
}

$a = new A();
// $a->private = 'a-private'; // atal error: Uncaught Error: Cannot access private property A::$private
$a->setPrivate('a-private');
// $a->protected = 'a-protected'; // atal error: Uncaught Error: Cannot access protected property A::$protected
$a->setProtected('a-protected');
$a->public = 'c-public';
$a->testA();

echo "Out side public:" . $a->public, PHP_EOL;
// echo "Out side private:" . $a->private, PHP_EOL; // Fatal error: Uncaught Error: Cannot access private property A::$private
// echo "Out side protected:" . $a->protected, PHP_EOL; // Fatal error: Uncaught Error: Cannot access protected property A::$protected

$b = new B();
$b->setProtected('b-protected');
$b->public = 'b-public';
$b->testB(); // 没有b-private

$b->setPrivate('b-private');
$b->testB(); // 没有b-private

从上述代码中很清晰的可以看出,除了public之外的变量都不能在类外部直接调用或者赋值。所以我们使用setXXX()的public方法来为$private和$protected赋值。这里就出现了封装的概念了,比如在setPrivate()中我们就可以对传递过来的$p变量进行逻辑判断而决定是否将值赋给$private。

B类继承了A类,所以它可以访问到A类的$public和$protected变量,但是,请注意,$private变量是无法访问到的。所以即使调用了setPrivate()方法为$private赋值了,但因为B无法访问,所以依然取不到$private的值。有小伙伴要问了,这种情况不报错?当然不会报错,B类会在自己的范围内查找$private变量,没有定义的话就会生成一个局部的变量并赋值为空。

那么子类要使用$private应该怎么办呢?

class C extends A {
private $private;

public function testC(){
echo $this->private, '===', $this->protected, '===', $this->public, PHP_EOL;
}

// public function setPrivate($p){
// $this->private = $p;
// }
}

$c = new C();
$c->setProtected('c-protected');
$c->public = 'c-public';
$c->setPrivate('c-private');
$c->testC();

先不要打开C类setPrivate()方法的注释,你会发现$private依然是空值。也就是说,定义了同名的$private私有变量并不是对父类的变量覆盖,而是在本类作用域内新建了一个。父类的setPrivate()方法当然也不能访问子类的private变量,因此,子类也要重写一个setPrivate()方法来为自己的$private变量赋值。

记住一点:private修饰的变量或方法仅对当前类开放

对于方法的修饰也是一样的效果。

class D {
public function testD(){
$this->show();
}
private function show(){
echo 'This is D', PHP_EOL;
}
}

class E extends D {
private function show(){
echo 'This is E', PHP_EOL;
}
}

$e = new E();
$e->testD(); // This is D

子类E调用父类D的testD()方法,testD()方法中调用的是private修饰的show()方法,根据上面的原则,它依然调用的是自己D类的show()方法。

总结

关于访问控制的内容还是比较简单的,最主要的就是private这个修饰符的问题需要注意,其他的其实还是比较好理解的。不过越是简单的东西越是基础,面向对象脱离不了这三个简单的访问修饰符,它们在现代软件开发中的份量十足,只有牢牢掌握它们才是我们正确的学习之道。

测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/201912/source/PHP%E7%B1%BB%E4%B8%AD%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6%E7%9A%84%E4%B8%80%E4%BA%9BTips.php

参考文档:https://www.php.net/manual/zh/language.oop5.visibility.php#87413https://www.php.net/manual/zh/language.oop5.visibility.php#110555https://www.php.net/manual/zh/language.oop5.visibility.php

(0)

相关推荐

  • 彻底搞明白PHP中的include和require

    在PHP中,有两种包含外部文件的方式,分别是include和require.他们之间有什么不同呢? 如果文件不存在或发生了错误,require产生E_COMPILE_ERROR级别的错误,程序停止运行 ...

  • [PHP小课堂]PHP类中访问控制的一些Tips

    [PHP小课堂]PHP类中访问控制的一些Tips 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[xiaoyuezigonggong/149844827]免费得PHP.项目管理学习资料 ...

  • 六大茶类中白牡丹茶最特别

    白茶属轻微发酵茶,因此白牡丹的制作工艺无需揉炒,只需将鲜茶叶放置萎凋后再焙干即可,但话说上去虽然简易又简单,但实际上并不易操作.萎凋要自然萎凋,将鲜茶叶均匀地平摊在筛子上,放置在室内的阴凉通风处,避免 ...

  • 六大茶类中的茶多酚含量各是多少,各种茶叶茶多酚含量排名

    茶多酚.茶氨酸.咖啡碱是任何一款茶叶中,可溶于水的三大基础茶味物质.在绿茶.黄茶.白茶.红茶.黑茶.青茶(乌龙茶)这六大茶类之中,茶多酚.茶氨酸.咖啡碱等物质的含量是多少呢?下面为各位茶友一一揭晓. ...

  • 中考:十类中考生容易放跑高分

    每年中考结束,总结诸多成功或不成功的案例,以下总结了十类在中考中容易丢分的中考生,分享给大家,希望大家引以为鉴. 1.基础不扎实的中考生. 这种中考生最典型的表现是小题丢分严重.主要原因就是复习时没有 ...

  • 为什么说白茶在六大茶类中最特殊?

    专一.专注 就 等 你 来 关 注 不急不躁做干净的公众号 茶事频道 白茶一直是六大茶类中比较特殊的存在,跟其它五大茶类相比,白茶,可谓是中国茶里的极简主义:制作最为简单自然,工序最少. 白茶虽工艺至 ...

  • 在类中改变winform窗体控件值

    在类中改变winform窗体控件值

  • 白茶为什么在六大茶类中是一个特殊存在

    白茶一直是六大茶类中比较特殊的存在,跟其它五大茶类相比,白茶,可谓是中国茶里的极简主义:制作最为简单自然,工序最少. 白茶虽工艺至简,但内涵却很丰富. 关于白茶的几个核心问题:工艺.品类.等级.树种, ...

  • 唯一会筑巢的蛇类,蛇类中最睿智的存在,世界最长毒蛇—眼镜王蛇

    世界上有着许许多多的蛇类,有着体型庞大的蚺蛇.蟒蛇:有着灵活.喜欢主动狩猎的游蛇:还有着家族当中几乎都是毒蛇的蝰蛇,十分慵懒,喜欢守株待兔的捕食方式. 虽然蛇类是一种比较进化程度不高的生物,但在蛇类当 ...

  • 阿光随笔 | 可应用在生活中的玄学小tips不看后悔一辈子

    一对一付费咨询:taotaoxixiaotao 微博:桃桃喜官方微博 以后小桃会经常分享吴明光老师的随笔 希望大家喜欢❤ 一.如何找到风水好的房子? 风水是为人服务的,一间屋子风水好不好,以你的感受优 ...