Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP类属性名_Php_Oop - Fatal编程技术网

PHP类属性名

PHP类属性名,php,oop,Php,Oop,我有一门课叫contact: class contacts { public $ID; public $Name; public $Email; public $PhoneNumber; public $CellPhone; public $IsDealer; public $DealerID; } 在代码中的某个时刻,我希望指向该类中的属性并返回该属性的名称 <input type="text" id="<?php

我有一门课叫contact:

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)]" />
这使我能够打开“严格”,并确保在我写作的过程中不会产生任何会让我的头比现在更凹的胖手指错误

用答案更新 答复如下:

现在我接受了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);
key()
函数可以很好地处理对象。它只是无法完成你似乎想要做的事情

$c = new contacts;
end($c);
print key($c);    // "DealerID"

您可以对对象属性进行foreach,PHP会记住上次访问的
key()
。但我不确定这是否是您想要的。

您可以像这样使用get\u object\u vars():

$properties = get_object_vars($objContact);
foreach($properties as $name => $value)
{
    if($value == $objContact->Name)
    {
       //here's youre name
    }
}
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.
    }
  }
}

但是有了这个,你必须假设$objContact->Name在所有属性上都有唯一的值…

正如konforce所提到的,这就是你想要的吗

$var = 'Name';
$Obj->$var;//Obj's Name property
...
id="<?php $var ?>" //id="Name"
...
$_POST['contact'.$var];//$_POST['contactName']
$var='Name';
$Obj->$var//Obj的Name属性
...
id=”“//id=“名称”
...
$_POST['contact.$var]//$_POST['contactName']

因此,当您键入
$objContact->Name
时,您希望作为答案的不是表达式的求值,而是它的元数据,在本例中,它是一个
ReflectionProperty
对象

您需要的是一个称为元编程()的特性。当然php不支持这一点,但也有其他语言支持,如Lisp等。有传言说C#5.0将引入此类功能

通过使用反射()可以实现类似的效果。您可以获取
$objContact
ReflectionClass
)的元对象,并迭代属性

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

编辑:

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

$properties = get_object_vars($objContact);
foreach($properties as $name => $value)
{
    if($value == $objContact->Name)
    {
       //here's youre name
    }
}
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.
    }
  }
}
类元{
公共功能结构($obj){
$a=获取对象变量($obj);
foreach($a作为$key=>$value){

$this->$key=$key;//Name;//我很难弄清楚您想要完成什么。因为单个对象就是这样的:单个对象,当前指针的键怎么会有意义?您想用键做什么,为什么,以及这对您的对象有什么意义?您无法从va获取变量的“名称”变量。但是,您可以使用
get\u object\u vars
获取所有对象属性名称。也许对您的对象进行foreach操作会对您有所帮助,这并不完美,但对一个开始很好。如果您知道要提供给某个
key()
类似函数的名称,那么您已经拥有了该名称。。。(请记住,任何一段数据都可能有多个不同名称的变量指向它。)也许你真的需要
$objContact->$dynamic_属性
语法。@Shad-因为使用字符串作为对象内值的指针,将提交回如此敏感的数据,这对我来说不是一个足够好的方法。我希望使用更面向对象的方法。因为它是可行的,可读性更高,所以它是有意义的我想这里的问题是为什么不呢?这真的很接近-除非在将键的值写入输入字段之前,我不一定要访问该字段,所以这不起作用。@杰夫:我已经重读了一遍。你的问题的关键是
我想指出一个属性
。我假设你只是想这么做以表单形式输出属性列表。如果是这样,您将不得不迭代属性
foreach($key=>contact$value)
这是你的指针。你可以做
$object->$key
,只需使用
$key
输出字段。然后你是建议在foreach语句中构建输入字段吗?还是建议构建一个$key数组,以后可以引用?@Jeff。是的,我认为foreatch是一种正确的方法-如果属性的顺序是正确的,您实际上需要为每个属性指定一个输入字段。是的-不完全正确。使用变量变量仍然可以引用类中不存在的项。我可以执行$var='sillytalk';$obj->$var,并且在其他地方使用时,该值为null,因为'sillytalk'的属性为doesn不存在。@Jeff,您可以使用
$foo=new ReflectionProperty('contacts',$var)
检查
$var
是否包含
contacts
类的有效属性名。它将抛出一个(可捕获的)如果没有,则例外。这不是我想要的答案,但看起来似乎是正确的。我已经查看了PHP的ReflectionObject,到目前为止还没有找到它可以成功使用的确切方法。我想调查的函数没有记录在PHP.net上,这无助于我。我感到不安的唯一原因是我不能投票支持超过0个天才!我开始尝试在类中提出类似的想法,但失败了。这将很好地工作,可以很好地集成为基类进行继承,这样我就可以按照$objContact->Meta->Name;