Blogger Information
Blog 41
fans 0
comment 0
visits 41102
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP类的重载和命名空间(声明|调用|分解与合并|子空间和子空间的调用)
幸福敲门的博客
Original
727 people have browsed it
  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. }

图示:
命名空间

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post