11:类常量魔术变量、抽象类与延迟绑定

PHP常量与魔术变量详解
本文深入解析PHP中的常量类型,包括普通常量、类常量的定义与使用,以及魔术变量的特性与作用。通过具体示例,阐述延迟绑定的概念,对比self与static关键字的差异,并介绍抽象类的定义与意义。

常量、类常量、魔术变量

  • 普通常量:define(‘常量名’,‘常量值’);

    • 全局可访问
    • 值不可改变
  • 类常量:const 常量名 = 常量值;

    • 在PHP7中
    • 类内可以访问,类外则根据权限的不同而定
    • 他与静态属性类似,唯一区别就是:值不可改变
    • 声明时不用加$符号
  • 魔术变量

    • 两个特点:

    • 无法手动修改这个变量的值

    • 魔术变量的值是随着环境的变动而改变的

    • 魔术变量很多,它们的作用很大,能在开发中帮助你快速高效的解决一些问题,所以请认真的翻阅一遍手册,对魔术变量都有那些,有一个大概的认知;

    • 几个小示例

      define('br','<br/>');
      
      echo '当前正在运行的是:',__FILE__,'文件';
      
      echo br;
      
      echo '当前在',__DIR__,'目录下';
      
      echo br;
      
      class A {
      	static function say(){
      		echo '当前类名为:',__CLASS__;
      	}
      }
      
      A::say();//当前类名为:A
      

延迟绑定

  • 问题描述:

    • 父类有一个静态公共的A方法和一个静态公共的B方法
    • 子类有一个静态公共的A方法
    • 静态调用子类的B方法,此时,输出什么?
  • 代码示例:

class A{
	static function haha(){
		echo '我是父类的haha方法';
	}

	static function hehe(){
		self::haha();
	}
}


class B extends A{
	static function haha(){
		echo '我是子类的haha方法';
	}
}


B::haha();
  • 结果:输出父类haha的echo;

  • 原因:因为self所在的位置是父类,

  • 但是!当self换成static时,结果就不一样了,换成static之后,输出的结果是子类的haha方法所输出的文字;

  • 为什么?

  • 因为self仅代表当前类,如果当前类没有,就是没有,报undefined;

  • static则是:如果子类有,就用子类的,如果子类没有,就用我自己的,如果子类也没有,我也没有,那就报错,undefined;

  • 上面的代码,self换成static之后,则优先使用子类的haha方法,如果子类没有haha方法,则使用父类的haha方法;

  • static会一直向上找,子类没有,我自己也没有,就向本类的父类找,向本类的父类的父类找,最终没有就报错;

抽象类

抽象类的定义

  • 就是对类进行抽象

  • 类前加abstract就是抽象类

  • 方法前加abstract就是抽象方法

  • 抽象方法不能有方法体

  • 抽象类,不能被New实例化

  • 有抽象方法的类都是抽象类

  • 抽象类内不一定有抽象方法

  • 抽象类其实就是起到了一个类模板,类的规范的作用;

抽象类的意义

  • 抽象类是不完整的,它的剩余功能是由子类来完成的
  • 也就是说,抽象类这个概念的存在,我们可以用于规范方法,生成一个类的模板,供大家比对着模板去写自己的方法
  • 中小型项目中,或者说团队人员较少的情况下,为了迅速的开发,抽象类这些什么规范是被摒弃的,如果你时间足够多,你可以尝试在多人协作的时候使用这些规范化的东西;

延迟绑定

  • 是指类的self的指向,不是以定义时为准,而是在运行时的计算结果为准;
  • 其实延期绑定很简单,就是运行时的指向;
  • 只要区分了self 和static 的区别就OK,self主要是只在本类找,而static是先从实例化对象的类中开始找,没有就向父级找,找到最终类还没找到,就报错;就这么简单;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值