类成员重载、全局成员、命名空间声明与访问、命名空间分解与合并、子命名空间访问

2021年02月23日 03:55:52阅读数:67博客 / / PHP

1. 类成员重载

  • 访问或设置类中不存在的属性或方法时,自动调用魔术方法

  1. <?php
  2. class Demo
  3. {
  4. protected $data = [
  5. 'username' => 'guest'
  6. ];
  7. //属性重载
  8. public function __get($name)
  9. {
  10. $method = 'get' . ucfirst($name);
  11. return $this->$method($name);
  12. }
  13. // 获取器
  14. public function getUsername($name)
  15. {
  16. if (!isset($this->data[$name])) {
  17. $this->data[$name] = 0;
  18. } else {
  19. return $this->data[$name];
  20. }
  21. }
  22. public function getEmail($name)
  23. {
  24. if(!isset($this->data[$name])) {
  25. $this->data[$name] = 0;
  26. } else {
  27. return $this->data[$name];
  28. }
  29. }
  30. public function __set($name, $value)
  31. {
  32. $method = 'set' . ucfirst($name);
  33. return $this->$method($name,$value);
  34. }
  35. // 设置器
  36. public function setEmail($name,$value)
  37. {
  38. $this->data[$name] = $value;
  39. }
  40. // 方法重载
  41. // 普通方法:__call()
  42. // 静态方法:__callStatic()
  43. public function __call($name,$args)
  44. {
  45. // 请求转发
  46. return $name . '[' . implode(',',$args) . ']';
  47. }
  48. // 当访问一个不存在的静态方法,会定位到下面这个魔术方法中
  49. public static function __callStatic($name, $args)
  50. {
  51. return $name . '[' . implode(',',$args) . ']';
  52. }
  53. }
  54. $obj = new Demo;
  55. echo $obj->username,'<br>';
  56. $obj->email = 'guest@qq.com';
  57. echo $obj->email;
  58. echo '<br>';
  59. echo $obj->world(1,2,3);
  60. echo '<br>';
  61. echo Demo::test('a','b','b');

2. 全局成员有哪几种,有什么特点

全局成员:类,常量,函数
特点:不能重复声明

  1. <?php
  2. // 类
  3. class Mod
  4. {
  5. public $mod = __CLASS__;
  6. }
  7. // 常量
  8. const TITLE = 'Hello';
  9. // 函数
  10. function con()
  11. {
  12. return __FUNCTION__;
  13. }
  14. echo (new Mod)->mod,'<br>';
  15. echo TITLE,'<br>';
  16. echo con();

3. 空间的声明与空间成员的访问

  1. <?php
  2. // 命名空间
  3. namespace ns1 {
  4. // 类
  5. class Mod1
  6. {
  7. }
  8. // 常量
  9. const TITLE = '标题';
  10. // 函数
  11. function test()
  12. {
  13. }
  14. echo Mod1::class, '<br>';
  15. echo TITLE::class, '<br>';
  16. echo test::class, '<br>';
  17. }
  18. // 全局空间
  19. namespace {
  20. echo '<hr>';
  21. // 类
  22. class Mod1
  23. {
  24. }
  25. // 常量
  26. const TITLE = '标题';
  27. // 函数
  28. function test()
  29. {
  30. }
  31. echo Mod1::class, '<br>';
  32. echo TITLE::class, '<br>';
  33. echo test::class, '<br>';
  34. }

4. 空间成员的分解与合并操作

  • 文件:demo.php
  1. <?php
  2. namespace ns;
  3. require 'test1.php';
  4. require 'test2.php';
  5. echo Test1::class,'<br>';
  6. echo Test2::class,'<br>';
  • 文件:test1.php
  1. <?php
  2. namespace ns;
  3. class Test1
  4. {
  5. public $username = 'guest';
  6. }
  • 文件:test2.php
  1. <?php
  2. namespace ns;
  3. class Test2
  4. {
  5. public $title = 'php中文网';
  6. }

5. 子空间访问任何空间中的成员

  1. <?php
  2. // 父空间
  3. namespace test1 {
  4. class Demo
  5. {}
  6. echo Demo::class,'<br>';
  7. // namespance:用在空间中,表示当前空间的引用,类似于$this或self
  8. echo test2\Demo::class,'<br>';
  9. echo test2\test3\Demo::class,'<hr>';
  10. }
  11. // test1的子空间
  12. namespace test1\test2 {
  13. class Demo
  14. {
  15. //...
  16. }
  17. echo Demo::class,'<br>';
  18. echo test3\Demo::class,'<hr>';
  19. }
  20. // test2的子空间
  21. namespace test1\test2\test3 {
  22. class Demo
  23. {
  24. //...
  25. }
  26. echo Demo::class,'<br>';
  27. // 在test3中访问上级空间
  28. echo \test1\test2\Demo::class,'<br>';
  29. echo \test1\Demo::class,'<br>';
  30. // 全局成员:前面加上全局空间的标识符:\
  31. echo \Demo::class,'<br>';
  32. }
  33. // 全局空间
  34. namespace {
  35. class Demo
  36. {
  37. }
  38. }
批改状态:合格

老师批语:

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
  • 博主信息
    吳
    博文
    44
    粉丝
    3
    评论
    0
    访问量
    3736
    积分:0
    P豆:90