2012-07-11 51 views
0

我有一個的index.php具有以下內容:PHP和類 - 會話寫覆蓋本地變量

include_once('includes/auth.php'); 
include_once('classes/class.DatabaseQuery.php'); 
include_once('classes/class.Project.php'); 
include_once('classes/class.User.php'); 

$project = new Project(); 
$user = new User(); 

// HTML, HEAD, BODY 

$usergroup = $user->getUserGroup($_SESSION['user']); 
// ... 

所以,我包括我的index.php所有需要的類。我也在這個文件中創建了一個類的實例。然後,我有我的類文件(例如class.Project):

class Project { 

private $db; 
private $evaluation; 

public function __construct($id=null){ 
    $this->setPreferences(); 
} 

private function setPreferences() { 
    $this->db = new DatabaseQuery(); 
    $this->evaluation = new Evaluation(); 
} 


public function getSomething(){ 
    if($this->evaluation->checkSomething(1)){ 
     echo "test"; 
    } 
} 
// ... 
} 

在這些文件中,我宣佈我的其他類作爲私有變量。比我訪問其他類的方法。

與其他類包含和使用私有變量是否存在任何問題?

現在我有一個奇怪的問題。如果我將值寫入$_SESSION['user'],我的私有變量user將被覆蓋。在我的會話中寫入內容之前,會話值已經被填充。這裏是我的的login.php

include_once('classes/class.User.php');  
    session_start(); 

    $username = $_POST['username']; 
    $password = $_POST['password']; 

    $user = new User(); 
    if ($user->checkLoginData($username, $password)) { 
     $_SESSION['userID'] = $user->getUserIDForName($username); 
     // it is an object 
     var_dump($user); 
     $_SESSION['user'] = $username; 
     // it is a string 
     var_dump($user); 
     // ... 
    } 

如何$_SESSION['user']=$username改變局部變量$user的內容?也許你有一些想法,我做錯了什麼。

+1

「在其他類中包含和使用私有變量是否存在任何問題?」 Nopez。但是,我確實遇到了緊耦合問題。將實例注入方法的參數會更好。這被稱爲[依賴注入](http://nl.wikipedia.org/wiki/Dependency_injection)。 – PeeHaa 2012-07-11 15:59:20

+0

@PeeHaa:我通過使用函數設置數據庫等來改變了這種情況。班上不再有新的表述。我觀察了一次遞歸,其中對象在會話中,並打印出會話。因爲每個對象都相互鏈接,所以會發生遞歸。這應該是一個問題嗎? – testing 2012-07-12 08:23:23

回答

0

解決方案:

現在我從here,其中register_globals應打開沿襲了意見。例如。與htaccess

php_value register_globals 0

似乎工作。