2011-03-04 6 views
5

I 클래스라는 연락을해야합니다.PHP 클래스 속성 이름

<input type="text" 
    id="<?php key($objContact->Name)" ?>" 
    name="<?php key($objContact->Name)" ?>" 
    value="<?php $_POST['contact'.key($objContact->Name)]" /> 

내 문제는 배열이나 개체 만 처리한다는 것입니다. $ objContact-> Name 자체가 이러한 요구 사항을 충족하지 않습니다. ID와 NAME 필드에 이름 자체를 입력하는 것만 큼 간단하지만 다른 코드 확인 용도로 사용하는 것이 좋습니다. 더 이상 이상

$objContact = new contact(); 

$objContact->Email = $_POST[$objContact->Email->**GetSinglePropertyName()**]; 

$objContact->PhoneNumber = $_POST[$objContact->PhoneNumber->**GetSinglePropertyName()**]; 

이 날 엄격한 켜고 내가 쓰고 있어요 나는이 내 머리를 찍힌이가는 길을 따라 모든 지방 손가락 오류를 생성 아니에요 확인 할 수 있습니다 : 프로세서 페이지를 상상해 그것은 현재 존재한다. 에서 제공하는 답변 대답

UPDATE : 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); 
+1

을 당신이 달성하기 위해 원하는 것을 알아내는 힘든 시간을 보내고 있습니다. 하나의 객체가 바로 그것입니다 : 단일 객체, 현재 포인터의 키는 어떤 의미입니까? 열쇠로 무엇을하고 싶습니까, 왜, 그리고 어떻게 객체에 의미가 있어야합니까? – Nanne

+0

변수에서 '이름'을 가져올 수 없습니다. 그러나 당신은'get_object_vars'를 사용하여 객체 속성 이름을 모두 얻을 수 있습니다. – Petah

+0

아마도 foreach 객체를 사용하면 객체가 완벽하지만 좋지는 않을 것입니다. – Tsadiq

답변

6

그래서, 당신이 원하는.

원하는 것은 메타 프로그래밍 (http://en.wikipedia.org/wiki/Metaprogramming)이라고하는 기능입니다. 물론 php는이를 지원하지 않지만 Lisp 등의 다른 언어가 있습니다. C# 5.0에서 이러한 기능을 소개한다고하는 소문이 있습니다.

반사 (http://php.net/manual/en/book.reflection.php)를 사용하면 비슷한 효과를 얻을 수 있습니다. $objContact (ReflectionClass)의 Meta Object를 가져 와서 특성을 반복 할 수 있습니다.

따라서 식별자가있는 특정 속성을 식별 할 수있는 방법이 없습니다. 유일한 방법은 이름의 문자열을 사용하는 것입니다.

편집 :

그러나 시뮬레이션 할 수있는 방법이 있습니다. 이 같은 클래스를 작성 :

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'! 
+0

나는 대답을 원했지만 그럴듯하게 보였습니다. 나는 PHP의 ReflectionObject를 살펴 봤는데, 어떻게 성공적으로 사용할 수 있는지 정확히 알지 못했다. 내가 조사하고 싶은 기능이 php.net에 문서화되어 있지 않다면 도움이되지 않는다. – Jeff

+0

화가났다는 유일한 이유는 그런 대답에 한 번 이상 투표 할 수 없다는 것입니다. 천재! 나는 수업 내에서 비슷한 생각을하기 시작했지만 비참하게 실패했다. 이것은 아름답게 작동 할 것이고 기본 클래스로서 잘 통합되어 상속받을 수 있습니다. 그래서 $ objContact-> Meta-> Name의 라인을 따라 더 많은 것을 할 수 있습니다; – Jeff

0

key() 기능은 객체와 매우 잘 작동합니다. 당신이 겉으로 드러내려고하는 것을 성취하지 못합니다.

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

당신은 객체 속성을 통해 foreach는 할 수 있고, PHP는 마지막 key() 액세스 기억합니다. 그러나 이것이 당신이 원하는 것인지 확실하지 않습니다. 언급으로

+0

그건 정말 가깝습니다 - 입력란에 키의 값을 쓰는 경우를 제외하고 필자는 필드에 반드시 액세스하지 않을 것이므로 작동하지 않습니다. – Jeff

+1

@ 제프 : 다시 읽었습니다. 귀하의 질문의 핵심은 '나는 부동산을 가리키고 싶습니다.'입니다. 나는 단순히 폼의 속성 목록을 출력하고 싶다고 가정하고있다. 그렇다면 어쨌든'foreach ($ contact as $ key => $ value)'라는 속성을 반복해야하고 포인터가있다. '$ object -> $ key'를 할 수 있고'$ key' 만 사용하여 필드를 출력 할 수 있습니다. – mario

+0

다음 foreach 문 내에서 INPUT 필드를 만들 것을 제안합니까? 또는 나중에 참조 할 수있는 $ 키 배열을 작성하라는 제안입니까? – Jeff

2

이 같은 get_object_vars()를 사용할 수 있습니다 konforce에 의해, 당신이 찾고있는 것이 이것입니까? 당신은 대답하지 이런 식의 평가하지만,이 경우에는 ReflectionProperty 목적의 메타 데이터로 데리고 $objContact->Name를 입력 할 때

$var = 'Name'; 
$Obj->$var;//Obj's Name property 
... 
id="<?php $var ?>" //id="Name" 
... 
$_POST['contact'.$var];//$_POST['contactName'] 
0

...

$properties = get_object_vars($objContact); 
foreach($properties as $name => $value) 
{ 
    if($value == $objContact->Name) 
    { 
     //here's youre name 
    } 
} 

을하지만 당신은 $ objContact-> 이름이 모든 속성을 통해 고유 한 값을 가지고 생각해야합니다 :

+0

예 - 정확하지 않습니다. 변수 변수를 사용하면 실제로 존재하지 않는 클래스 내의 항목을 참조 할 가능성이 있습니다. 나는 $ var = 'sillytalk'를 할 수 있었다. $ obj -> $ var이고 'sillytalk'속성이 없기 때문에 다른 곳에서 사용하면 값은 null입니다. – Jeff

+0

@Jeff'$ foo = new ReflectionProperty ('contacts', $ var)'를 사용하여'$ var'가'contacts' 클래스의 유효한 속성 이름을 포함하고 있는지 확인할 수 있습니다. 그렇지 않은 경우 (catch 가능) 예외를 throw합니다. – Matthew