PHP类属性名称

Jef*_*eff 6 php oop

我有一个叫做联系的课:

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)

lin*_*ogl 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.
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

所以现在你可以这样做:

$meta = new Meta($objContact);

echo $meta->Name;   // <-- with will return 'Name'!
Run Code Online (Sandbox Code Playgroud)