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

20 浏览
0 Comments

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

我想在PHP中创建一个静态类,并使其像C#中的类一样运行,所以:\n

    \n

  1. 构造函数在第一次调用类时会自动调用
  2. \n

  3. 不需要实例化
  4. \n

\n类似于这样的内容...\n

class Hello {
    private static $greeting = 'Hello';
    private function __construct() {
        $greeting .= ' There!';
    }
    public static function greet(){
        echo $greeting;
    }
}
Hello::greet(); // Hello There!

0
0 Comments

在PHP中创建静态类(类似于C#)的问题的出现原因是,PHP没有应用程序循环,因此无法获得整个应用程序中的真正静态(或单例)。

解决方法是使用单例模式来实现类似于静态类的功能。可以参考以下链接中关于在PHP中实现单例模式的讨论和示例代码:

Singleton in PHP

静态类和单例模式是两种不同的概念。

0
0 Comments

从上述内容可以总结出,这个问题的出现原因是想要在PHP中创建类似于C#中的静态类。为了解决这个问题,可以将构造函数设置为私有,这样就无法实例化该类。此外,还可以将类声明为抽象类,这样也可以阻止实例化,并且仍然允许调用静态方法。

以下是一种解决方法的示例代码:


以上代码中,构造函数被设置为私有,阻止了类的实例化。通过静态方法`greet()`可以调用初始化方法,并输出`Hello There!`。

此外,如果想要防止类被实例化但仍允许调用静态方法,也可以将类声明为抽象类。

通过将构造函数设置为私有或将类声明为抽象类,可以在PHP中实现类似于C#中的静态类的效果。

0
0 Comments

在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一样。

0