您的位置:首页 > 编程语言 > PHP开发

php const , static 浅析

2016-03-11 10:52 537 查看

概要

了解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()方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: