2 回答
TA贡献1797条经验 获得超4个赞
单例的作用是保证在类被调用的时候只被实例化一次
并且每次调用的都是该被实例化的类
作用可以思考,一个数据库链接,在一次访问中只需要一个数据库链接,并不应该产生多个数据库链接
实现的方式是通过声明一个静态变量,用来存储唯一的实例化对象
类被调用的方式不是童工new的实例化调用,为了保证不在外部被实例化,所以需要将__construct()实例化函数设置为私有或者子类继承,通过统一的调用接口调用,在你的例子里面就是getlns
该函数中判断了静态变量是否是满足自身的接口设定,不满足则实例化自己
你的代码在return $this->data[$key];这句应该是错误的
整个getlns应该改为如下
public static function getIns(){
if(!self::$ins instanceof self ){
self::$ins = new self():
}
return self::$ins;
}
你估计是写错了函数,你可以发现你的getlns中没哟$key变量,但内部却调用了,所以你应该再检查下你写的代码
TA贡献1848条经验 获得超6个赞
单例类只能被其自身实例化。要获得这样的一种结果, __construct()方法必须被标记为private。如果试图用private构造函数构造一个类,就会得到一个可访问性级别的错误。
要让单例类起作用,就必须使其为其他类提供一个实例,用它调用各种方法。单例类不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。结果
是单例类不会重复占用内存和系统资源,从而让应用程序的其它部分更好地使用这些资源。作为这一模式的一部分,必须创建一个空的私有__clone()方
法,以防止对象被复制或克隆。
返回实例引用的这个方法通常被命名为getTnstance()。这个方法必须是静态的,而且如果它还没有实例化,就必须进行实例化。getInstance() 方法通过使用 instanceof 操作符和self 关键字,可以检测到类是否已经被实例化。
/* 例子:数据库连接职责的集中控制 */
class Database { private $_db ; static $_instance ; private function __construct() { $this ->_db = pg_connect( 'dbname=example_db' ); } private __clone() {}; public static function getInstance() { if ( ! (self:: $_instance instanceof self) ) { self:: $_instance = new self(); } return self:: $_instance ; } public function query( $sql ) { // 使用 $this->_db 执行一个查询 return pg_query( $this ->_db, $sql ); } } |
这个代码可以正常进行查询之类的
$db =Database::getInstance(); $db ->query( $sql ); |
- 2 回答
- 0 关注
- 117 浏览
添加回答
举报