//传统模式 --这段代码能很好工作,但大量的重复代码很烦人,不想为每个DomainObject子类都创建这段相同代码吧?
/* abstract class DomainObject{} class User extends DomainObject
{
public function __construct()
{
echo __METHOD__;
} public static function create()
{
return new self();
} }
class Document extends DomainObject
{
public function __construct()
{
echo __METHOD__;
} public static function create()
{
return new self();
} }
User::create();
Document::create();
*/ //能否这么干? 实例化最初调用者,谁调用实例化谁。但是这里self是指向的抽象类DomainObject
//fatal error: Cannot instantiate abstract class DomainObject 无法实例化抽象方法
/*
abstract class DomainObject
{
public static function create()
{
return new self();
}
} class User extends DomainObject{}
class Document extends DomainObject{}
User::create();
*/ //5.3后 可以使用static关键字,延迟静态绑定,通俗的就是,static 指向的是最初调用者
abstract class DomainObject
{
public static function create()
{
return new static();
}
}
class User extends DomainObject
{
public function __construct()
{
echo __METHOD__;
} }
class Document extends DomainObject
{
public function __construct()
{
echo __METHOD__;
}
}
User::create(); //User::__construct
Document::create(); //Document::__construct

/***********static 关键字不仅仅可以用于实例化,和self和parent一样,static还可以作为静态方法调用标识符**************/

 abstract class DomainObject
{
private $group;
public function __construct()
{
//$this->group = self::getGroup();
$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()); // [group:DomainObject:private] => default
print_r(Document::create()); // [group:DomainObject:private] => document
print_r(SpreadSheet::create()); // [group:DomainObject:private] => document

php5.3 延迟静态绑定 static关键字的更多相关文章

  1. PHP延迟静态绑定 static关键字

    示例代码1 abstract class Parent { } class Man extends Parent { public static function create(){ return n ...

  2. PHP延迟静态绑定:static关键字

    PHP5.3中引入了延迟静态绑定的概念.该特性最明显的标志就是新关键字static.static类似于self,但它指的是被调用的类而不是包含类.在本例中,它的意思是调用Document::creat ...

  3. php static延迟静态绑定

    如果你是一个懒惰的程序员,你看到以下代码可能会恼火 abstract class U{ } class u1 extends U{ public static function create(){ r ...

  4. PHP "延迟静态绑定" 功能,static

    从这个名字的定义提取出两个关键点,第一点静态,也就是说这个功能只适用于静态属性或静态方法.第二点延迟绑定,这个根据下面代码就可以很好的理解 看一下这个例子: class A{ static $name ...

  5. 父类方法返回子类实例:PHP延迟静态绑定

    案例分析 先前的PHP项目中,看到类似于以下的一段代码: <?php class DBHandler { public function get() { } } class MySQLHandl ...

  6. PHP延迟静态绑定(本文属于转发)

    这段时间看项目后台的PHP代码,看到了类似于以下的一段代码,我把它抽出来: <?php class DBHandler { function get() {} } class MySQLHand ...

  7. php中static关键字的理解

    函数内的static变量 static静态变量的理解 静态变量 类型说明符是static. 静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在 静态存储区内分配存储单元),该区域中的数据在整 ...

  8. 深入理解final和static关键字

    深入理解final和static关键字 参考:http://blog.csdn.net/qq1028951741/article/details/53418852 final关键字 final关键字可 ...

  9. PHP的final关键字、static关键字、const关键字

    在PHP5中新增加了final关键字,它可以加载类或类中方法前.但不能使用final标识成员属性,虽然final有常量的意思,但在php中定义常量是使用define()函数来完成的. final关键字 ...

随机推荐

  1. 详解UE4静态库与动态库的导入与使用

    转自:http://blog.csdn.net/u012999985/article/details/71554628 一.基本内容概述   最近做项目时经常看到build.cs文件,就想研究一下UE ...

  2. 提示ORA-01144: File size (13107200 blocks) exceeds maximum of 4194303 blocks 最大4194303 block(转)

    并不是100g的表空间,是100g的数据文件.一般情况下,单个数据文件的最大为32g.解决方法:1.创建多个数据文件,都不能超过32g2.创建大表空间.create bigfile tablespac ...

  3. Erasure Coding(纠删码)深入分析

    http://blog.sina.com.cn/s/blog_57f61b490102viq9.html 1.前言 Swift升级到2.0大版本后宣称开始支持纠删码,这其实是一个很有意义的特性,主要是 ...

  4. python-pycharm中使用anaconda部署python环境

    pycharm中使用anaconda部署python环境 今天来说一下python中一个管理包很好用的工具anaconda,可以轻松实现python中各种包的管理.相信大家都会有这种体验,在pycha ...

  5. tornado-简单的服务器

    安装tornado pip install tornado 安装sqlalchemy 1.大概代码的解释 import tornado.ioloop #开启循环,等待访问 import tornado ...

  6. OpenCL 存储器次序的验证

    ▶ <OpenCL异构并行编程实战>P224 的代码,先放上来,坐等新设备到了再执行 //kernel.cl __global ); // 全局原子对象 __kernel void mem ...

  7. Mysql replace into

    mysqlsql serverinsert 在向表中插入数据的时候,经常遇到这样的情况:1. 首先判断数据是否存在: 2. 如果不存在,则插入:3.如果存在,则更新. 在 SQL Server 中可以 ...

  8. hive 下篇

    由于spark on hive 问题,导致无法插入数据,暂时使用spark进行hive操作 向分区表插入数据 hive> show partitions customers;OKpartitio ...

  9. jpa-入门测试

    package com.atguigu.jpa.test; import java.util.Date;import java.util.List; import javax.persistence. ...

  10. 使用Travis进行持续集成

    使用Travis进行持续集成 廖雪峰 持续集成:Continuous Integration,简称CI,意思是,在一个项目中,任何人对代码库的任何改动,都会触发CI服务器自动对项目进行构建,自动运行测 ...