2010-06-04 4 views
2

"항목"을 클래스 함수에 동적으로 전달할 수 있습니까? 이 원 있도록객체 요소를 PHP에서 상수와 같은 문자열로 전달하지 않습니까?

//.......... 
    public function __add2SomeObj($b) {  

     $namespc = $this -> __someObj(); // __someObj() returns object 
     $namespc -> cats = $b; 

      } 
//................... 

내가 동적으로 대신 cats을 다른 이름을 전달할 수 있습니다 : 그것은 $ B로 I 객체 (항목)의 요소를 선언, 일부 클래스의 조각과 그 기능을 여기에 예를 들어

문자열로 선언하지 않습니까? 같은 즉 뭔가 :

//.......... 
     public function __add2SomeObj($a,$b) { 

      $namespc = $this -> __someObj(); // __someObj() returns object 
      $namespc -> $a = $b; 

       } 
    //................... 
} //end of class started above 

$t=new aboveClass() 
$t->__add2SomeObj("cats", array(1=>"PussyCat",2=>"Scratchy")); 
$t->__add2SomeObj("dogs", array(1=>"Waffy",2=>"Sharik")); // once again but dogs... 

나는이를 할 상수 또는 무엇을 정의해야합니다 또는 내가 (object) $vaaar 같은 객체로이 보호 varibale를 선언해야합니까? 죄송합니다 나는

답변

1

예 이렇게 할 수 있습니다. variable variables에 대한 정보 :

클래스 속성은 가변 속성 이름을 사용하여 액세스 할 수도 있습니다. 가변 속성 이름은 호출이 이루어진 범위 내에서 확인됩니다. 예를 들어, $foo->$bar과 같은 표현식이 있으면 로컬 범위가 $bar으로 검사되고 그 값은 $foo 속성의 이름으로 사용됩니다. $bar이 배열 액세스 인 경우에도 마찬가지입니다. 배열을 처리 할 때


그러나 당신은 carful해야합니다 :

$namespc->$a[0] 

$namespc->$a에 의해 반환됩니다 배열에서 첫 번째 요소를 얻을 것이다.

$namespc->{$a[0]} 

반면 제 즉 $a[0] 해결 $a 어레이의 제 1 값을 얻고, 속성 이름으로 사용할 것이다.

+0

감사합니다. 그것이 내가 찾던 것과 똑같습니다! 아, 이것이 일부 SQL 문에서이 새겨진 대괄호를 만나는 이유입니다! – moogeek

+1

@moogeek : 예, 복잡한 구문 *이라고하며 주로 문자열에 변수가있는 경우에 사용합니다. 여기에서 읽을 수 있습니다 : http://www.php.net/manual/de/language.types.string.php#language.types.string.parsing –

0

당신의 구문이 올바른지 ... PHP OOP와 약간의 infamiliar 해요 :

$obj->cats = $b; 

$a = 'cats'; 
$obj->$a = $b; 

이 같은 일을 할 것입니다.

"cats"을 일정하게 만들지 여부는 귀하에게 달려 있습니다. 나는 최대 오류보고를 넣어 제안 :

error_reporting(E_ALL | E_STRICT); 

실수 "cast"에 넣고 그 오류가 발생거야 유효한 회원이 있다면 그 방법을.

마지막으로 PHP는 동적 언어입니다. 나는 당신의 배경이 더 정적 인 언어로되어 있을지도 모른다고 느낀다. 이것은 당신이 편안하게 느끼기에 필요한 것일 뿐이며 가독성과 자세한 정보 사이의 균형을 찾아야합니다. 그러나 무엇을 하든지, PHP 언어가 아닌 언어로 사람들이 자주 오는 실수 인 PHP에서 PHP가 아닌 관용구를 다시 만들지 마십시오.

1

두 번째 목록에서와 마찬가지로 __add2SomeObj 내부에서 변경할 속성을 런타임에 결정할 수 있는지 여부를 묻는 것입니다. 너는 할 수 있고, 너는 틀렸다.

그러나, 속성은 문자열 __add2SomeObj해야합니다, 그래서 당신은 $a 매개 변수가 문자열이 있는지 확인해야합니다 (자동으로 문자열로 변환됩니다,하지만 $a는 객체 나 배열 인 경우이 예기치 않은 결과를 제공 할 수 있습니다).

둘째, 호출자가 임의의 속성을 너무 변경할 수 있도록 허용합니다. 클래스 __someObj 반품 및 __add2SomeObj 클래스에 따라 클래스의 캡슐화를 위반하거나 위반하지 않을 수 있습니다. 또한 객체 $namespce (즉, 해당 클래스의 모든 객체에 존재하지 않는 객체)에 동적 속성이 만들어 지므로 원하지 않을 수도 있습니다.

마지막으로, 그 결과가 __add2SomeObj 인 결과가 치명적인 오류를 생성 할 수 있습니다. 따라서 허용 된 속성 이름 집합에 대해 $a 매개 변수의 유효성을 검사하는 것이 좋습니다.

+0

유용한 비판을 보내 주셔서 감사합니다! 물론, 나는 생산에서 이러한 것들을 고려할 것이지만, 위의 예는 응답자를 질문의 줄거리로 안내하는 것입니다! – moogeek

관련 문제