Php 会话_start()正在导致对象变为非对象

Php 会话_start()正在导致对象变为非对象,php,session,object,Php,Session,Object,我有一个类,它有一个加载其他类和创建实例的函数 如果您这样使用该类: $test = new test(); $test->load("email"); 它像预期的那样完美地工作 但是当使用session_start()时 创建了一个错误,但没有其他错误: PHP致命错误:对bla-bla-bla中的非对象调用成员函数load() 与会话_start一起使用的类: <?php class test { function load($class){ st

我有一个类,它有一个加载其他类和创建实例的函数

如果您这样使用该类:

    $test = new test();
   $test->load("email");
它像预期的那样完美地工作 但是当使用session_start()时

创建了一个错误,但没有其他错误: PHP致命错误:对bla-bla-bla中的非对象调用成员函数load()

与会话_start一起使用的类:

<?php

 class test
{


 function load($class){

  static $objects = array();

  if (isset($objects[$class]))
  {
   return $objects[$class];
  }

  require('libraries/'.$class.'.php');

  $name = 'ext_'.$class;

  $objects[$class] =& new $name();

  $this->$class = $objects[$class];

  return $objects[$class];


 }

}


$test = new test();

session_start();

$test->load("email");
?>

事先非常感谢

也许您在
$\u会话
中有一些名为
test
的变量,并且已启用

在这种情况下,通过调用
SESSION\u start()
,将
$\u SESSION['test']
变量创建为全局
$test
变量,覆盖脚本中任何现有的
$test
变量

这也解释了为什么在某些服务器上而不是在其他服务器上发生这种情况:
register\u globals
默认情况下是
Off
,并且已经启用了很多年,但有些主机保持启用状态:-(

(当人们说,
register\u globals
是邪恶的,这不是没有好的理由的。)


要了解更多信息,您可以阅读手册的这一页,其中甚至有一段关于
$\u SESSION
和一些
register\u globals
可能导致的问题


现在,关于如何解决这个问题……好吧,我想最快的方法是确保在将
$test
设置为所需状态之前调用
session\u start()

session_start();
$test = new test();
$test->load("email");
这样,即使由于
register\u globals
而创建了
$test
,您的变量也会覆盖它——最后一个变量是正确的^^

但最好的解决方案是关闭
register\u globals
:这是过去的遗物……可能永远不会存在:-(

(在PHP中有一些不好的地方;在我看来,这就是其中之一)

也许您在
$\u SESSION
中有一个名为
test
的变量,并且启用了它

在这种情况下,通过调用
SESSION\u start()
,将
$\u SESSION['test']
变量创建为全局
$test
变量,覆盖脚本中任何现有的
$test
变量

这也解释了为什么在某些服务器上而不是在其他服务器上发生这种情况:
register\u globals
默认情况下是
Off
,并且已经启用了很多年,但有些主机保持启用状态:-(

(当人们说,
register\u globals
是邪恶的,这不是没有好的理由的。)


要了解更多信息,您可以阅读手册的这一页,其中甚至有一段关于
$\u SESSION
和一些
register\u globals
可能导致的问题


现在,关于如何解决这个问题……好吧,我想最快的方法是确保在将
$test
设置为所需状态之前调用
session\u start()

session_start();
$test = new test();
$test->load("email");
这样,即使由于
register\u globals
而创建了
$test
,您的变量也会覆盖它——最后一个变量是正确的^^

但最好的解决方案是关闭
register\u globals
:这是过去的遗物……可能永远不会存在:-(

(PHP有一些不好的地方;在我看来,这就是其中之一)

有趣的是,作为一个演练,你不能将
session\u start
调用放在代码的绝对顶端吗?在我这方面效果很好。也许你应该在
session\u start()调用前后尝试
var\u dump
$test
进行测试
查看发生了什么变化。否我无法移动会话\u start(),即使我将session\u start移动到顶部,它也总是一样的。有趣的是,作为一个演练,您不能将
session\u start
调用放在代码的绝对顶部吗?在我这边效果很好。也许您应该在调用
session\u start()之前和之后在
$test
上尝试
var\u dump
查看发生了什么变化。否我无法移动会话\u start(),即使我将会话_start移动到topCool,它也始终是一样的!非常感谢解决了我的问题,我在$_会话中更改了测试,现在它工作了!!我想这也是一个解决方案--但不要忘了,在其他变量方面,您可能会再次遇到同样的问题!;;不客气:-)是的,你是对的,但不可能要求每个人都禁用register_globals以使其工作!!!再次感谢让它成为可能,或者等待这个纸牌屋崩溃!非常感谢解决了我的问题,我在$_会话中更改了测试,现在它工作了!!我想这也是一个解决方案--但别忘了你可能会遇到问题对于其他变量,同样的问题再次出现!;;不客气:-)是的,你是对的,但不可能要求每个人都禁用register_globals以使其工作!!!再次感谢使其成为可能或等待这家纸牌公司崩溃
session_start();

$test->load("email");
session_start();
$test = new test();
$test->load("email");