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::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 ,它被调用并应该包含包含该类的文件。您可以将静态初始化程序放在该函数中。

于 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 回答