2013-05-20 56 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;