php const , static 浅析

概要

  • 了解const, static 在class中的基本使用
  • 了解const, static 的语义差别以及使用场景
  • php static 特有的 “后期静态绑定”
  • const, static 最佳实践

const

  • 类中始终保持不变的值定义为常量 , 与其他语言语义一致;
  • 类外也能定义(更常用define);
  • 定义和使用常量的时候不需要使用 $ 符号;
  • 常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用;
  • 类中定义const不具备封装性 (无法使用public, private, protecte关键字)
  • const or define ?
    • define 具备全局性 (命名空间失效)
    • define 值可以为表达式 , 形如 define('E', 10 * 20 * 30);
  • 基本使用
//类中定义
class Cls { const N = 'const_val'; }

//调用方法1: 通过类名调用
echo Cls::N;

//调用方法2: 通过类对象调用
$obj = new Cls();
echo $obj::N;

//类外定义
const N = 3;
echo N;

const N = 1 * 2 * 3; // 不合法,不是数学运算结果

static

  • static 关键字来定义静态方法和属性。与其他语言语义一致
  • 具备不同的封装性(允许使用public, private, protected关键字)
  • 基本使用
class Cls {
    // 定义,允许使用 public/protected/private 关键字
    // 有$符号
    public static $staticVar = "static_var";
    // 只能通过::访问,注意$符号,缺少$符号会被认为是访问类常量
    function func() {  echo $this::$staticVar; /* 或者self::$staticVar; */ }
 }
(new Cls)->func();

关于静态绑定 和 后期静态绑定

静态方法中无法使用$this伪变量, 使用 self::访问在继承中可能导致问题

class Base
{
    public static function func() { echo "Base func"; }
    public static function anotherFunc() { self::func(); }

}

class Derived extends Base
{
    public static function func() { echo "Derived func "; }
}

Derived::anotherFunc(); // "Base func"

使用 self:: 表示对当前类的静态引用,取决于定义当前方法所在的类。然而我们预期是达到形如C++动态绑定的效果,如何解决?, php.net提供了几个解决方案:
1. 使用get_called_class() 动态确定当前类名
2. 使用static::访问静态方法


class Base
{
    public static function func() { echo "Base func"; }
    public static function func1() { static::func(); }

    public static function func2() { $clsName = get_called_class(); $clsName::func(); }
}

class Derived extends Base
{
    public static function func() { echo "Derived func "; }
}

Derived::func1(); // "Derived func"
Derived::func2(); // "Derived func"

最佳实践

  • 区分const, define, static的不同语义,方便根据具体场景使用, const 一般用于类常量(不可修改), define用于定义全局性质的常量, static 不用于定义对象级别的属性
  • 常量定义, 类常量使用const, 类外常量使用define, 命名规范: 大写+下划线分词
  • 调用类静态方法 使用 static:: 访问
  • 动态获取当前类名使用get_called_class()方法
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值