在PHP中是否可以创建静态类(类似于C#)?
在PHP中是否可以创建静态类(类似于C#)?
我想在PHP中创建一个静态类,并使其像C#中的类一样运行,所以:\n
- \n
- 构造函数在第一次调用类时会自动调用
- 不需要实例化
\n
\n
\n类似于这样的内容...\n
class Hello { private static $greeting = 'Hello'; private function __construct() { $greeting .= ' There!'; } public static function greet(){ echo $greeting; } } Hello::greet(); // Hello There!
在PHP中创建静态类(类似于C#)的问题的出现原因是,PHP没有应用程序循环,因此无法获得整个应用程序中的真正静态(或单例)。
解决方法是使用单例模式来实现类似于静态类的功能。可以参考以下链接中关于在PHP中实现单例模式的讨论和示例代码:
静态类和单例模式是两种不同的概念。
在PHP中,可以创建静态类,但它们不会自动调用构造函数(如果尝试调用self::__construct()
,会出现错误)。因此,您需要创建一个initialize()
函数,并在每个方法中调用它。
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!
我经常这样做,将函数封装在一个地方。例如,使用Utility::doSomethingUseful()
。
与其说“因此,您需要创建一个initialize()函数,并在每个方法中调用它:”,不如将initialize
函数声明为公共函数,并在类的声明之后立即调用它。
我知道这篇文章已经很旧了,但现在你可以使用魔术方法__callStatic,当调用任何静态方法或其他内容时,它首先调用__callStatic
,在那里您可以看到是否已初始化,然后执行self::$method
或您正在调用的任何内容。如果仍然直接调用方法,请尝试将所有内容更改为私有,并查看结果。
如果同时有两个线程调用greet
会发生什么?由于没有同步机制,initialize
会被调用两次(在这种情况下是可以的,但在许多其他情况下是不行的)。或者PHP是单线程且非抢占式的,就像Node.js一样。