PHP类属性名称

时间:2011-03-04 21:24:20

标签: php oop

我有一个叫做联系人的课程:

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);

4 个答案:

答案 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)可以获得类似的效果。您可以获取$objContactReflectionClass)的元对象并迭代属性。

因此,无法识别具有标识符的特定属性。唯一的方法是使用其名称字符串。

编辑:

然而,有一种方法可以模拟它!写一个这样的课:

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']