2012-11-08 2 views
1

PHP에는 C#과 같은 속성 개념이 없으므로 클래스의 특정 속성을 노출하는 가장 좋은 방법은 무엇입니까? 별도의 get 및 set 함수를 사용하거나 멤버 변수를 공개해야합니까? 개체가 다른 클래스에 포함될 클래스를 디자인하고 있습니다. 객체의 속성을 설정하거나 가져 오는 방법이 있어야합니다.PHP의 속성

답변

2

전체적으로 나는 PHP 클래스에서 공개 변수를 노출하는 것을 권장합니다. 더 복잡한 액션을 수행해야하는 경우를 제외하고 getter 및 setter 함수를 사용해야합니다.

그래서 당신은 C#

public string MyProp { get; set; } 

을이에 사용하는 것이 어디 두 트릭을 할 것입니다 게터/세터와 공공 속성 또는 개인을 사용하여 PHP

public $MyProp; 
+4

요점이 없습니다. C#의 속성을 사용하면 나중에 논리를 추가 할 수 있습니다. PHP에서 일반 속성을 사용하는 경우 getter/setter로 변경하면 해당 속성을 사용할 때마다 리 팩토링됩니다. – Jon

+0

중요한 고려 사항입니다. 추가 해줘서 고마워. – Fenton

2

이를 추천 할 것입니다.

I는 다음과 같이 진행됩니다 : 속성 중요한,이 같은 getter 및 setter 사용하는 경우

가 : 속성이덜 중요한 경우

class myClass 
{ 
    private $myAttr; 

    public function getmyAttr() 
    { 
     return $this->myAttr; 
    } 

    public function setmyAttr($attr) 
    { 
     //Do some verification on $attr 
     $this->myAttr = $attr; 
    } 
} 

를 간단히 설정할 수 있습니다 대중에게 공개됩니다.

PHP에서는 강력한 유형이 없기 때문에 getter 및 setter에서 개인 속성을 항상 선호합니다. 속성을 항상 있어야한다고합니다 (예 : 1 대신 "1"이 아님).

0

매우 보안에 민감하지 않은 특성을 공용으로 만드는 것은 매우 드물지 않습니다. 다른 클래스에서

class withAttributes{ 
    private $property; 

    public function getPrivateProperty{ 
     return $this->property; 
    } 
} 

: 당신이 개인을 유지하려는 경우 그러나 당신이 뭔가를 만들 수

$object = new withAttributes(); 
$attribute = $object->getPrivateProperty(); 

희망이

0

을하는 데 도움이 언어에 내장 된 더 관용적 방법이 없습니다 , 그러나 당신은 마법의 __get__set 방법을 사용하여 simillar를 에뮬레이션 할 수 있습니다. 이 꽤 바보 같은 예를 생각해 보면 약간의 읽기/쓰기 로직을 ​​구현하기로 결정한 경우, 나중에

Class Foo { 

    private $bar; 
    private $baz; 

    public function __get($name) { 
     if (property_exists($this, $name)) { 
      if ($name == 'bar') { 
       return strtoupper($this->{$name}); 
      } else { 
       return $this->{$name}; 
      } 
     } 
     return null; // this is what php would do, consider throwning an exception instead 
    } 

    public function __set($name, $value) { 
     if (property_exists($this, $name)) { 
      if ($name == 'bar') { 
       $this->{$name} = strtolower($value); 
      } else { 
       $this->{$name} = $value; 
      } 
     } 
     // we just ignore this call, consider throwing exceptions, or you could make the class open to property addition in runtime too 
    } 
} 

$f = new Foo; 
$f->bar = 'tickle me elmo'; 
print $f->bar; // prints uppercase 

이 방법을, 당신은 마법의 방법에 그것을 연결할 수 있습니다. 성능 측면에서 볼 때, 이러한 매직 메소드는 일반적인 메소드 호출보다 속도가 빠르며 명시 적 getter/setter 메소드보다 이러한 클래스의 사용자에게 더 놀라운 것은 틀림 없습니다.

당신이 [] 구문은 ArrayAccess 인터페이스를 구현 고려 StdObject 내장 또는 기본 array 같은 더 뭔가를 만들려면.