怎么让一个类只被实例化一次?

时间:2021-03-21 17:53:02
$_SESSION['mycart']=new myCart();如题;
声明:if(!isset($_SESSION['mycart'])) $_SESSION['mycart']=new myCart();
不好使.谢谢

23 个解决方案

#1


把实例化的标记记录到实例的属性里.

根据标记去确定,是否需要实例化.

#2


楼上的能详细点吗?谢谢,初学者

#3


你自己new不就不会实例

#4


供参考。
<?php
session_start();
class a
{
  var $a;
  
function a()
{
$_SESSION['a_init'] = 1;
}
function b()
{
}

}
$b = new a();
if($_SESSION['a_init'] == 1) echo "已实例化";
?>

#5


首先要说明你的PHP的版本4.x还是5.x。
不同的版本对面向对象的支持不一样!

PHP 5.x的话和其他面向对象程序设计语言的Singleton设计是类似的。
(里面有static成员函数和private访问控制修饰符)

PHP 4.x的话一般是通过命名约定,也就是给静态调用的成员函数取__staticMF()这样的名字。
然后再$GLOBALS里面放置一个此类的对象。然后每次使用时调用“静态”的__getInstance()函数。

#6


帮顶

#7


/**
 * 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];
}

#8


上面的函数中的loadClass,是我定义的另一个函数

你可以改成,require 'xxx.php';//其中xxx.php是定义那个类的文件

#9


学习

#10


我的例子和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(); 就可以得到这个类的实例并且只被初始化一次

#11


mark!

#12


学习

#13


单件模式就可以:
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);

#14


~~

#15


不知道这是不是你想要的:
class ClassUser
{
   .....
   function &instance($uid)
   { 
     static $instance;
     if (!isset($instance)) {
         $instance = new ClassUser($uid);
     }
     return $instance;
   }
   .....
}
$oUser = ClassUser::instance($uid);

#16


补充:
实例化时应该是:
$oUser &= ClassUser::instance($uid);

#17


$oUser =& ClassUser::instance($uid);

#18


学习

#19


对,就是典型的单态模型

#20


mark!

#21


答非所问

#22


等php6,或php7看吧。要不自己改改源代码。

#23


上面的都离题万里...
可能要到php8

#1


把实例化的标记记录到实例的属性里.

根据标记去确定,是否需要实例化.

#2


楼上的能详细点吗?谢谢,初学者

#3


你自己new不就不会实例

#4


供参考。
<?php
session_start();
class a
{
  var $a;
  
function a()
{
$_SESSION['a_init'] = 1;
}
function b()
{
}

}
$b = new a();
if($_SESSION['a_init'] == 1) echo "已实例化";
?>

#5


首先要说明你的PHP的版本4.x还是5.x。
不同的版本对面向对象的支持不一样!

PHP 5.x的话和其他面向对象程序设计语言的Singleton设计是类似的。
(里面有static成员函数和private访问控制修饰符)

PHP 4.x的话一般是通过命名约定,也就是给静态调用的成员函数取__staticMF()这样的名字。
然后再$GLOBALS里面放置一个此类的对象。然后每次使用时调用“静态”的__getInstance()函数。

#6


帮顶

#7


/**
 * 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];
}

#8


上面的函数中的loadClass,是我定义的另一个函数

你可以改成,require 'xxx.php';//其中xxx.php是定义那个类的文件

#9


学习

#10


我的例子和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(); 就可以得到这个类的实例并且只被初始化一次

#11


mark!

#12


学习

#13


单件模式就可以:
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);

#14


~~

#15


不知道这是不是你想要的:
class ClassUser
{
   .....
   function &instance($uid)
   { 
     static $instance;
     if (!isset($instance)) {
         $instance = new ClassUser($uid);
     }
     return $instance;
   }
   .....
}
$oUser = ClassUser::instance($uid);

#16


补充:
实例化时应该是:
$oUser &= ClassUser::instance($uid);

#17


$oUser =& ClassUser::instance($uid);

#18


学习

#19


对,就是典型的单态模型

#20


mark!

#21


答非所问

#22


等php6,或php7看吧。要不自己改改源代码。

#23


上面的都离题万里...
可能要到php8