PHP延迟静态绑定:static关键字
PHP5.3中引入了延迟静态绑定的概念。该特性最明显的标志就是新关键字static。static类似于self,但它指的是被调用的类而不是包含类。在本例中,它的意思是调用Document::create()将生成一个新的Document对象,而不是试图实例化一个DomainObject对象。
因此,现在在静态上下文中使用继承关系。
abstract class DomainObject{
public static function create(){
return new static();
}
} class User extends DomainObject{ } class Document extends DomainObject{ } print_r(Document::create());
------------------------------------
Document Object
(
)
-------------------------------------
static 关键字不仅仅可以用于实例化。和self和parent一样,static还可以作为静态方法调用的标识符,甚至是从非静态上下文中调用。假设我想为DomainObject引入组的概念。默认情况下,所有类都属于default类别,但我想能为继承层次结构的某些分支重写类别。
abstract class DomainObject{
private $group; public function __construct(){
$this->group = static::getGroup();
} public static function create(){
return new static();
} static function getGroup(){
return "default";
}
} class User extends DomainObject{ } class Document extends DomainObject{
static function getGroup(){
return "document";
}
} class SpreadSheet extends Document{ } print_r(User::create());
print_r(SpreadSheet::create());
在DomainObject类中定义了构造函数。该构造函数使用static关键字调用静态方法getGroup()。DomainObject提供了默认实现,但Document将其覆盖了。我还创建了一个新类SpreadSheet,该类扩展了Document类。下面是输出:
---------------------------------------
User Object
(
[group:DomainObject:private] => default
)
SpreadSheet Object
(
[group:DomainObject:private] => document
)
---------------------------------------
User类不需要实现太多功能。DomainObject构造函数调用了getGroup()类,并在本地进行查找。对于SpreadSheet,虽然搜索从被调用的类SpreadSheet本身开始,但它没有提供任何实现,因此调用类Document中的getGroup()方法。PHP5.3以前未引入延迟静态绑定,self关键字只查找DomainObject类中的getGroup(),因此遇到self关键字的时候我无计可施。
PHP延迟静态绑定:static关键字的更多相关文章
- PHP延迟静态绑定 static关键字
示例代码1 abstract class Parent { } class Man extends Parent { public static function create(){ return n ...
- php5.3 延迟静态绑定 static关键字
//传统模式 --这段代码能很好工作,但大量的重复代码很烦人,不想为每个DomainObject子类都创建这段相同代码吧? /* abstract class DomainObject{} class ...
- PHP "延迟静态绑定" 功能,static
从这个名字的定义提取出两个关键点,第一点静态,也就是说这个功能只适用于静态属性或静态方法.第二点延迟绑定,这个根据下面代码就可以很好的理解 看一下这个例子: class A{ static $name ...
- php static延迟静态绑定
如果你是一个懒惰的程序员,你看到以下代码可能会恼火 abstract class U{ } class u1 extends U{ public static function create(){ r ...
- 父类方法返回子类实例:PHP延迟静态绑定
案例分析 先前的PHP项目中,看到类似于以下的一段代码: <?php class DBHandler { public function get() { } } class MySQLHandl ...
- 深入理解final和static关键字
深入理解final和static关键字 参考:http://blog.csdn.net/qq1028951741/article/details/53418852 final关键字 final关键字可 ...
- PHP延迟静态绑定(本文属于转发)
这段时间看项目后台的PHP代码,看到了类似于以下的一段代码,我把它抽出来: <?php class DBHandler { function get() {} } class MySQLHand ...
- php中static关键字的理解
函数内的static变量 static静态变量的理解 静态变量 类型说明符是static. 静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在 静态存储区内分配存储单元),该区域中的数据在整 ...
- PHP延迟静态绑定
类可以自下往上调用父类方法,如果需要在父类中根据不同的子类,来调用子类的方法,那么就需要延迟静态绑定.延迟静态绑定用的是保留关键词static. 所谓延迟静态绑定,顾名思义,静态调用时::符号左侧的部 ...
随机推荐
- Python数据类型(3)
字符串(str):单引号''.双引号""嵌套使用,可以不使用转义字符:'abc"dd"ef'."acc'd'12",字符串不可以是多行的三单 ...
- hover事件优化(延时操作)
JQ的hover事件拓展 编写原因:当鼠标滑过某个带有hover事件的元素,但是仅仅是路过,并不是希望查看此部分内容的时候,效果不理想 $.fn.extend({ delayed : function ...
- Android监听Home键
监听广播 ACTION_CLOSE_SYSTEM_DIALOGS private void registerHomeReceiver(){ IntentFilter homeFilter = new ...
- 24 个你应该了解的 PHP 库
24 个你应该了解的 PHP 库 2015-09-08 分类:WEB开发.编程开发.首页精华暂无人评论 来源:伯乐在线 分享到:更多3 二十万年薪PHP工程师培养计划 成为被疯抢的And ...
- Linux下安装vsftpd
一.安装vsftpd及相关依赖包 #vsftpd安装程序 yum install vsftpd #vsftpd虚拟登陆账户必要依赖包 yum install pam* db4* 安装完之后,vsftp ...
- react-native 问题总结
给npm换源 1.通过config配置指向国内源 npm config set registry http://registry.cnpmjs.org //配置指向源 npm info express ...
- c# 对于批量表的统一查询 WM_CONCAT行列转换行数
//需要显示的列 sql = string.Format(@" SELECT WM_ ...
- vi/vim
config file location 1. MinGW: C:\MinGW\msys\1.0\share\vim\vimrc 2. Linux: home config file content ...
- mysql qps tps计算
Information from web QPS (Query per second) (每秒查询量)TPS(Transaction per second) (每秒事务量,如果是InnoDB会显示,没 ...
- 个人对AutoResetEvent和ManualResetEvent的理解(转载)
仅个人见解,不对之处请指正,谢谢. 一.作用 AutoResetEvent和ManualResetEvent可用于控制线程暂停或继续,拥有重要的三个方法:WaitOne.Set和Reset. 这三个方 ...