博客列表 >类成员重载-全局成员-命名空间声明访问分解合并-子空间访问任何空间成员

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

葡萄枝子
葡萄枝子原创
2021年02月23日 00:38:11756浏览

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

  1. 描述类成员重载的原理与实现,并实例演示;
  2. 全局成员有哪几种,有什么特点,并实例演示;
  3. 实例演示空间的声明与空间成员的访问;
  4. 实例演示空间成员的分解与合并操作;
  5. 实例演示子空间,并在子空间中访问任何空间中的成员的方式;

1. 描述类成员重载的原理与实现,并实例演示

  • 访问或设置类中不存在的属性或方法时,调用的魔术方法
  1. class Demo
  2. {
  3. // 私有属性
  4. private $data = [];
  5. // 公开方法
  6. public function data()
  7. {
  8. return $this->data;
  9. }
  10. // 设置类中不存在的属性时调用
  11. public function __set($name, $value)
  12. {
  13. $this->data[$name] = $value;
  14. }
  15. // 访问类中不存在的属性时调用
  16. public function __get($name)
  17. {
  18. if (isset($this->data[$name]))
  19. return $this->data[$name];
  20. return 'Property ' . $name . ' not exist.';
  21. }
  22. // 访问类中不存在的方法时调用
  23. public function __call($name, $arguments)
  24. {
  25. if (method_exists($this, $name))
  26. return call_user_func_array([$this, $name], $arguments);
  27. return 'Method ' . $name . ' not exist.';
  28. }
  29. // 访问类中不存在的静态方法时调用
  30. public static function __callStatic($name, $arguments)
  31. {
  32. return 'Static Method: ' . $name . ', args: ' . implode(',', $arguments);
  33. }
  34. // 对象当字符串使用时调用
  35. public function __toString()
  36. {
  37. return 'Magic Method: ' . __FUNCTION__;
  38. }
  39. // 对象当函数使用时调用
  40. public function __invoke()
  41. {
  42. return 'Magic Method: ' . __FUNCTION__;
  43. }
  44. // 对象序列化时调用
  45. public function __sleep()
  46. {
  47. return ['Magic Method', __FUNCTION__];
  48. }
  49. // 对象反序列化时调用
  50. public function __wakeup()
  51. {
  52. echo 'Magic Method: ' . __FUNCTION__;
  53. }
  54. }
  55. $obj = new Demo();
  56. // 设置类中不存在的属性
  57. $obj->hello = 'hello world!';
  58. // hello world!
  59. echo $obj->hello, '<br>';
  60. // 访问类中不存在的属性
  61. // Property world not exist.
  62. echo $obj->world, '<br>';
  63. // 访问类中存在的方法
  64. // Array ( [hello] => hello world! )
  65. echo print_r($obj->data(), true), '<br>';
  66. // 访问类中不存在的方法
  67. // Method func not exist.
  68. echo $obj->func(), '<br>';
  69. // 访问类中不存在的静态方法
  70. // Static Method: func, args: hello,world!
  71. echo Demo::func('hello', 'world!'), '<br>';
  72. // 对象当字符串使用时
  73. // Magic Method: __toString
  74. echo $obj, '<br>';
  75. // 对象当函数使用时
  76. // Magic Method: __invoke
  77. echo $obj(), '<br>';
  78. // 对象序列化时
  79. $serObj = serialize($obj);
  80. // O:4:"Demo":2:{s:12:"Magic Method";N;s:7:"__sleep";N;}
  81. echo $serObj, '<br>';
  82. // 对象反序列化时
  83. // Magic Method: __wakeup
  84. unserialize($serObj);
  85. echo '<hr>';

属性方法重载

2. 全局成员有哪几种,有什么特点,并实例演示

  • 全局成员:类,常量,函数
  • 特点:不能重复声明
  1. // 类
  2. class App
  3. {
  4. public $app = __CLASS__;
  5. }
  6. // 常量
  7. const APP = 'Helo App';
  8. // 函数
  9. function app()
  10. {
  11. return __FUNCTION__;
  12. }
  13. // 类
  14. // App
  15. echo (new App)->app, '<br>';
  16. // 常量
  17. // Helo App
  18. echo APP, '<br>';
  19. // 函数
  20. // app
  21. echo app(), '<br>';

全局成员

3. 实例演示空间的声明与空间成员的访问

  • 新建一个 0222-2.php 文件
  1. // 全局空间
  2. namespace {
  3. // 类
  4. class App
  5. {
  6. public $app = 'App';
  7. }
  8. // 常量
  9. const APP = 'Helo App';
  10. // 函数
  11. function app()
  12. {
  13. return 'app';
  14. }
  15. // 类
  16. // App
  17. echo App::class, '<br>';
  18. // 常量
  19. // APP
  20. echo APP::class, '<br>';
  21. // 函数
  22. // app
  23. echo app::class, '<hr>';
  24. }
  25. // 命名空间
  26. namespace Ns {
  27. // 类
  28. class App
  29. {
  30. public $app = 'App';
  31. }
  32. // 常量
  33. const APP = 'Helo App';
  34. // 函数
  35. function app()
  36. {
  37. return 'app';
  38. }
  39. // 类
  40. // Ns\App
  41. echo App::class, '<br>';
  42. // 常量
  43. // Ns\APP
  44. echo APP::class, '<br>';
  45. // 函数
  46. // Ns\app
  47. echo app::class, '<hr>';
  48. }

命名空间

4. 实例演示空间成员的分解与合并操作

  • 将上面命名空间 Ns 分解到 0222-3.php 合并 0222-3-1.php, 0222-3-2.php, 0222-3-3.php

  • 新建 0222-3.php

  1. // 命名空间
  2. namespace Ns;
  3. require '0222-3-1.php';
  4. require '0222-3-2.php';
  5. require '0222-3-3.php';
  6. // 类
  7. // Ns\App
  8. echo App::class, '<br>';
  9. // 常量
  10. // Ns\APP
  11. echo APP::class, '<br>';
  12. // 函数
  13. // Ns\app
  14. echo app::class, '<hr>';
  • 新建 0222-3-1.php
  1. // 命名空间
  2. namespace Ns {
  3. // 类
  4. class App
  5. {
  6. public $app = 'App';
  7. }
  8. }
  • 新建 0222-3-2.php
  1. // 命名空间
  2. namespace Ns {
  3. // 常量
  4. const APP = 'Helo App';
  5. }
  • 新建 0222-3-3.php
  1. // 命名空间
  2. namespace Ns {
  3. // 函数
  4. function app()
  5. {
  6. return 'app';
  7. }
  8. }
  • 运行合并文件 0222-3.php 图

空间成员分解合并

5. 实例演示子空间,并在子空间中访问任何空间中的成员的方式

  • 子空间访问其它空间使用绝对路径

  • 新建 0222-4.php

  1. // 全局空间
  2. namespace {
  3. const HELLO = 'hello world!';
  4. }
  5. // 命名空间
  6. namespace Ns {
  7. // 类
  8. class App
  9. {
  10. public $app = 'App';
  11. }
  12. // 全局空间
  13. // hello world!
  14. echo \HELLO, '<hr>';
  15. }
  16. // 子空间
  17. namespace Ns\Ns1 {
  18. // 常量
  19. const APP = 'Helo App';
  20. // 当前空间 - 常量
  21. // Ns\Ns1\APP
  22. echo APP::class, '<br>';
  23. // 父空间 - 类
  24. // Ns\App
  25. echo \Ns\App::class, '<br>';
  26. // 全局空间
  27. // hello world!
  28. echo \HELLO, '<hr>';
  29. }
  30. // 子子空间
  31. namespace Ns\Ns1\Ns2 {
  32. // 函数
  33. function app()
  34. {
  35. return 'app';
  36. }
  37. // 父空间 - 类
  38. // Ns\App
  39. echo \Ns\App::class, '<br>';
  40. // 子空间 - 常量
  41. // Ns\Ns1\APP
  42. echo \Ns\Ns1\APP::class, '<br>';
  43. // 当前空间 - 函数
  44. // Ns\Ns1\Ns2\app
  45. echo app::class, '<br>';
  46. // 全局空间
  47. // hello world!
  48. echo \HELLO, '<hr>';
  49. }

子空间访问成员

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