session_start()导致对象变为非对象

时间:2010-03-09 18:57:22

标签: php session object

我有这个类有一个函数来加载其他类并创建实例。

如果你像这样使用这个类:

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

它按预期完美运行 但是在使用session_start();

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

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

与session_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");
?>

这里是libraries / email.php:

<?php


class ext_email
{

 function ext_email(){
         echo "email is working";
 }

}

?>
你能告诉我这有什么问题吗?一种改善负载功能的方法? 这个东西适用于apache的一些安装,并且无法在其他安装上工作。取决于一些我不知道究竟是什么的配置..

我希望能够做到以下几点:     $ test = new test();

session_start();

$test->load("email");

提前多多感谢

1 个答案:

答案 0 :(得分:3)

也许您在test中有一个名为$_SESSION的变量,并启用了register_globals

在这种情况下,$_SESSION['test']变量将通过调用$test创建为全局session_start()变量,覆盖脚本的任何现有$test变量。< / p>

这也可以解释为什么在某些服务器而不是其他服务器上发生这种情况:默认情况下register_globalsOff - 并且已存在多年,但有些主机会启用它:-(

(当人们说register_globals是邪恶的时候,并非没有充分的理由......)


有关更多信息,您可以阅读手册的Using Register Globals页面 - 甚至还有关于$_SESSION的段落以及register_globals可能导致的一些问题。


现在,关于如何解决这个问题......好吧,我想最快的方法是确保在session_start()设置为你想要的之前调用$test

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

这样,即使由$test创建了register_globals,您的变量也会覆盖它 - 最后一个是正确的^^

但最好的解决方法是关闭register_globals:这是过去的充足...这可能永远不会存在:-(
(在PHP中有一些不好的东西;在我看来,这是其中之一)