资讯专栏INFORMATION COLUMN

【modernPHP专题(6)】类的延迟绑定(后期绑定)

adam1q84 / 2549人阅读

摘要:实例化对象里面的所在哪个类就返回哪个类。访问的是当前类有点像因为其是继承了的方法,而调用的。由此可见,他们的区别只有在继承中才能体现出来,如果没有任何继承,那么这两者是没有区别的。但如果是在静态方法内本类的话,最好还是用

以static::来调用,是在运行的那个时刻才执行绑定操作;

父类中有个方法是延迟绑定的,在子类::调用这个方法的时候它又回到调用的子类开始向上找;

example1:

</>复制代码

  1. class Human {
  2. public static function whoami() {
  3. echo "来自父类的whoami在执行";
  4. }
  5. public static function say() {
  6. self::whoami(); // 子类内没有say方法,找到了父类这里
  7. // 在这里的self 指的是 父类
  8. }
  9. public static function say2() {
  10. static::whoami(); // 子类也没有say2方法,又找到父类这里
  11. // 但是父类用static::whoami,
  12. // 指调用你子类自己的whoami方法
  13. }
  14. }
  15. class Stu extends Human{
  16. public static function whoami () {
  17. echo "来自子类的whoami在执行";
  18. }
  19. }
  20. // 来自父类的whoami在执行
  21. Stu::say();//调用Stu类的say方法,但Stu类没有say方法,就向其父类寻找,找到父类以后,发现父类的say方法里面又调用self::whoami();此时self里面其实是有两个whoami的方法,但由于本次调用发生的环境是在父类的say方法里面,所以它调用的是父类的whoami方法,不调用子类的whoami方法;
  22. echo PHP_EOL;
  23. // 来自子类的whoami在执行
  24. Stu::say2(); //调用Stu类的say2方法,但Stu类没有say2方法,就向其父类寻找,找到父类say2以后,发现父类的say2方法里面用了static延迟绑定了whoami方法,而此时发生调用的子类里面有whoami方法(如果没有就向父类寻找),所以在此时是绑定在子类的whoami上,所以这里调用的是子类的whoami方法;

example2:

</>复制代码

  1. class Animal {
  2. const age = 1;
  3. public static $leg = 4;
  4. public static function cry() {
  5. echo "呜呜
    ";
  6. }
  7. public static function t1() {
  8. self::cry();
  9. echo self::age,"
    ";
  10. echo self::$leg,"
    ";
  11. }
  12. public static function t2() {
  13. static::cry();
  14. echo static::age,"
    ";
  15. echo static::$leg,"
    ";
  16. }
  17. }
  18. class Human extends Animal {
  19. public static $leg = 2;
  20. public static function cry() {
  21. echo "哇哇
    ";
  22. }
  23. }
  24. class Stu extends Human {
  25. const age = 16;
  26. public static function cry() {
  27. echo "嘤嘤
    ";
  28. }
  29. }
  30. Stu::t1(); //呜呜,1,4
  31. /*
  32. ↑↑:一直找到Animal类,Animal类的t1方法是普通绑定,所以是呜呜,1,4
  33. */
  34. Stu::t2(); // 嘤嘤,16,2
  35. /*
  36. ↑↑:一直找到Animal类,Animal类的t2方法是延迟绑定,又回到Stu类开始找,Stu类有cry方法,所以是嘤嘤,有age属性所以是16,没有leg属性,然后向上找,一直找到既可,所以是2
  37. */
new static()与new self()

self - 就是这个类,是代码段里面的这个类。new self就是实例化本类;

static - PHP 5.3加进来的只得是当前这个类,有点像$this的意思,从堆内存中提取出来,访问的是当前实例化的那个类,那么 static 代表的就是那个类。

</>复制代码

  1. </>复制代码

    1. 由此可见,他们的区别只有在继承中才能体现出来,如果没有任何继承,那么这两者是没有区别的。但如果是在静态方法内new本类的话,最好还是用new static();

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31410.html

相关文章

  • modernPHP专题(3)】依赖注入与服务容器

    摘要:而依赖倒置原则的思想是,上层不应该依赖下层,应依赖接口。上面通过构造函数注入对象的方式,就是最简单的依赖注入当然注入不仅可以通过构造函数注入,也可以通过属性注入,上面你可以通过一个来动态为这个属性赋值。 依赖倒置和控制反转是一种编程思想,而依赖注入就是通过服务容器实现这种面向接口或者是面向抽象编程的思想 概念理解 依赖倒置原则 依赖倒置是一种软件设计思想,在传统软件中,上层代码依赖于下...

    terro 评论0 收藏0
  • modernPHP专题(8)】匿名函数和闭包

    摘要:匿名函数输出可以直接将匿名函数进行传递。报错,找不到变量之所以称为副本,是因为通过闭包传值到匿名函数内的变量值也是不能改变。该方法使用了一个作为回调函数。 匿名函数 // Example1 $func = function( $param ) { echo $param; }; $func( some string );//输出:some string // Example2...

    junnplus 评论0 收藏0
  • modernPHP专题(9)】匿名类

    摘要:复制当前闭包对象,绑定指定的对象和类作用域。类作用域,可以是对象,也可以是实例名称什么是匿名类先理解以下三个例子例闭包函数都是继承类返回匿名函数返回匿名函数,也就是闭包函数,所有闭包函数都是继承类输出例将一个匿名函数绑定到一个类中。 类结构 Closure { /* 方法 */ // 用于禁止实例化的构造函数 __construct ( void ) ...

    ninefive 评论0 收藏0
  • modernPHP专题(7)】生成器语法

    摘要:通过生成器来生成关联数组下面每一行是用分号分割的字段组合,第一个字段将被用作键名。正常来说,产生的是一个,它的成员变量与函数不存在别名引用关系。关键字在的版本,生成器允许从其他生成器,可迭代对象或数组通过关键字来生成对应的值输出 一般你在迭代一组数据的时候,需要创建一个数据,假设数组很大,则会消耗很大性能,甚至造成内存不足。 //Fatal error: Allowed memory ...

    jackwang 评论0 收藏0
  • modernPHP专题(4)】抽象类与接口

    摘要:抽象类支持抽象类和抽象方法。接口是一种特殊的抽象类,这种抽象类中只包含抽象方法和静态常量。对抽象类的使用是通过关键字。抽象类中可以声明各种类型成员变量,实现数据的封装。一个类可以同时实现多个接口,但一个类只能继承于一个抽象类。 抽象类 php5支持抽象类和抽象方法。类前加 abstract, 此类就成为抽象类,无法被实例化,此类天生就是用来被继承的,给子类提供了一个类的模板;类方法前加...

    Keven 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<