2013-05-20 3 views
4

PHP에서 __get__set 메쏘드가있는 것이 무엇인지 잘 모르겠습니다.php __set(), __get과 간단한 설정, 함수 가져 오기의 차이점

배열의 값을 설정하는 코드는 다음과 같습니다.

class myclass { 
public $sotre = array(); 

public function __set($arraykey,$value){ 
    echo 'Setting '.$arraykey.' to '.$value; 
    $this->store[$arraykey] = $value; 
} 
} 

$obj = new myclass; 
$obj->a = 'arfan'; 

다음은 다른 코드입니다.

class myclass { 
public $sotre = array(); 

public function setvalue($arraykey,$value){ 
    echo 'Setting '.$arraykey.' to '.$value; 
    $this->store[$arraykey] = $value; 
} 
} 

$obj = new myclass; 
$obj->setvalue('a','arfan'); 

두 기능 모두 동일한 기능을합니다. __get/__set 마법 방법을 사용하여

코드 :

class myclass { 
public $store = 
array(
    'a'=>'arfan', 
    'b'=>'azeem', 
    'c'=>'hader' 
); 

public function __get($arraykey){ 
    echo 'Getting array key '.$arraykey.'<br />'; 
    if(array_key_exists($arraykey,$this->store)){ 
     return $this->store[$arraykey]; 
    } 
} 

public function getvalue($arraykey){ 
    echo 'Getting array key '.$arraykey.'<br />'; 
    if(array_key_exists($arraykey,$this->store)){ 
     return $this->store[$arraykey]; 
    } 
} 
} 

$obj = new myclass; 
echo $obj->a; 

$obj = new myclass; 
echo $obj->getvalue('a'); 

당신이 볼의 기능을 모두 동일한 작업을 수행.

PHP 개발자가 직접 구현할 수있는 마법 방법 __get/__set을 사용하는 이유에 대해 혼란 스럽습니다.

나는 그 (것)들을위한 약간 사용이 확실하다 그러나 나는 무언가를 놓치고 있어야한다.

+0

는'$를 OBJ가> A'는 $를 OBJ> getvalue ('A') '보다 더 읽을'... ** MagicMethods에 대한 – DCoder

답변

12

그들이하는 일에 대한 것이 아니라 그들이 호출 될 때의 것이에요.

__set() is run when writing data to inaccessible properties. 

__get() is utilized for reading data from inaccessible properties. 

그래서 당신은

echo $object->propertDoesnExists; //it will call get 

하려는하지만이 얻을 설정 방법 사용의 좋은 예는 코드를 만드는 MagicMethods를 사용 here

$object->propertDoesnExists = 1; //it will call set 

입니다

경우 읽기 쉽고 짧습니다.

나는 또한 당신이 PUBLIC입니다 $store 배열을 사용하는 것으로 나타났습니다 MagicMethods

더 재미있다! 그것에는 아무런 의미가 없습니다. 공개로 표시하면 방법을 사용하지 않고도 액세스 할 수 있습니다. 그것은 그것의 요점이 아닙니다. 메서드 나 마법 메서드를 사용하여 변수를 가져 오거나 설정할 때 메서드를 사용하면 변수를 할당하거나 가져올 때 더 잘 제어 할 수 있기 때문에 일부 유효성 검사를 수행하고 오류를 검사 할 수 있습니다. 변수를 공용으로 설정하는 것은 실제로 나쁜 컨벤션으로 알려져 있습니다 . 공용 멤버는 프로젝트의 모든 장소에서 수업 외부에서 액세스 할 수 있습니다. 오류가 발생하면 확인해야 할 코드가 많습니다. 메서드로 액세스 한 개인 멤버가 잘못되었을 때 확인 (확인/설정)하는 방법은 두 가지뿐입니다.

+0

주 새로운 링크는 **입니다 : HTTP : // 블로그 .marcomonteiro.net/post/php-magic-methods-the-complete-guide] (http://blog.marcomonteiro.net/post/php-magic-methods-the-complete-guide) – toddkaufmann

1

이미 차이점을 말했기 때문에, 나는 그 목적을 설명하려고 노력할 것입니다.

이러한 마법 기능은 실제로 일부 코드 정리를 위해 만들어졌습니다. 어떤 사람들은 $object->property으로 전화하면 $object->getProperty()에 전화하는 것보다 더 분명하다고 생각합니다.

체인 연결을 사용할 때 더 명확합니다. object->getDatabase()->getTable()->getRow()->getType()->convertToString()->makeUppercase() 등 "숨겨진 속성"을 사용하는 것이 더 분명합니다.

마법 방법을 사용하면 참조로 전화 걸기와 같은 일부 문제는 해결되지 않지만 때로는 읽기가 더 쉽습니다. 모두 getCount()setCount()이 비공개 또는 보호

property count: Integer read getCount write getCount; 

: 속성을 사용

는 클래스가 같은 것을 가질 수 있습니다. (오브젝트 파스칼, 즉 델파이 또는 프리 파스칼 같은) 일부 언어에서 매우 인기가있다. 코더는 변수와 마찬가지로 생각할 수 있지만 대신 메서드가 호출됩니다.

PHP에서도 마법의 방법 인 __get() (및 __set())의 장점이 있습니다. 일반적으로 존재하지 않는 부동산을 신고 할 때 통지가 주어집니다. 그러나 __get() 메서드를 구현하는 경우 아무런주의를 기울이지 않고 어떠한 경우에도 NULL을 반환하기 위해 __get() 메서드를 코딩 할 수 있습니다.이 경우 속성이 없거나 오류를 처리 할 수 ​​있습니다.

이것이 위험 할 수도 있지만 가능성도 있습니다. 마지막 예인 here을 살펴보십시오.

0

이 마법 방법은 바로 가기와 같습니다. Python, C# 및 Ruby와 같은 다른 언어도이 기능을 구현합니다.

foreach($items as $item): 
    ?> 
    <li> 
     Title: <?php echo $item->getTitle(); ?> <br/> 
     Description: <?php echo $item->getLongDescription(); ?> <br/> 
     URL: <?php echo $item->getAbsoluteUrl(); ?> <br/> 
    </li> 
    <?php 
endforeach; 

이 위의 것보다 더 읽을 : 그래서

foreach($items as $item): 
    ?> 
    <li> 
     Title: <?php echo $item->title; ?> <br/> 
     Description: <?php echo $item->longDescription; ?> <br/> 
     URL: <?php echo $item->absoluteUrl; ?> <br/> 
    </li> 
    <?php 
endforeach; 

, 당신이 옳다

난 당신이 HTML 템플릿 안에 PHP 코드를 넣을 필요가있을 때이 더 유용하다고 생각 , 전혀 차이가 없습니다. 일을 더 쉽게 만드는 방법 일뿐입니다.

0

__set() 액세스 할 수없는 속성에 데이터를 쓸 때 실행됩니다. 액세스 불능 속성으로부터 데이터를 판독하기 위해 이용된다.

Ex.

public void __set (string $name , mixed $value) 

EX.

public mixed __get (string $name) 
관련 문제