我有一个叫做联系人的课程:
class contacts
{
public $ID;
public $Name;
public $Email;
public $PhoneNumber;
public $CellPhone;
public $IsDealer;
public $DealerID;
}
在我的代码中的某个时刻,我想指向该类中的属性并返回该属性的名称。
<input type="text"
id="<?php key($objContact->Name)" ?>"
name="<?php key($objContact->Name)" ?>"
value="<?php $_POST['contact'.key($objContact->Name)]" />
我的问题是key()函数只处理数组或对象。 $ objContact-&gt;名称本身不符合这些要求。我知道在ID和NAME字段中输入名称本身也很简单,但这适用于其他代码验证用途。想象一下处理器页面:
$objContact = new contact();
$objContact->Email = $_POST[$objContact->Email->**GetSinglePropertyName()**];
$objContact->PhoneNumber = $_POST[$objContact->PhoneNumber->**GetSinglePropertyName()**];
这允许我打开STRICT并确保在我写作的时候,我不会创造任何肥胖的手指错误,而这种错误会让我不再感到厌恶我的头脑。
以答案更新 答案提供者:linepogl
现在我采用了linepogl的想法,扩展了一些,所以它可以很容易地使用我现有的代码库。以下是我的想法:
class baseData {
public $meta;
public function __construct() {
$this->meta = new Meta($this);
}
}
class Meta {
public function __construct($obj) {
$a = get_object_vars($obj);
foreach ($a as $key => $value){
$this->$key = $key;
}
}
}
class contacts extends baseData
{
public $ID;
public $Name;
public $Email;
public $PhoneNumber;
public $CellPhone;
public $IsDealer;
public $DealerID;
}
这意味着我现在可以使用所需的结果调用以下代码:
$objContact = new contacts();
echo($objContact->meta->Email);
答案 0 :(得分:6)
因此,您希望在键入$objContact->Name
作为答案时,不要评估此表达式,而应考虑其元数据,在本例中为ReflectionProperty
个对象。
您想要的是一种称为元编程(http://en.wikipedia.org/wiki/Metaprogramming)的功能。当然php不支持,但还有其他语言,比如Lisp等。谣言说C#5.0会引入这样的功能。
使用Reflection(http://php.net/manual/en/book.reflection.php)可以获得类似的效果。您可以获取$objContact
(ReflectionClass
)的元对象并迭代属性。
因此,无法识别具有标识符的特定属性。唯一的方法是使用其名称字符串。
编辑:
然而,有一种方法可以模拟它!写一个这样的课:
class Meta {
public function __construct($obj) {
$a = get_object_vars($obj);
foreach ($a as $key => $value){
$this->$key = $key; // <-- this can be enhanced to store an
// object with a whole bunch of meta-data,
// but you get the idea.
}
}
}
所以现在你可以这样做了:
$meta = new Meta($objContact);
echo $meta->Name; // <-- with will return 'Name'!
答案 1 :(得分:2)
您可以像这样使用get_object_vars():
$properties = get_object_vars($objContact);
foreach($properties as $name => $value)
{
if($value == $objContact->Name)
{
//here's youre name
}
}
但是你必须假设$ objContact-&gt; Name对所有属性都有唯一的价值...
答案 2 :(得分:0)
key()
函数可以很好地处理对象。它只是没有完成你似乎想要做的事情。
$c = new contacts;
end($c);
print key($c); // "DealerID"
您可以预先处理对象属性,PHP会记住上次访问的key()
。但我不确定这是不是你想要的。
答案 3 :(得分:0)
正如konforce所提到的,这就是你要找的东西吗?
$var = 'Name';
$Obj->$var;//Obj's Name property
...
id="<?php $var ?>" //id="Name"
...
$_POST['contact'.$var];//$_POST['contactName']