php - 扩展 PHP 中的单例类

标签 php singleton

<?php
class LoveBase
{
    protected static $_instance = NULL;
    protected function __construct() {}
    public static function app()
    {
        if(self::$_instance == NULL) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    public function get()
    {
        return 'LoveBase';
    }

}

class Love extends LoveBase
{
    public static function app()
    {
        if(self::$_instance == NULL) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }
    public function get()
    {
        return 'Love';
    }
}

// Print "LoveLove" in this case(first case)
echo Love::app()->get(); 
echo LoveBase::app()->get();

// Print "LoveBaseLoveBase" in this case(second case)
// echo LoveBase::app()->get();
// echo Love::app()->get();
  • 为什么两种不同的方法得出相同的结果?
  • 比较这两种情况,当它的类首先实例化时,该方法将起作用。

  • (对不起,我英语不好,希望你能说得通)

    最佳答案

    您定义了两个静态函数,它们都使用相同的静态变量 ($_instance) - 基类的静态成员也可以通过子类访问(只要它不是私有(private)的)。请记住,静态的东西(方法和变量)会被继承,但不会被克隆。

    解决方案:将成员变量设为私有(private),并为每个类创建一个。

    class LoveBase
    {
        private static $_instance = NULL;
        // ...
    
    class Love extends LoveBase
    {
        private static $_instance = NULL;
        // ...
    

    关于php - 扩展 PHP 中的单例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11193902/

    相关文章:

    php - 更新MySQL表的特定记录

    ios - 来自 iOS 中不同 ViewController 时用于更改行为的全局变量/单例的替代方案。

    java - id使用单例/同步的Web服务增量变量

    ios 10+、Swift 3+ - 无法从 Singleton 实例中消除 UIAlertController

    javascript - 我真的需要一个单例吗?

    php - 使用 HTTP 身份验证以编程方式下载文件

    php - MySQL 处理通过 AJAX 和 PHP 对喜欢/不喜欢系统进行投票

    Php将多个字符串分配给一个变量

    php - 访问 Laravel 4 Composer 包 Assets

    c++ - 注册每个 C/C++ 源文件以创建已用源的运行时列表