声明: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 "已实例化";
?>
<?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()函数。
不同的版本对面向对象的支持不一样!
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];
}
* 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是定义那个类的文件
你可以改成,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(); 就可以得到这个类的实例并且只被初始化一次
<?
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);
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);
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);
实例化时应该是:
$oUser &= ClassUser::instance($uid);
#17
$oUser =& ClassUser::instance($uid);
#18
学习
#19
对,就是典型的单态模型
#20
mark!
#21
答非所问
#22
等php6,或php7看吧。要不自己改改源代码。
#23
上面的都离题万里...
可能要到php8
可能要到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 "已实例化";
?>
<?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()函数。
不同的版本对面向对象的支持不一样!
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];
}
* 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是定义那个类的文件
你可以改成,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(); 就可以得到这个类的实例并且只被初始化一次
<?
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);
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);
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);
实例化时应该是:
$oUser &= ClassUser::instance($uid);
#17
$oUser =& ClassUser::instance($uid);
#18
学习
#19
对,就是典型的单态模型
#20
mark!
#21
答非所问
#22
等php6,或php7看吧。要不自己改改源代码。
#23
上面的都离题万里...
可能要到php8
可能要到php8