博客列表 >php 类成员重载 与命名空间

php 类成员重载 与命名空间

咸鱼老爷
咸鱼老爷原创
2021年03月19日 17:07:37657浏览

类成员“重载”

  • 属性重载

    属性重载实际上就是属性访问一个拦截器,用来过滤用户的请求
    重载属性简单实现一个访问限制
    1. class Demo
    2. {
    3. private $role='admin';
    4. private $username='admin';
    5. //属性重载
    6. public function __get($name)
    7. {
    8. if($this->role === 'admin'){
    9. return $this->username;
    10. }else{
    11. return '非法访问';
    12. }
    13. }
    14. }
    15. $obj=new Demo();
    16. echo $obj->username;
    • 获取器

      通常会自动创建一个获取器,动态的生成一个方法名称
      1. class Demo
      2. {
      3. protected $data=[
      4. 'name'=>'admin',
      5. ];
      6. public function __get($name){
      7. $method='get'.ucfirst($name);
      8. if(method_exists($this,$method))return $this->$method($name);
      9. }
      10. public function getName($name){
      11. if(!isset($this->data[$name])){
      12. $this->data[$name]=0;
      13. }else{
      14. return $this->data[$name];
      15. }
      16. }
      17. }
      18. $obj=new Demo();
      19. echo $obj->name;
    • 修改器

      __set当访问不存在无权限设置的属性时自动调用
      1. class Demo
      2. {
      3. protected $data=[
      4. 'name'=>'admin',
      5. ];
      6. public function __set($name,$value){
      7. $method='set'.ucfirst($name);
      8. if(method_exists($this,$method))return $this->$method($name,$value);
      9. }
      10. public function setEmail($name,$value){
      11. $this->data[$name]=$value;
      12. }
      13. }
      14. $obj=new Demo();
      15. $obj->email='admin@php.cn';
      16. var_dump($obj);
  • 方法重载

    • 普通方法重载 __call

      1. public function __call($name, $arguments)
      2. {
      3. return $name.'<br>'.implode(',',$arguments);
      4. }
      5. $obj=new Demo();
      6. var_dump($obj->hello(1,2,3));

    • 静态方法重载 __callstatic

      1. public static function __callStatic($name, $arguments)
      2. {
      3. return $name.'<br>'.implode(',',$arguments);
      4. }
      5. $obj=new Demo();
      6. var_dump(Demo::hello(1,2,3));

      全局成员 函数,常量,类

      不能重复定义

      命名空间

      主要就是为了解决全局成员的命名冲突

      1. namespace app1{
      2. class Model{
      3. }
      4. const PATH='app/';
      5. function get(){
      6. }
      7. echo Model::class,'<br>';
      8. echo PATH::class,'<br>';
      9. echo get::class,'<br>';
      10. }
      11. namespace app2{
      12. class Model{
      13. }
      14. const PATH='app/';
      15. function get(){
      16. }
      17. echo Model::class,'<br>';
      18. echo PATH::class,'<br>';
      19. echo get::class,'<br>';
      20. }


      全局命名空间

      1. namespace{
      2. class Model{
      3. }
      4. const PATH='app/';
      5. function get(){
      6. }
      7. echo Model::class,'<br>';
      8. echo PATH::class,'<br>';
      9. echo get::class,'<br>';
      10. }


      同名空间成员的组织方式
      防止一个命名空间的代码过多,可以将同一个命名空间的代码写到多个脚本中

      1. namespace app;
      2. require 'namespce1.php';
      3. require 'namespace2.php';
      4. echo Demo2::class,'<br>';
      5. echo Model::class,'<br>';


      子命名空间
      ```html
      namespace Ns1{
      class Demo{
      }
      echo Demo::class,’<br>‘;
      // namespace用在空间中,标识当前空间的引用,类似$this或self
      // echo namespace\Ns2\Demo::class;
      echo Ns2\Demo::class,’<br>‘;
      echo Ns2\Ns3\Demo::class,’<br>‘;
      echo ‘<hr>‘;
      }
      namespace Ns1\Ns2{
      class Demo{

      }

}
namespace Ns1\Ns2\Ns3{
class Demo{

  1. }

}

  1. ![](https://img.php.cn/upload/image/333/968/852/1616144775828115.png)
  2. 子命名空间访问上级
  3. ```html
  4. echo Demo::class,'<br>';
  5. //从子级访问上级
  6. echo \Ns1\Ns2\Demo::class,'<br>';
  7. echo \Ns1\Demo::class,'<br>';
  8. //访问全局
  9. echo \Demo::class,'<br>';

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议