欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

描述类成员的重载、全局成员以及命名空间

程序员文章站 2022-01-15 11:02:01
...

一.类成员的重载:

  1. 属性重载: __get(),__set()
  2. 方法重载: __call(),__callStatic

函数__get()样式代码:

  1. class Col
  2. {
  3. protected $data = [
  4. 'username' => 'HSFFLT',
  5. ];
  6. // 属性重载: 拦截器
  7. public function __get($name)
  8. {
  9. // 通常会创建一个获取器,动态的生成一个方法名称
  10. $method = 'get' . ucfirst($name);
  11. if (method_exists($this, $method)) {
  12. return $this->$method($name);
  13. }
  14. }
  15. // 获取器
  16. public function getUsername($name)
  17. {
  18. if (!isset($this->data[$name])) {
  19. $this->data[$name] = 0;
  20. } else {
  21. return $this->data[$name];
  22. }
  23. }
  24. }
  25. // 实例化
  26. $obj = new Col;
  27. // 访问一个属性
  28. echo $obj->username;

效果预览:

描述类成员的重载、全局成员以及命名空间

函数__set()样式代码:

  1. class Col
  2. {
  3. protected $data = [];
  4. // 属性重载: 拦截器
  5. public function __get($array)
  6. {
  7. // 通常会创建一个获取器,动态的生成一个方法名称
  8. $method = 'get' . ucfirst($array);
  9. return $this->$method($array);
  10. }
  11. public function getEmail($array)
  12. {
  13. if (!isset($this->data[$array])) {
  14. $this->data[$array] = 0;
  15. } else {
  16. return $this->data[$array];
  17. }
  18. }
  19. // __set:当访问不存在可无权限设置的属性时自动调用
  20. public function __set($array, $value)
  21. {
  22. $method = 'set' . ucfirst($array);
  23. return $this->$method($array, $value);
  24. // echo $method;
  25. }
  26. // 设置器
  27. public function setEmail($array, $value)
  28. {
  29. $this->data[$array] = $value;
  30. }
  31. }
  32. // 实例化
  33. $obj = new Col;
  34. // 访问一个属性
  35. $obj->email = '123456';
  36. echo $obj->email;

效果预览:

描述类成员的重载、全局成员以及命名空间

函数call()和callStatic样式代码:

  1. class Demo
  2. {
  3. // 方法也可以重载
  4. public function __call($name, $arguments)
  5. {
  6. // 这里只做一件事,请求转发
  7. return $name. '['.implode(',',$arguments).']';
  8. }
  9. // 当访问一个不存在的静态方法时,会定位到下面这个魔术方法中
  10. public static function __callStatic($name, $arguments)
  11. {
  12. return $name. '['.implode(', ',$arguments).']';
  13. }
  14. }
  15. // 实例化
  16. $obj = new Demo;
  17. echo '__call: '. $obj->hello(1,2,3),'<hr>';
  18. echo'__callStatic: '. Demo::test('H','E','L','O','O');

效果预览:

描述类成员的重载、全局成员以及命名空间

二.全局成员:类, 常量, 函数:

样式代码:

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

效果预览:

描述类成员的重载、全局成员以及命名空间

三.空间的声明与空间成员的访问:

样式代码:

  1. <?php
  2. // 命名空间: 解决全局成员的命名冲突
  3. namespace So {
  4. // 类
  5. class Mno
  6. {
  7. //...
  8. }
  9. // 常量
  10. const PATH = 'MnonM';
  11. // 函数
  12. function MnO()
  13. {
  14. // ...
  15. }
  16. echo Mno::class . ' 类', '<br>';
  17. echo PATH::class . ' 常量', '<br>';
  18. echo MnO::class . ' 函数', '<hr>';
  19. }
  20. // 全局空间
  21. namespace {
  22. // 类
  23. class Kind
  24. {
  25. //...
  26. }
  27. // 常量
  28. const PATH = 'Kintaba';
  29. // 函数
  30. function set()
  31. {
  32. // ...
  33. }
  34. echo Kind::class . ' 类', '<br>';
  35. echo PATH::class . ' 常量', '<br>';
  36. echo set::class . ' 函数', '<hr>';
  37. }

效果预览:

描述类成员的重载、全局成员以及命名空间

四.空间成员的分解与合并

  1. 为了防止一个空间中的代码过大,可以考虑将同一个空间的代码写到多个脚本中
  2. 将文件demo6.php分解到demo6-1.phpdemo6-2.phpdemo6-3.php这三个文件,再由这三个文件合并成一个

demo6.php样式代码:

  1. <?php
  2. // 同名空间成员的组织方式
  3. namespace NO;
  4. require 'demo6-1.php';
  5. require 'demo6-2.php';
  6. require 'demo6-3.php';
  7. // 类
  8. echo Demo1::class, '<br>';
  9. // 常量
  10. echo Demo2::class, '<br>';
  11. // 函数
  12. echo Demo3::class, '<hr>';

demo6-1.php样式代码:

  1. <?php
  2. namespace NO;
  3. // 类
  4. class Demo1
  5. {
  6. // 我有500行代码
  7. }

demo6-2.php样式代码:

  1. <?php
  2. namespace NO{
  3. // 常量
  4. //此处有800行代码
  5. }

demo6-3.php样式代码:

  1. <?php
  2. namespace NO{
  3. // 函数
  4. // 此处1200行代码
  5. }

合并效果预览:

描述类成员的重载、全局成员以及命名空间

五.子空间访问任何空间的成员方法:

样式代码:

  1. <?php
  2. // 父空间
  3. // namespace: 用在空间中,表示当前空间的引用,类似于$this或self
  4. namespace nos1 {
  5. class Name
  6. {
  7. // ...
  8. }
  9. echo Name::class, '<br>';
  10. // 访问它的子空间成员
  11. echo nos2\Name::class, '<br>';
  12. echo nos2\nos3\Name::class, '<hr>';
  13. }
  14. // nos1的子空间
  15. namespace nos1\nos2 {
  16. class Name
  17. {
  18. // ...
  19. }
  20. echo Name::class, '<br>';
  21. echo nos3\Name::class, '<hr>';
  22. }
  23. // nos2的子空间
  24. namespace nos1\nos2\nos3 {
  25. class Name
  26. {
  27. // ...
  28. }
  29. echo Name::class, '<br>';
  30. // 在nos3中,访问上级空间怎么办?
  31. echo \nos1\nos2\Name::class, '<br>';
  32. echo \nos1\Name::class, '<br>';
  33. // 全局成员:前面加上全局空间的标识符: \
  34. echo \Name::class,'<hr>';
  35. }

效果预览:

描述类成员的重载、全局成员以及命名空间