【问题标题】:session_start() is causing an object to become non-objectsession_start() 导致对象变为非对象
【发布时间】:2011-01-25 14:02:19
【问题描述】:

我有这个类,它具有加载其他类和创建实例的功能。

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

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

这里是库/email.php:

<?php


class ext_email
{

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

}

?>

你能告诉我这有什么问题吗?有什么方法可以提高负载功能? 这件事适用于某些 apache 安装,但无法在其他安装上运行。取决于一些我不知道到底是什么的配置..

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

session_start();

$test->load("email");

非常感谢

【问题讨论】:

  • 有趣的是,作为一个临时解决方案,您不能将 session_start 调用放在代码的绝对顶部吗?
  • 对我来说效果很好。也许您应该在调用session_start() 之前和之后在$test 上尝试var_dump,看看有什么变化。
  • 不,我不能移动 session_start(),即使我将 session_start 移动到顶部也总是一样

标签: php session object


【解决方案1】:

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

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

这也可以解释为什么这会发生在某些服务器上而不是其他服务器上:register_globals 默认为 Off - 并且已经使用了很多年,但一些主机保持启用它:-(

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


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


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

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

这样,即使因为register_globals 而创建了$test,你的变量也会覆盖它——最后一个是正确的^^

但最好的解决方案是关闭 register_globals :这是过去的遗留物......这可能永远不存在 :-(
(PHP 中有一些不好的地方;在我看来,这就是其中之一)

【讨论】:

  • 酷!非常感谢解决了我的问题我在 $_SESSION 中更改了测试,它现在可以工作了!!
  • 我想这也是一个解决方案——但别忘了你可能会再次遇到同样的问题,对于其他变量!;;;不客气:-)
  • 是的,你是对的,但不可能要求每个人都禁用 register_globals 以使其正常工作!!!再次感谢
  • 让它成为可能或等待这个纸牌屋倒塌
猜你喜欢
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 2011-10-15
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
相关资源
最近更新 更多