2010-03-09 38 views
0

我有這個類有一個函數來加載其他類和創建實例。session_start()導致一個對象變成非對象

,如果你使用這個類是這樣的:

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

它完美的作品如預期 但使用時在session_start();

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

被創建了一個錯誤,沒有別的有: PHP致命錯誤:調用一個成員函數負載()一個非對象在唧唧歪歪

類與在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"; 
} 

} 

?> 

CA ñ你請指教這是什麼問題?一種改善負載功能的方法? 這個東西適用於某些Apache的安裝,並且無法在其他工作。取決於一些配置,我不知道究竟是什麼。

我想要能夠做到以下幾點: $ test = new test();

session_start(); 

$test->load("email"); 

感謝很多提前

+0

有趣的是,作爲一個解決方案,你不能只將'session_start'調用放在代碼的絕對頂部嗎? – 2010-03-09 19:00:57

+0

我的工作很好。也許你應該在調用'session_start()'之前和之後在'$ test'上嘗試'var_dump'來看看有什麼變化。 – 2010-03-09 19:03:16

+0

不,我不能移動session_start(),即使我將session_start移動到頂端,也總是相同的 – 2010-03-09 19:07:04

回答

3

也許你有一些命名$_SESSIONtest變量,並啓用register_globals

在這種情況下,$_SESSION['test']變量將通過調用一個全局變量$test創建session_start(),overridding腳本的任何現有$test變量。

這也可以解釋爲什麼這是一些服務器,而不是某些人對發生的事情: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關閉:這是一個從過去reliquate ...應該可能永遠不會存在:-(
(在PHP中有一些不好的東西;這是其中之一,在我的意見)

+0

酷!非常感謝,解決了我的問題,我改變了$ _SESSION測試,現在就可以工作了! – 2010-03-09 19:20:43

+0

我想這也是一個解決方案 - 但不要忘記,你可能會遇到同樣的麻煩,對於其他變量! YOu歡迎:-) – 2010-03-09 19:22:20

+0

是的你是對的,但它不可能要求每個人禁用register_globals這個工作!再次感謝 – 2010-03-09 19:23:33

相關問題