开发者学堂课程【PHP 进阶教程-由浅入深掌握面向对象开发-第二阶段:Trait 控制权】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/712/detail/12703
Trait 控制权
主要内容
一、概念
二、步骤
三、示例
四、小结
一、概念
trait 控制权:trait 在引入类后,可以根据实际类的需求修改 trait 中对应方法的控制权。(只针对当前引入类)其他的类引入是修改不了的,除非修改 trait 本身。
1、通过 AS 关键字直接修改权限
例如现在已经有 trait 了,定义了 trait 的方法名。在类里面引入 trait 的名字的时候,如果只引入了单个,就直接方法名 as 访问修饰限定符。
2、通过别名的方式也可以实现权限的改变。
还是同样的代码放进去,但是想要改一个名字。改名字可以使用访问修饰限定符。但是这个针对的只是别名,说明原来的方法名是可以用的。原来的方法名,原来的访问修饰限定符是没有改变的。
二、具体步骤
1、定义 trait 设定方法
2、在类里面引入 trait
3、如果有必要,修改权限
直接修改权限是针对方法的修改
使用别名针对别名的权限修改,当前的方法本身依然是保留的
以上就是权限的特点。
三、示例
1、直接修改权限,改成其他的级别就可以了。
例如将公开改为私有,将私有改为共有。
将上述代码复制
10trait-power.php
#trait 控制权、、首先定义了 trait
private function pee{}
Echo “t1::pee”//一个是公有,一个是私有。在 trait 里面。
想要将 sleep 变成私有的,直接修改,然后将 pee 变成公有的。
发现上述部分内容需要改为私有。要访问在里面访问。$this-pee
在内部提供一个公有方式实现上述的私有修改,改成私有之后就不允许别人直接调用了,但是用户自己还是可以调用的。在调用之前可以做权限逻辑的各种判定。所以要保证安全。
$H=NEW-human。
此时 $H 只调用了自己的方法,show 方法,看看代码能否运行。
修改语法错误之后重新刷新,发现两个都可以调用。
因为在类内部,体现不出来任何的性质。
#调用原始方法
$H sleep(原来是公有的看看能否调用)
刷新之后发现不行。告诉我的方法是私有的,所以不行。
说明私有修改是成功,让他不能在外面访问。所以这个是错误的。
#已经完成私有化,不能外部调用。
$H-pee 可以运行,因为上面代码已经变成公有了。公有意味着就可以在外部访问。代码中有公有的方法,public function pee 所以可以在外部调用。以上就是权限的修改,直接修改。
2、通过别名修改:本质只限定了别名,没有改变原来的方式
将 sleep 改成别名之后
Class animal
Use t1{
Sleep as private s
Pee as public p
t1 中有 sleep 和 pee 这两种方法。把 sleep as 一个别名,但是改为私有化的 s。将 pee as 公开的 pee 方法。
此时这个两个方法就相当于将黑白颠倒一次。
颠倒之后直接来访问。
$a=new animal
$a->s()
刷新之后出现 s 方法是一个私有的方法,不能在外部调用。说明这个别名的方法已经私有化了,不能调用了。
#别名方法已完成私有化,不能调用
不能调用可以使用别的方法:
$a->sleep()
也就证明了别名修改不会将原有的方法撤换,相当于一种复制。原来是什么内容就是什么内容。不会撤换也就意味着原有访问修饰限定符都不会受任何牵连。
现在的 p 肯定是可以外部调用的。
$a->p()
因为这是公开的,相当于将其共用化了,就可以调用了。但是想要调用原来的p方法,它是私有的,是不能调用的。
以上就是通过别名的方法进行权限的修改。性质:改了别名不影响原来的方法或者控制权。
四、小结:
1、trait 提供的方法是可以被类引入之后根据实际需求修改控制权的,这种控制权没有要求的修改规范,不需要越来越严格或越来越开放。严格和开放可以随意切换
2、解决的方法有两种,直接对原始的方法修改权限。
第二种使用别名修改权限。别名控制权只会修改到别名本身的方法,原 trait、其他的是不会受到影响的。
上图是刚刚测试的结果。
说明 trait 适合真的想控制权限,适合使用单 trait 引入,不出现同名的情况。多trait 也可以,只要不重名。如果真的想修改权限,使用第一种直接修改权限,这样才会保证外部用不到原来的内容,这样才会有帮助。
以上是 trait 的控制权限的问题。