Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 什么';s是静态方法的点,该方法返回类的实例,它';这是你的一部分吗?_Php_Class_Static_Singleton - Fatal编程技术网

Php 什么';s是静态方法的点,该方法返回类的实例,它';这是你的一部分吗?

Php 什么';s是静态方法的点,该方法返回类的实例,它';这是你的一部分吗?,php,class,static,singleton,Php,Class,Static,Singleton,有时,当我看到其他人编写的代码时,我会看到如下内容: <?php namespace sys\database; class Statistics { public function __construct() { // Database statistics are gathered here using // private methods of the class and then set to // class prop

有时,当我看到其他人编写的代码时,我会看到如下内容:

<?php

namespace sys\database;

class Statistics {

    public function __construct() {
        // Database statistics are gathered here using
        // private methods of the class and then set to
        // class properties
    }

    public static function getInstance() {
        return new \sys\database\Statistics();
    }

    // ...

}
它只需将
$stats
设置为
Statistics
对象的一个实例,即可访问其类属性以获取各种数据库统计信息

我想知道为什么这样做而不是仅仅使用
$stats=new\sys\database\Statistics()。一天结束时,收集统计数据的所有逻辑都在构造函数中,
getInstance()
方法除了返回一个新对象之外,什么都不做


这里有我遗漏的东西吗?

这应该是Singleton模式的一个实现:

该模式用于不允许创建多个类实例


但是,您提供的实现存在两个缺陷:构造函数应该是私有的,类应该有一个私有的静态实例,每次调用
getInstance
方法时都会返回该实例。

这应该是Singleton模式的实现:

该模式用于不允许创建多个类实例


但是,您提供的实现存在两个缺陷:构造函数应该是私有的,并且应该有一个类的私有静态实例,每次调用
getInstance
方法时都会返回。

这是类的[bad]实现


根据经验,您应该避免使用这种模式,而选择更方便的模式。

这是一种[糟糕的]实现


例如,根据经验,您应该避免使用这种模式,以方便使用。

这应该是Singleton模式的实现,Singleton模式是一个术语,用于描述运行时只能存在一次的类

但是,您的实现似乎存在缺陷,因为:

  • 没有检查类是否存在,并且
  • 代码可以通过直接调用构造函数来创建多个实例(它应该是私有的)

  • 这应该是Singleton模式的一个实现,Singleton模式是一个术语,用于描述一个在运行时只能存在一次的类

    但是,您的实现似乎存在缺陷,因为:

  • 没有检查类是否存在,并且
  • 代码可以通过直接调用构造函数来创建多个实例(它应该是私有的)

  • 通常,这是一种确保只获得一个单例类实例的方法。这涉及到通过将构造函数设为私有来阻止对它的访问,并在
    getInstance()
    中返回该实例之前使用一个静态属性来初始化该实例,所有这些都奇怪地从这个特定类中丢失。如文所述,,直接调用
    new
    确实是多余的。通常情况下,你会在单例模式中看到这一点。我认为,通常情况下,实例检索方法应该通过获取现有运行时可能已经创建的实例来节省资源。创建函数的要点通常是调用getInstance正在创建singleton对象。哦,你打字很快:)通常,这是一种确保你只得到一个单例类实例的方法。这涉及到通过将构造函数设为私有来阻止对它的访问,并在
    getInstance()
    中返回该实例之前使用一个静态属性来初始化该实例,所有这些都奇怪地从这个特定类中丢失。如文所述,,直接调用
    new
    确实是多余的。通常情况下,你会在单例模式中看到这一点。我认为,通常情况下,实例检索方法应该通过获取现有运行时可能已经创建的实例来节省资源。创建函数的要点通常是调用getInstance正在创建singleton对象。哦,你打字很快:)在大多数情况下,没有很好的单例模式实现:D为离题道歉:)@RoyalBg-true:)在大多数情况下,没有很好的单例模式实现:D为离题道歉:)@RoyalBg-true:)啊!现在这就更有意义了。我确实认为
    getInstance
    方法缺少一些东西。我会在几分钟内接受你的回答,当它让我:)啊!现在这就更有意义了。我确实认为
    getInstance
    方法缺少一些东西。我会在几分钟内接受你的回答,当它允许我:)
    $stats = \sys\database\Statistics::getInstance();