博客列表 >属性重载与命名空间和类自动加载器

属性重载与命名空间和类自动加载器

啊℃。㏄
啊℃。㏄原创
2022年04月26日 07:37:11406浏览

属性重载

  1. <?php
  2. /**
  3. * 1.属性重载:属性的访问拦截 __get(),__set()
  4. */
  5. class User
  6. {
  7. // 属性
  8. private $data = [
  9. 'age'=>20
  10. ];
  11. //访问拦截器
  12. public function __get($name)
  13. {
  14. //$name:属性名
  15. // array_key_exists():查询数组中是否存在某一个键
  16. if(array_key_exists($name,$this->data)){
  17. return $this->data[$name];
  18. }
  19. return "属性 {$name} 不存在";
  20. }
  21. // 更新拦截器
  22. public function __set($name, $value)
  23. {
  24. // 1.有没有这个属性
  25. if(array_key_exists($name,$this->data)){
  26. // 2.属性是否合法
  27. if($name === 'age') {
  28. if($value > 18 && $value < 59){
  29. $this->data[$name] = $value;
  30. }else{
  31. echo '年龄必须在18~59之间';
  32. }
  33. }else {
  34. // 以上操作只对age有效,其他属性直接赋值
  35. $this->data[$name] = $value;
  36. }
  37. }else {
  38. echo '禁止动态创建属性';
  39. }
  40. }
  41. // 方法拦截器
  42. public function __call($name, $args)
  43. {
  44. //$name:方法名 $args:传给方法的参数
  45. printf('方法:%s<br>参数:<pre>%s</pre>',$name,print_r($args,true));
  46. }
  47. // 静态方法拦截器
  48. public static function __callstatic($name, $args)
  49. {
  50. //$name:方法名 $args:传给方法的参数
  51. printf('方法:%s<br>参数:<pre>%s</pre>',$name,print_r($args,true));
  52. }
  53. }
  54. $user = new User;
  55. echo $user->name . '<hr>';
  56. /**
  57. * 为一个属性赋值的时候,必须要搞清楚两件事
  58. * 1.有没有这个属性
  59. * 2.属性是否合法
  60. */
  61. $user->age = 25;
  62. echo $user->age . '<hr>';
  63. // 常规方法/非静态方法/用实例调用
  64. $user->hello('猪老师','PHPCN');
  65. // 静态方法
  66. $user::world(100,200);

效果:

命名空间

  1. <?php
  2. /**
  3. * 命名空间:解决全局成员的命名冲突
  4. */
  5. //一个脚本中,可以创建多个空间
  6. namespace ns1{
  7. //空间成员
  8. //常量
  9. const APP = '商场';
  10. }
  11. // 空间分级管理:子空间
  12. namespace ns2\ns3{
  13. const APP = '问答';
  14. echo APP . '<br>';
  15. }
  16. namespace ns2{
  17. //空间成员
  18. //常量
  19. const APP = '社区';
  20. //2.非限定名称:总是从当前空间开始查询
  21. echo APP . '<br>';
  22. // 查询当前命名空间函数__NAMESPACE__
  23. echo __NAMESPACE__ . '<br>';
  24. // 想在ns2中,访问ns1的APP
  25. // 一定要通过全局空间/根空间来进行访问
  26. // 根空间:\
  27. //1. 完全限定名称:从根空间开始查询
  28. echo \ns1\APP . '<br>';
  29. // 在ns2空间,访问子空间,ns2\ns3中的成员
  30. // 3.限定名称:ns3\APP
  31. echo '<span style="color:red">'.ns3\APP.'</span><br>';
  32. }
  33. /**
  34. * 命名空间类型
  35. * 1.完全限定名称:根空间开始,a\b\APP
  36. * 2.非限定名称:从当前空间开始,'APP'
  37. * 3.限定名称:子空间,ns\APP
  38. */
  39. //全局空间:匿名的,不要写空间名,用“\”来引用
  40. namespace{
  41. function hello(){
  42. echo 'hello';
  43. }
  44. echo '<span style="color:blue">'.ns1\APP.'</span><br>';
  45. echo '<span style="color:yellow">'.\ns2\ns3\APP.'</span><br>';
  46. }

效果:

类自动加载器

  1. <?php
  2. /**
  3. * 命名空间
  4. * 1.一个文件中,只允许声明一个命名空间并只写一个类
  5. * 2.命名空间的命名,应该和成员的路径一致
  6. * 3.类名必须和类文件对应
  7. */
  8. //类文件自动加载器
  9. // 注册一个类的自动加载器
  10. spl_autoload_register(function($class){
  11. //1.将命名空间=>映射到一个类文件的绝对路径
  12. $path = str_replace('\\',DIRECTORY_SEPARATOR,$class);
  13. //2.生成类文件路径
  14. $file = __DIR__ . DIRECTORY_SEPARATOR . $path .'.php';
  15. // 3.加载这个类文件
  16. require $file;
  17. });
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议