3

すべてのクラスを別のファイルに入れ、クラス定義の外で静的初期化を行うことを考えています。

これに関する問題は、前述のクラスが実際に必要になる前に初期化が行われるという事実です (クラスを含むファイルが初めてインクルードされるときに発生します)。クラスがまったく使用されない可能性があるため、初期化が不要になる可能性があるため、これは問題です。そして、コードの先頭にない使用済みファイルを含めるという慣行は、単に汚いテクニックだと思います。

誰かがこの問題に対する実行可能な解決策を持っているなら、私はそれを大いに感謝します.

4

5 に答える 5

3

このようなコードを見てください。データベースのシングルトンインスタンスを使用しますが、クラスのインスタンスを作成することもできます。

class DB
{
    private static $_db;

    public static function pdo()
    {
        if (is_null(self::$_db))
        {
            self::$_db=new PDO('pgsql:host=localhost;
                                port=5432;
                                dbname=testdb;
                                user=postgres;
                                password=abc123');
            self::$_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }

        return self::$_db;
    }

public static function factory()
{
    return new self;
}

private function __construct() {}

DBのインスタンスが必要な場合は、を実行しますDB::factory()。DBはself::pdo()、データベースにアクセスするためにシングルトンを返すために使用します。

于 2009-09-15T18:11:36.980 に答える
3

ここでシングルトンの答えには問題があります...クラスのインスタンスが作成される前に静的メソッドを使用すると...静的初期化子は実行されていません...したがって、すべての静的で初期化子を実行できると言うかもしれませんメソッド...それは本当ですが、静的変数を取得して設定するだけではどうですか...これには__getおよび__setマジック関数も使用できると思います...静的をサポートしていないという点で言語に問題があります初期化...これができる方法です...

ファイル Hi.php:

class Hi{
public static $v = "0";
}

Hi::$v= "2";
// end of Hi.php file

クラスごとに単純に.phpファイルを使用し、クラス定義の外で静的初期化を行います...

于 2010-10-28T21:06:07.507 に答える
2

__autoload が呼び出され、そのクラスを含むファイルをインクルードすることになっているクラスが見つからない場合は、 __autoload を検索することができます。その関数に静的初期化子を入れることができます。

于 2009-09-15T18:16:28.403 に答える
0

静的呼び出しの代わりにシングルトン パターンを使用します。

<?php
class Foo {

   protected static $_instance;

   /**
   * @return Foo
   */
   public static function getInstance() {
        return (null === self::$_instance)? 
            self::$_instance :
            self::$_instance = new Foo();
   }

   protected function __construct() {
        // initialize here
   }
}
于 2009-09-15T18:57:29.180 に答える
0

これが私のやり方です。唯一のコストは、作成するたびに $doneinit 静的メンバーをテストすることです。

class Foo {
   private static $doneinit=false;

   private static init() {
      // do static initialisation here

      self::$doneinit=true;
   }

   public function __construct() {
      if (!self::$doneinit) self::init();

      // go on to do the rest of construction
   }
}

シンプルで、すべてをクラス内に保持します。

于 2010-05-26T13:59:01.677 に答える