经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » PHP » 查看文章
PHP匿名类的用法
来源:cnblogs  作者:硬核项目经理  时间:2021/2/18 15:43:31  对本文有异议

在PHP7之后,PHP中加入了匿名类的特性。匿名类和匿名方法让PHP成为了更现代化的语言,也让我们的代码开发工作越来越方便。我们先来看看匿名类的简单使用。

  1. // 直接定义
  2. $objA = new class
  3. {
  4. public function getName()
  5. {
  6. echo "I'm objA";
  7. }
  8. };
  9. $objA->getName();
  10. // 方法中返回
  11. function testA()
  12. {
  13. return new class
  14. {
  15. public function getName()
  16. {
  17. echo "I'm testA's obj";
  18. }
  19. };
  20. }
  21. $objB = testA();
  22. $objB->getName();
  23. // 作为参数
  24. function testB($testBobj)
  25. {
  26. echo $testBobj->getName();
  27. }
  28. testB(new class{
  29. public function getName()
  30. {
  31. echo "I'm testB's obj";
  32. }
  33. });

一次性给出了三种匿名类的使用方法。匿名类可以直接定义给变量,可以在方法中使用return返回,也可以当做参数传递给方法内部。其实,匿名类就像一个没有事先定义的类,而在定义的时候直接就进行了实例化。

  1. // 继承、接口、访问控制等
  2. class A
  3. {
  4. public $propA = 'A';
  5. public function getProp()
  6. {
  7. echo $this->propA;
  8. }
  9. }
  10. trait B
  11. {
  12. public function getName()
  13. {
  14. echo 'trait B';
  15. }
  16. }
  17. interface C
  18. {
  19. public function show();
  20. }
  21. $p4 = 'b4';
  22. $objC = new class($p4) extends A implements C
  23. {
  24. use B;
  25. private $prop1 = 'b1';
  26. protected $prop2 = 'b2';
  27. public $prop3 = 'b3';
  28. public function __construct($prop4)
  29. {
  30. echo $prop4;
  31. }
  32. public function getProp()
  33. {
  34. parent::getProp();
  35. echo $this->prop1, '===', $this->prop2, '===', $this->prop3, '===', $this->propA;
  36. $this->getName();
  37. $this->show();
  38. }
  39. public function show()
  40. {
  41. echo 'show';
  42. }
  43. };
  44. $objC->getProp();

匿名类和普通类一样,可以继承其他类,可以实现接口,当然也包括各种访问控制的能力。也就是说,匿名类在使用方面和普通类并没有什么不同。但如果用get_class()获取类名将是系统自动生成的类名。相同的匿名类返回的名称当然也是相同的。

  1. // 匿名类的名称是通过引擎赋予的
  2. var_dump(get_class($objC));
  3. // 声明的同一个匿名类,所创建的对象都是这个类的实例
  4. var_dump(get_class(testA()) == get_class(testA()));

那么匿名类中的静态成员呢?当然也和普通类一样,静态成员是属于类而不是实例的。

  1. // 静态变量
  2. function testD()
  3. {
  4. return new class{
  5. public static $name;
  6. };
  7. }
  8. $objD1 = testD();
  9. $objD1::$name = 'objD1';
  10. $objD2 = testD();
  11. $objD2::$name = 'objD2';
  12. echo $objD1::$name;

当类中的静态变量修改时,所有类实例的这个静态变量都会跟着变化。这也是普通类静态成员的特性。

测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/201912/source/PHP%E5%8C%BF%E5%90%8D%E7%B1%BB%E7%9A%84%E7%94%A8%E6%B3%95.php

参考文档:
https://www.php.net/manual/zh/language.oop5.anonymous.php

关注公众号:【硬核项目经理】获取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料

知乎、公众号、抖音、头条搜索【硬核项目经理】

B站ID:482780532

原文链接:http://www.cnblogs.com/zyblog-coder/p/14375991.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号