2013-05-20 95 views
0

考慮下面的代碼:如何動態設置類變量?

class Project 
{ 
    public $ProjectID; 
}  
class Work 
{ 
    public $WorkID; 
}  

public function insert($pData, $tableName) 
{ 
//generate insert here 
    $pData->{$tableName . 'ID'} = $result->getId(); 
} 

$p = new Project(); 
$w = new Work(); 
insert($w, 'Work'); 
insert($p, 'Project'); 

echo $p . ' -- ' . $w; 

現在,我將如何去在動態方式設置變量?我正在構建一個數據層。 $pData->{$tableName . 'ID'}似乎不起作用...

+0

哪個變量會是? –

+0

對於'$ w'而言,它將是'$ w.WorkID = 7',而對於'$ p'而言則是'$ p.ProjectID = 7'。 –

+0

我不認爲你明白「動態」是什麼意思,也不知道你在哪裏/爲什麼想出這個函數setToSeven,也不知道你需要用什麼「動態」解決什麼問題。 – user1122069

回答

2

所以,你要動態調用制定者?

$y = new stdClass(); 
$y->prop1 = "something"; 

$targetProperty = "prop1"; 
$y->$targetProperty = "something else"; 
echo $y->prop1; 

//Echos "something else" 

那你在找什麼?

+0

什麼是'{$ X}'? –

+0

哎呀... $ X應該是$ targetProperty ....現在編輯 – dudewad

+0

賓果!謝謝 :) –

1

您可以通過訪問它們來設置公共屬性,就像類中的任何其他定義一樣。

$p = new Project(); 
$p->ProjectID = 5; 
echo $p->ProjectID; // prints 5 

http://php.net/manual/en/language.oop5.visibility.php

+0

是的,我知道,但我需要動態設置屬性。所以我不知道該對象的類型,我想要一個通用函數來設置密鑰。我正在構建一個對象關係映射器:) –

+0

啊,在這種情況下,這個問題是重複的。看到我對你的問題的評論。 – qJake

2

這是你在找什麼:

public function set_to_seven($p_data, $name) 
{ 
    $name = $name . 'ID'; 
    $p_data->$name = 7; 
} 

屬性名可以是一個變量。就像功能:

$p = 'print_r'; 
$p('StackOverflow'); 

以供將來參考:如果你需要這個靜態的,你要找的變量變量,

public function set_to_seven($p_data, $name) 
{ 
    $name = $name . 'ID'; 
    $p_data::$$name = 7; 
} 

0

這對我有效。

class Project { 
    public $ProjectID; 
} 

function setToSeven($pData, $name) { 
    $pData->{$name . "ID"} = 7; 
} 

$p = new Project(); 
setToSeven($p, 'Project'); 

echo $p->ProjectID; 

您只需要在該類上回顯變量或設置toString函數來回顯類。以字符串這樣的工作

class Project { 
    public $ProjectID; 
    public function __toString(){ 
     return (string)$this->ProjectID; 
    } 
} 

function setToSeven($pData, $name) { 
    $pData->{$name . "ID"} = 7; 
} 

$p = new Project(); 
setToSeven($p, 'Project'); 

echo $p;