我正在考虑将每个类放入一个单独的文件中,并在类定义之外进行静态初始化。
这个问题是初始化将在实际需要所述类之前发生(当包含该类的文件首次被包含时将发生)。这是一个问题,因为可能会发生该类根本不会被使用,因此初始化是不必要的。我认为将所用文件包含在代码开头的做法只是一种肮脏的技术。
如果有人对此问题有可行的解决方案,我将不胜感激。
答案 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
}
}
简单,它可以保持课堂内的所有内容。