我在考虑将每个类放入单独的文件中,并在类定义之外进行静态初始化。
问题在于,在实际需要该类之前就会发生初始化(它将在包含该类的文件被首次包含时发生)。这是一个问题,因为可能根本不使用该类,因此初始化是不必要的。我认为将已使用的文件包含到代码开头之外的做法很不好。
如果有人对这个问题有可行的解决方案,我将非常感激。
我在考虑将每个类放入单独的文件中,并在类定义之外进行静态初始化。
问题在于,在实际需要该类之前就会发生初始化(它将在包含该类的文件被首次包含时发生)。这是一个问题,因为可能根本不使用该类,因此初始化是不必要的。我认为将已使用的文件包含到代码开头之外的做法很不好。
如果有人对这个问题有可行的解决方案,我将非常感激。
看一下这样的代码。它使用数据库的单例实例,但你仍然可以创建类的实例:
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()
返回单例以访问数据库。这里有一个单例模式的问题...如果在创建类的实例之前使用静态方法...那么静态初始化程序就没有运行...所以你可能会说可以在每个静态方法中运行初始化程序...这是正确的,但是对于只是获取和设置静态变量的情况呢?我想也可以使用__get和__set魔术函数来实现...只是语言本身不支持静态初始化...以下是解决方法:
在Hi.php文件中:
class Hi{
public static $v = "0";
}
Hi::$v= "2";
// end of Hi.php file
每个类都使用一个 .php 文件... 并在类定义外部进行静态初始化...
当一个类未被找到时,你可能需要查找 __autoload 函数并调用它来包含包含该类的文件。你可以在该函数中放置静态初始化器。
使用单例模式而不是静态调用:
<?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
}
}
这是我做这件事的方式。唯一的成本是每次构造时测试 $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
}
}
简单,而且它将所有内容都保留在类内部。