我有一个叫做联系的课:
class contacts
{
public $ID;
public $Name;
public $Email;
public $PhoneNumber;
public $CellPhone;
public $IsDealer;
public $DealerID;
}
Run Code Online (Sandbox Code Playgroud)
在我的代码中的某个时刻,我想指向该类中的属性并返回属性的名称.
<input type="text"
id="<?php key($objContact->Name)" ?>"
name="<?php key($objContact->Name)" ?>"
value="<?php $_POST['contact'.key($objContact->Name)]" />
Run Code Online (Sandbox Code Playgroud)
我的问题是key()函数只处理数组或对象.$ objContact->名称本身不符合这些要求.我知道在ID和NAME字段中输入名称本身也很简单,但这适用于其他代码验证用途.想象一下处理器页面:
$objContact = new contact();
$objContact->Email = $_POST[$objContact->Email->**GetSinglePropertyName()**];
$objContact->PhoneNumber = $_POST[$objContact->PhoneNumber->**GetSinglePropertyName()**];
Run Code Online (Sandbox Code Playgroud)
这允许我打开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;
}
Run Code Online (Sandbox Code Playgroud)
这意味着我现在可以使用所需的结果调用以下代码:
$objContact = new contacts();
echo($objContact->meta->Email);
Run Code Online (Sandbox Code Playgroud)
因此,您希望在键入$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.
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以现在你可以这样做:
$meta = new Meta($objContact);
echo $meta->Name; // <-- with will return 'Name'!
Run Code Online (Sandbox Code Playgroud)