为了账号安全,请及时绑定邮箱和手机立即绑定

不是很理解$ins在单例中是怎么发生的作用?

不是很理解$ins在单例中是怎么发生的作用?

PHP
catspeake 2023-04-24 19:15:23
class conf{protected static $ins=null;protected $data=array();final protected function __construct(){include ('include/config.inc.php');$this->data=$_CFG;}final protected function __clone(){}public static function getIns(){if(self::$ins instanceof self ){return $this->data[$key];}else{return null;}}public function __set($key,$value){$this_>data[$key]=$value;}}$conf=conf::getIns();
查看完整描述

2 回答

?
繁星coding

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变量,但内部却调用了,所以你应该再检查下你写的代码

查看完整回答
反对 回复 2023-04-27
?
慕勒3428872

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);


查看完整回答
反对 回复 2023-04-27
  • 2 回答
  • 0 关注
  • 117 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信