147

PHPで静的クラスを作成し、C#のように動作させたいので、

  1. コンストラクターは、クラスへの最初の呼び出しで自動的に呼び出されます
  2. インスタンス化は不要

この種の何か...

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

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

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

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

6 に答える 6

211

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!


?>
于 2009-01-22T10:39:12.947 に答える
56

グレッグの答えに加えて、コンストラクターをプライベートに設定して、クラスをインスタンス化できないようにすることをお勧めします。

したがって、私の謙虚な意見では、これは 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!


?>
于 2012-07-20T09:49:39.060 に答える
24

これらの「静的」のようなクラスを持つことができます。しかし、本当に重要な何かが欠けていると思います.phpにはアプリサイクルがないため、アプリケーション全体で実際の静的(またはシングルトン)を取得できません...

PHPのシングルトンを参照してください

于 2009-01-22T10:44:34.903 に答える
5
final Class B{

    static $staticVar;
    static function getA(){
        self::$staticVar = New A;
    }
}

b の構造はシングトン ハンドラと呼ばれます。

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

これはシングルトンの使用です $a = a::getA(...);

于 2010-08-24T09:37:29.973 に答える
3

私は通常、通常の非静的クラスを作成し、ファクトリ クラスを使用してオブジェクトの単一 ( sudo static ) インスタンスをインスタンス化することを好みます。

このようにして、コンストラクターとデストラクタは通常どおりに機能し、必要に応じて追加の非静的インスタンスを作成できます (たとえば、2 番目の DB 接続)。

私はこれを常に使用しており、ページが終了するとデストラクタがセッションをデータベースにプッシュするため、カスタム DB ストア セッション ハンドラを作成するのに特に役立ちます。

もう 1 つの利点は、すべてがオンデマンドでセットアップされるため、呼び出す順序を無視できることです。

class Factory {
    static function &getDB ($construct_params = null)
    {
        static $instance;
        if( ! is_object($instance) )
        {
            include_once("clsDB.php");
            $instance = new clsDB($construct_params);   // constructor will be called
        }
        return $instance;
    }
}

DBクラス...

class clsDB {

    $regular_public_variables = "whatever";

    function __construct($construct_params) {...}
    function __destruct() {...}

    function getvar() { return $this->regular_public_variables; }
}

使いたい場所で電話するだけ...

$static_instance = &Factory::getDB($somekickoff);

次に、すべてのメソッドを非静的として扱います(それらは .

echo $static_instance->getvar();
于 2012-12-30T21:43:21.180 に答える
2

オブジェクトを静的に定義することはできませんが、これは機能します

final Class B{
  static $var;
  static function init(){
    self::$var = new A();
}
B::init();
于 2010-11-29T15:46:27.753 に答える