怎么让一个类只被实例化一次? $_SESSION['mycart']=new myCart();如题;声明:if(!isset($_SESSION['mycart'])) $_SESSION['mycart']=new myCart();不好使.谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 供参考。<?phpsession_start();class a{ var $a; function a() { $_SESSION['a_init'] = 1; } function b() { } }$b = new a();if($_SESSION['a_init'] == 1) echo "已实例化";?> 首先要说明你的PHP的版本4.x还是5.x。不同的版本对面向对象的支持不一样!PHP 5.x的话和其他面向对象程序设计语言的Singleton设计是类似的。(里面有static成员函数和private访问控制修饰符)PHP 4.x的话一般是通过命名约定,也就是给静态调用的成员函数取__staticMF()这样的名字。然后再$GLOBALS里面放置一个此类的对象。然后每次使用时调用“静态”的__getInstance()函数。 /** * return a class's singleton * * @param string $classname * @return object */function & getSingleton($classname) {//TODO registry register static $objs = array(); if (isset($objs[$classname])) { return $objs[$classname]; } if (!class_exists($classname)) { loadClass($classname); } $objs[$classname] = new $classname(); return $objs[$classname];} 上面的函数中的loadClass,是我定义的另一个函数你可以改成,require 'xxx.php';//其中xxx.php是定义那个类的文件 我的例子和iasky的类似 <?class SingleClass{ public static function getInstance(){ static $single; if($single==null){ $single=new SingleClass(); return $single; }else return $single; } private $t=null; function __construct(){ $this->t=date("Y/m/d h:i:s"); echo "SingleClass construct ".$this->t; }}SingleClass::getInstance();SingleClass::getInstance();SingleClass::getInstance();?>每次都调用 SingleClass::getInstance(); 就可以得到这个类的实例并且只被初始化一次 单件模式就可以:class singleDataBase { //私有数据库属性 private $type; private $config; //私有数据库连接对象 private $CONN; //私有构造函数 //禁止类外调用,保证类不能外面实例化. private function __construct($inType = null,$inConfig = null) { $this->type = intval($inType); $this->config = $inConfig; switch(intval($this->type)) { //这里个人代码........ } private static $DB = null; //私有静态返回对象. //通过null来判断出该对象是否已经建立过,假如建立过则返回数据对象. private static function setDb($inType = null,$inConfig = null) { if(self::$DB === null) { self::$DB = new singleDataBase($inType,$inConfig); } return self::$DB; } //提供公有静态调用接口,来调用 私有静态返回实例. public static function getDb($inType = null,$inConfig = null) { return self::setDb($inType,$inConfig); }}$db = singleDataBase::getDb(1,5);var_dump($db); 不知道这是不是你想要的:class ClassUser{ ..... function &instance($uid) { static $instance; if (!isset($instance)) { $instance = new ClassUser($uid); } return $instance; } .....}$oUser = ClassUser::instance($uid); 补充:实例化时应该是:$oUser &= ClassUser::instance($uid); $oUser =& ClassUser::instance($uid); 等php6,或php7看吧。要不自己改改源代码。 上面的都离题万里...可能要到php8 这些参数如何设置? PHP 忽略数据类型插入数据 这两个表达式,怎么会给我把数字过滤了,如果要他不过滤数字,该怎么写。 php 如何去除回车换行符 关于XML的问题 php + mysql 存图片的问题 PHP访问 https://问题请教 求一正则替换的函数。。请进来~~ 请教一个问题:为什么程序在服务器上不能使用 请问php中的一些变量代表什么? 字符串分割数组问题..在线等 谁有 session 保存在数据库中的完整源代码?(100分求源代码,不够再加)
<?php
session_start();
class a
{
var $a;
function a()
{
$_SESSION['a_init'] = 1;
}
function b()
{
}
}
$b = new a();
if($_SESSION['a_init'] == 1) echo "已实例化";
?>
不同的版本对面向对象的支持不一样!PHP 5.x的话和其他面向对象程序设计语言的Singleton设计是类似的。
(里面有static成员函数和private访问控制修饰符)PHP 4.x的话一般是通过命名约定,也就是给静态调用的成员函数取__staticMF()这样的名字。
然后再$GLOBALS里面放置一个此类的对象。然后每次使用时调用“静态”的__getInstance()函数。
* return a class's singleton
*
* @param string $classname
* @return object
*/
function & getSingleton($classname)
{
//TODO registry register static $objs = array(); if (isset($objs[$classname]))
{
return $objs[$classname];
}
if (!class_exists($classname))
{
loadClass($classname);
}
$objs[$classname] = new $classname();
return $objs[$classname];
}
<?class SingleClass{ public static function getInstance(){
static $single;
if($single==null){
$single=new SingleClass();
return $single;
}else return $single;
} private $t=null; function __construct(){
$this->t=date("Y/m/d h:i:s");
echo "SingleClass construct ".$this->t;
}
}SingleClass::getInstance();
SingleClass::getInstance();
SingleClass::getInstance();
?>每次都调用 SingleClass::getInstance(); 就可以得到这个类的实例并且只被初始化一次
class singleDataBase {
//私有数据库属性
private $type;
private $config;
//私有数据库连接对象
private $CONN;
//私有构造函数
//禁止类外调用,保证类不能外面实例化.
private function __construct($inType = null,$inConfig = null) {
$this->type = intval($inType);
$this->config = $inConfig;
switch(intval($this->type)) {
//这里个人代码........
}
private static $DB = null;
//私有静态返回对象.
//通过null来判断出该对象是否已经建立过,假如建立过则返回数据对象.
private static function setDb($inType = null,$inConfig = null) {
if(self::$DB === null) {
self::$DB = new singleDataBase($inType,$inConfig);
}
return self::$DB;
}
//提供公有静态调用接口,来调用 私有静态返回实例.
public static function getDb($inType = null,$inConfig = null) {
return self::setDb($inType,$inConfig);
}
}
$db = singleDataBase::getDb(1,5);
var_dump($db);
class ClassUser
{
.....
function &instance($uid)
{
static $instance;
if (!isset($instance)) {
$instance = new ClassUser($uid);
}
return $instance;
}
.....
}
$oUser = ClassUser::instance($uid);
实例化时应该是:
$oUser &= ClassUser::instance($uid);
可能要到php8