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

2021年02月24日 01:09:19阅读数:35博客 / 手机用户1605957906 / php

一.类成员的重载:

  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. }

效果预览:

批改状态:合格

老师批语:

全部评论

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

条评论
  • 博主信息
    手机用户1605957906
    博文
    38
    粉丝
    0
    评论
    0
    访问量
    2385
    积分:0
    P豆:78