我应该如何弥补PHP中缺少静态初始化器?

时间:2009-09-15 17:58:49

标签: php static-initializer

我正在考虑将每个类放入一个单独的文件中,并在类定义之外进行静态初始化。

这个问题是初始化将在实际需要所述类之前发生(当包含该类的文件首次被包含时将发生)。这是一个问题,因为可能会发生该类根本不会被使用,因此初始化是不必要的。我认为将所用文件包含在代码开头的做法只是一种肮脏的技术。

如果有人对此问题有可行的解决方案,我将不胜感激。

5 个答案:

答案 0 :(得分: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()返回单例以访问数据库。

答案 1 :(得分:3)

单例答案在这里有一个问题...如果在创建类的实例之前使用静态方法...那么静态初始化程序还没有运行...所以你可能会说可以运行初始化程序在每个静态方法中......这是真的,但是如何获取和设置静态变量...我想也可以使用__get和__set魔术函数...这个语言只是一个问题,因为它确实存在不支持静态初始化......这是可行的方式......

在文件Hi.php中:

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

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

简单地使用每个类的.php文件...并在。之外进行静态初始化 班级定义......

答案 2 :(得分:2)

如果未找到类,则可能会查找__autoload,并且应该包含该文件包含该类。您可以在该函数中放置静态初始值设定项。

答案 3 :(得分: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
   }
}

答案 4 :(得分: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
   }
}

简单,它可以保持课堂内的所有内容。