通过工厂模式来认识PHP的静态延迟绑定

通过简单的工厂模式来认识PHP的静态延迟绑定

<?php
abstract class Demo
{
    public static $name = ‘sallency‘;
    
    //error
    public static function selfInstance() {
        //self是用来解析上下文
        //此处的语境为调用定义它的类
        //抽象类不可实例化所以会报错
        return new self();
    }
    
    public static function staticInstance() {
        //static是用来调用上下文
        //此处的语境为解析调用它的上下文(某个类)
        //若是非抽象类调用的话自然可以实例化
        return new static ();
    }
}

class StaticDemo extends Demo
{
    public function __construct() {
        echo "i am construct of " . __CLASS__ . ‘<br/>‘;
        echo self::$name;
    }
}
var_dump(StaticDemo::staticInstance());
var_dump(Demo::$name);//抽象类只是不能实例化对象
?>

注意抽象类里的selfInstance方法是错误的,内部使用的return new self()是解析上下文,即调用此方法最初定义的地方,最初是在抽象类中,自然实例化报错

在类中 new self() new static()都可以实例化类对象,但self是解析上下文,即实例化定义自己的类,static则是根据当前上下文是哪一类在调用自己而将自己指向此类

静态延迟绑定

new self();

实例化一个自己被定义的类的对象

new parent();

实例化一个自己的父类对象

new static();

实例化一个调用自己的当前类的对象

时间: 2024-10-10 13:13:04

通过工厂模式来认识PHP的静态延迟绑定的相关文章

PHP静态延迟绑定简单示例

没怎么用过这个新特性,其实也不算新啦,试试吧,现在静态类的继承很方便了 <?php class A { protected static $def = '123456'; public static function test() { echo get_class(new static); } public static function test2() { echo static::$def; } } class B extends A { protected static $def = '4

数据持久化、单例、重载【添加对不可访问的成员的操作】、魔术方法、类常量、static关键字对self的补充【静态延迟绑定实现$this的效果】、参数类型约束【参数前加类名】、遍历【iterator接口】、快速排序

1.数据持久化过程[传输(例如表单提交或php交互mysql)和保存过程] 使用的是字符串形式的流数据. 数据流就是为了传输[按照序列的形式进行传输] [http://baike.baidu.com/link?url=0MtUQMhFzc_EwJc09rXZV8KlfOL4jis6XNbRfmGA3rQhDcGwOp8togLVQjXBV34M] 所以将其他类型数据转化为字符串的过程也是序列化的过程 [这个概念和图片.视频的流媒体的区别?] [注意点] 另外mysql中sql语句中的某些关键词为

PHP静态延迟绑定和普通静态效率简单对比

只是一个简单的小实验,对比了下 延迟绑定 和 非延迟的效率 延迟绑定主要就是使用 static 关键字来替代原来的 self ,但功能非常强大了 实验代码: class A { protected static $cc1 = array('a1', 'b', 'c', 'd'); protected static $cc2 = array('a2', 'b', 'c', 'd'); protected static $cc3 = array('a3', 'b', 'c', 'd'); prote

PHP静态延迟绑定

PHP 5.3.0中增加了一个static关键字来引用当前类,即实现了延迟静态绑定,同时PHP 5.3.0也实现get_called_class()函数用于查找当前被调用的类,而且允许使用变量作为类名调用静态属性或方法 (PHP 5 >= 5.3.0, PHP 7) get_called_class — 后期静态绑定("Late Static Binding")类的名称 说明 string get_called_class ( void ) 获取静态方法调用的类名. 返回值 返回

设计模式之简单工厂模式Simple Factory(四创建型)

工厂模式简介. 工厂模式专门负责将大量有共同接口的类实例化 工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类. 工厂模式有三种形态: 1.简单工厂模式Simple Factory,又称静态工厂方法模式 2.工厂方法模式Factory Method,又称多态性工厂模式 3.抽象工厂模式Abstract Factory,又称工具箱模式 2.什么是简单工厂模式 简单工厂模式是类的创建模式.是由一个工厂对象决定创建出哪一种产品类的实例,是不同的工厂方法模式的一个特殊实现.由一个工厂

设计模式(二)工厂模式

实现了创建者和调用者的分离 详细分类: 简单工厂模式:用来生产同一等级结构中的任意产品.(用于增加新的产品,需要修改已有代码) 工厂方法模式:用来生产同一等级结构中的固定产品.(支持增加任意产品) 抽象工厂模式:用来生产不同产品族的全部产品.(对于增加新的产品,无能为力,支持增加产品族) 核心本质: 实例化对象,用工厂方法代替new操作.将选择实现类.创建对象统一管理和控制,从而将调用者跟我们的实现类解耦. 一.简单工厂模式: 要点:也叫静态工厂模式,就是工厂类一般是使用静态方法,通过接收的参数

java 简单工厂模式实现

简单工厂模式:也可以叫做静态工厂方法,属于类创建型模式,根据不同的参数,返回不同的类实现. 主要包含了三个角色: A.抽象产品角色 一般用接口 或是 抽象类实现 B.具体的产品角色,具体的类的实现 C 工厂角色,实例的产生,根据不同参数,返回不同的类的实现. 结合枚举类的实现代码如下: 1.抽象的产品角色: package factory.simple; /** * 抽象产品角色 交通工具接口 * * @author lilin * */ public interface Car { /** *

JAVA 设计模式 简单工厂模式

用途 简单工厂模式 (Simple Factory) 又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式通常是定义一个工厂类,这个类可以根据不同变量返回不同类的产品实例. 简单工厂模式是一种对象创建型模式 (可参考 设计模式 创建型模式). 但是简单工厂模式不属于23种Gof设计模式之一. 结构 如何实现一个具有加减乘除基本功能的计算器? 对于这四种运算来说,都需要两个操作数,差别仅在于返回的结果不同. 由此,我们可以抽象化它们的共性,提炼出一个父类.这个类中包含

理解工厂模式

一.简单工厂模式,因为创建对象的方法是static的,所以也叫静态工厂模式. 由来:静态工厂模式是为了对产品类有统一的创建方法,而对于客户端如何创建"产品"是不需要知道也不需要管的. 通过客户端提供的信息,new出不同的“产品” 关键代码: class Factory(){ public static Farther(){ if("sub1"){ return new Sub1(); }else if("sub2"){ return new Su