当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《是否可以在PHP中创建静态类(如在C#中)?》经验,为你挑选了3个好方法。

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

    第一次调用类时会自动调用构造函数

    无需实例化

这种东西......

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

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

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

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

Greg.. 195

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

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


我经常这样做只是为了将功能集中在一个地方.IE Utility :: doSomethingUseful(); (18认同)

取而代之的`所以你必须创建一个initialize()函数,并调用它在每个方法:`它会更容易使`initialize`公共函数和类的声明之后调用它. (15认同)

我知道这已经很老了,但现在你可以使用魔法[__callStatic](http://php.net/manual/en/language.oop5.overloading.php#object.callstatic)所以当你调用任何静态方法或任何东西时,它会首先调用`__callStatic`,在那里你可以看到它是否被初始化然后执行`self :: $ method`或者你正在调用的任何东西.如果它仍在直接调用方法,请尝试将所有内容更改为私有并查看. (4认同)


Phil.. 50

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

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


@EricHerlitz这个问题不是关于单身人士,而是关于静态课程.为什么要创建一个继承自要实例化的类的静态类? (4认同)

同样将类声明为抽象,以防止它被实例化,并且仍然允许调用静态方法. (3认同)


Andreas Nied.. 24

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

请参阅PHP中的Singleton



1> Greg..:

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

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



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

2> Phil..:

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

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



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

3> Andreas Nied..:

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

请参阅PHP中的Singleton


@downvoter:小心告诉我,为什么你不喜欢我的答案(或者为什么是错的),这样我才能改进它?!
推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有