`
OrangeHolic
  • 浏览: 260913 次
  • 来自: 北京
社区版块
存档分类
最新评论

PHP延迟静态绑定

    博客分类:
  • PHP
PHP 
阅读更多
最近项目中遇到这样一个case,感觉所有的Model类都须是单例性能更高.因为所有的model皆继承统一父类BaseModel,所以在BaseModel中添加控制单例的代码,简单演示如下:
/*基类*/
class BaseModel
{

    private static $instance = null;

    public static function instance()
    {

        if (empty(self::$instance)) {

            self::$instance = new self();
        }

        return self::$instance;
    }
}

然后是各个逻辑子类Model
/*商品类*/
class GoodModel extends BaseModel{

    public function getInfoById($goodId){

        return array(
            'id'=>$goodId,
            'name'=>'小苹果',
            'logo'=>'http://t3.qlogo.cn/mbloghead/65518bb9e5287fcd5864/180'
        );
    }
}

################################################################
$good = GoodModel::instance();

var_dump($good);

此类$good 为
object(BaseModel)#1 (0) {
}

非需要的GoodModel


这是就需要介绍self

self::调用的变量只是该类的 即使该类被继承 变量被重写 调用父类里的函数 self::调用的变量还是输出父类的变量值 而不会输出被重写的值


所以需要采用static关键字延迟静态绑定,static代表了子类
代码如下
/*基类*/
class BaseModel
{

    private static $instance = null;

    public static function instance()
    {

        if (empty(self::$instance)) {

            self::$instance = new static();
        }

        return self::$instance;
    }
}

这时的$good 即为
object(GoodModel)#1 (0) {
}


其实也可用get_called_class函数来解决上面的问题,代码如下
class BaseModel
{

    private static $instance = null;

    public static function instance()
    {

        if (empty(self::$instance)) {

            $className = get_called_class();
            self::$instance = new $className();
        }

        return self::$instance;
    }
}















分享到:
评论

相关推荐

    简单谈谈php延迟静态绑定

    PHP延迟静态绑定是一种在PHP 5.3版本中引入的新特性,它解决了在静态方法中引用当前调用类(而不是定义方法时的类)的问题。这个特性使得在静态上下文中可以更加灵活地处理继承关系,避免了在多态场景下的意外行为。...

    php延迟静态绑定实例分析

    本文实例讲述了php延迟静态绑定的方法。分享给大家供大家参考。具体分析如下: php延迟静态绑定:指类的self,不是以定义时为准,而是以计算时的运行结果为准。先看一个实例 <?php header("content-type:text/...

    PHP延迟静态绑定的深入讲解

    PHP中的延迟静态绑定是PHP 5.3及以上版本中引入的一个特性,它允许在继承的类中调用静态方法时,能够指定在运行时应该调用哪个类的方法。这个特性在解决一些特定编程问题时非常有用,比如在使用工厂模式或者当子类...

    PHP延迟静态绑定示例分享

    延迟静态绑定是PHP语言在5.3版本之后引入的一个特性,它允许我们在使用静态方法时,决定调用的是哪个类的方法,而不是在编写代码时就固定死。这种特性尤其在类继承的场景下特别有用。下面我们将通过一个具体的示例来...

    PHP延迟静态绑定使用方法实例解析

    PHP中的延迟静态绑定是一种在面向对象编程中解决静态方法或者属性继承问题的技术。在PHP 5.3.0版本之前,当我们需要在基类中引用一个被子类覆盖的静态属性或者静态方法时,通常会遇到困难。这是因为,使用关键字`...

    PHP Static延迟静态绑定用法分析

    PHP中延迟静态绑定是自PHP 5.3版本引入的一个新特性,它主要是为了解决在面向对象编程中,尤其是在类的继承场景中,静态方法或属性在运行时的实际类确定问题。在PHP早期版本中,使用self关键字在父类中引用静态成员...

    详解PHP后期静态绑定分析与应用

    PHP 后期静态绑定是PHP 5.3版本引入的一个特性,它主要涉及到类的静态方法和静态属性的调用。这个概念的核心在于,当在类的静态方法中使用`self`、`parent`关键字时,它们的解析不再在编译阶段固定,而是延迟到运行...

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

    在PHP 5.3.0之后引入的静态延迟绑定(也称为后期静态绑定)提供了一种新的方式,用于引用调用当前静态方法的最终类名。这一点与传统的静态方法调用(使用self关键字)有所不同。本文将详细介绍PHP中静态延迟绑定和...

    PHP后期静态绑定之self::限制实例分析

    静态绑定包括所有静态方法和静态变量的引用,而延迟静态绑定特指在运行时动态解析静态方法和静态变量的引用。理解这两种绑定方式的区别,对于写出更清晰和符合预期的PHP代码至关重要。 PHP的字符串处理也是开发者...

    PHP类与对象后期静态绑定操作实例详解

    后期静态绑定通过关键字static实现,其核心思想是“延迟绑定”,不同于早期的静态绑定,后者会在编译时刻就确定调用哪个类的方法。后期静态绑定会记录下上一个非转发调用的类名,这个记录是在代码执行过程中动态进行...

    PHP历史经典5.3.29完整版包含所有文件夹

    其次,PHP 5.3增加了延迟静态绑定(Late Static Binding)。这解决了在静态方法中引用调用者类的问题,特别是在继承链中。延迟静态绑定使得静态方法可以正确地访问到被实例化对象的类,而不是定义方法的那个父类。 ...

    浅谈Laravel中的一个后期静态绑定

    关于 PHP 的 new static 延迟静态绑定,或者叫后期静态绑定,在 Laravel 中遇到一个使用上的问题。如下,在 Laravel 中调用 Model 新增数据的时候,首先给 Model 加了一个获取分表的方法: protected function ...

    PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定

    尽管如此,PHP 5.3.0之后引入了后期静态绑定(Late Static Bindings),使用static::关键字可以调用当前类或其子类中重写的静态方法,而无需关心当前类是否继承自其他类。 后期静态绑定使得我们能够更加灵活地控制...

Global site tag (gtag.js) - Google Analytics