PHP类的重载和命名空间(声明|调用|分解与合并|子空间和子空间的调用)

2021年02月24日 08:13:21阅读数:38博客 / 幸福敲门的博客 / PHP
  1. 描述类成员重载的原理与实现,并实例演示;
  2. 全局成员有哪几种,有什么特点,并实例演示;
  3. 实例演示空间的声明与空间成员的访问;
  4. 实例演示空间成员的分解与合并操作;
  5. 实例演示子空间,并在子空间中访问任何空间中的成员的方式;

一、类成员重载的原理与实现

PHP提供的“重载”是指动态的“创建”类属性和方法。是通过魔术方法来实现的。
当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。
所有的重载方法都必须被声明为 public。
在给不可访问属性赋值时,set() 会被调用。
读取不可访问属性的值时,
get() 会被调用。
当对不可访问属性调用 isset() 或 empty() 时,isset() 会被调用。
当对不可访问属性调用 unset() 时,
unset() 会被调用。
参数$name是指要操作的变量名称。set()方法的$value参数指定了$name变量的值。
属性重载只能在对象中进行。在静态方法中这些魔术方法是无效的。因此,这些魔术方法都不能声明为static。
示例:使用
get(),set(),isset()和__unset()进行属性重载

  1. <?php
  2. class Demo1
  3. {
  4. protected $data = [
  5. 'username' => 'liushuchang2007'
  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 Demo1;
  55. echo $obj->username,'<br>';
  56. $obj->email = 'liushuchang@sina.com.cn';
  57. echo $obj->mail;
  58. echo '<br>';
  59. echo $obj->world(66,77,99);
  60. echo '<br>';
  61. echo Demo1::test('e','f','g');

图示:
类成员重载

二、PHP中的全局成员

PHP中的全局成员有:类(class),常量(const),函数(function);
全局成员的特点是:一旦定义就不能重复声明

  1. <?php
  2. // 类
  3. class Love
  4. {
  5. public $love = __CLASS__;
  6. }
  7. echo (new love)->love.'这是类','<hr>';
  8. // 常量
  9. const PRYUE = 'You'.'你是常量吗';
  10. echo PRYUE,'<hr>';
  11. // 函数
  12. function set()
  13. {
  14. return __FUNCTION__;
  15. }
  16. echo set().'函数','<hr>';

图示:
全局成员

三、空间的声明与空间成员的访问

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

图示:

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

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

图示:
命名空间

批改状态:合格

老师批语:

全部评论

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

条评论
  • 博主信息
    幸福敲门的博客
    博文
    37
    粉丝
    0
    评论
    0
    访问量
    5520
    积分:0
    P豆:154