是否可以在PHP中创建静态类(如在C#中)?

ale*_*emb 135 php oop static design-patterns

我想在PHP中创建一个静态类,并使其行为与在C#中的行为相同,所以

  1. 第一次调用类时会自动调用构造函数
  2. 无需实例化

这种东西......

static class Hello {
    private static $greeting = 'Hello';

    private __construct() {
        $greeting .= ' There!';
    }

    public static greet(){
        echo $greeting;
    }
}

Hello::greet(); // Hello There!
Run Code Online (Sandbox Code Playgroud)

Gre*_*reg 195

您可以在PHP中使用静态类,但它们不会自动调用构造函数(如果您尝试调用self::__construct(),则会收到错误).

因此,您必须创建一个initialize()函数并在每个方法中调用它:

<?php

class Hello
{
    private static $greeting = 'Hello';
    private static $initialized = false;

    private static function initialize()
    {
        if (self::$initialized)
            return;

        self::$greeting .= ' There!';
        self::$initialized = true;
    }

    public static function greet()
    {
        self::initialize();
        echo self::$greeting;
    }
}

Hello::greet(); // Hello There!


?>
Run Code Online (Sandbox Code Playgroud)

  • 我经常这样做只是为了将功能集中在一个地方.IE Utility :: doSomethingUseful(); (18认同)
  • 取而代之的`所以你必须创建一个initialize()函数,并调用它在每个方法:`它会更容易使`initialize`公共函数和类的声明之后调用它. (15认同)
  • 我知道这已经很老了,但现在你可以使用魔法[__callStatic](http://php.net/manual/en/language.oop5.overloading.php#object.callstatic)所以当你调用任何静态方法或任何东西时,它会首先调用`__callStatic`,在那里你可以看到它是否被初始化然后执行`self :: $ method`或者你正在调用的任何东西.如果它仍在直接调用方法,请尝试将所有内容更改为私有并查看. (4认同)

Phi*_*hil 50

除了Greg的回答之外,我还建议将构造函数设置为private,以便无法实例化该类.

所以在我的拙见中,这是一个基于Greg的更完整的例子:

<?php

class Hello
{
    /**
     * Construct won't be called inside this class and is uncallable from
     * the outside. This prevents instantiating this class.
     * This is by purpose, because we want a static class.
     */
    private function __construct() {}
    private static $greeting = 'Hello';
    private static $initialized = false;

    private static function initialize()
    {
        if (self::$initialized)
            return;

        self::$greeting .= ' There!';
        self::$initialized = true;
    }

    public static function greet()
    {
        self::initialize();
        echo self::$greeting;
    }
}

Hello::greet(); // Hello There!


?>
Run Code Online (Sandbox Code Playgroud)

  • @EricHerlitz这个问题不是关于单身人士,而是关于静态课程.为什么要创建一个继承自要实例化的类的静态类? (4认同)
  • 同样将类声明为抽象,以防止它被实例化,并且仍然允许调用静态方法. (3认同)

And*_*air 24

你可以拥有那些"静态"类.但我想,缺少一些非常重要的东西:在php中你没有应用程序循环,所以你不会在整个应用程序中获得真正的静态(或单例)...

请参阅PHP中的Singleton

  • @downvoter:小心告诉我,为什么你不喜欢我的答案(或者为什么是错的),这样我才能改进它?! (7认同)
  • 静态类和单例只是两个不同的东西。 (2认同)

bor*_*rel 5

final Class B{

    static $staticVar;
    static function getA(){
        self::$staticVar = New A;
    }
}
Run Code Online (Sandbox Code Playgroud)

b 的结构称为单例处理程序,您也可以在 a 中执行此操作

Class a{
    static $instance;
    static function getA(...){
        if(!isset(self::$staticVar)){
            self::$staticVar = New A(...);
        }
        return self::$staticVar;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是单例使用 $a = a::getA(...);