>백엔드 개발 >PHP 문제 >PHP __set() 메소드를 사용하는 방법은 무엇입니까?

PHP __set() 메소드를 사용하는 방법은 무엇입니까?

青灯夜游
青灯夜游원래의
2020-11-05 12:13:203440검색

PHP에서는 __set() 메서드를 사용하여 전용 멤버 속성에 대한 값을 설정할 수 있습니다. 이는 정의되지 않은 속성에 값을 할당할 때 트리거됩니다. 구문 형식은 "__set($property, $value)"입니다. 에는 두 개의 매개변수가 있습니다. 첫 번째 매개변수는 속성 이름을 지정하고 두 번째 매개변수는 속성에 설정할 값입니다.

PHP __set() 메소드를 사용하는 방법은 무엇입니까?

권장: "PHP 비디오 튜토리얼"

일반적으로 말해서, 클래스의 속성은 항상 비공개로 정의하세요. 이는 현실적인 논리에 더 부합합니다. 그러나 속성을 읽고 할당하는 작업은 매우 빈번하므로 PHP5에서는 속성을 가져오고 할당하기 위해 "__get()" 및 "__set()" 두 함수가 미리 정의되어 있습니다.

  • __set() 메서드는 개인 속성 값을 설정하는 데 사용됩니다.

  • __get() 메서드는 개인 속성 값을 가져오는 데 사용됩니다.

PHP5에는 속성 값을 설정하고 가져오는 특별한 메서드가 제공됩니다. "__set()" 및 "__get()" 두 메서드는 기본적으로 존재하지 않지만 수동으로 제공됩니다. 생성자 메서드(__construct())와 마찬가지로 클래스에 추가된 경우에만 존재합니다. 다음과 같은 방법으로 추가할 수 있습니다. 물론 개인에 따라 추가할 수도 있습니다. 스타일:

//__set()方法用来设置私有属性
public function __set($name,$value){
$this->$name = $value;
}
//__get()方法用来获取私有属性
public function __get($name){
return $this->$name;
}

__get() 메서드: 프라이빗 멤버 속성 값을 가져오는 데 사용되는 메서드입니다. 가져오려는 멤버 속성의 이름에 매개 변수가 전달되고, 가져온 속성 값이 반환됩니다. 이 메서드는 수동으로 호출할 필요가 없습니다. 왜냐하면 이 메서드는 개인 속성을 직접 얻을 때 개체가 자동으로 호출하는 개인 메서드로 만들 수도 있기 때문입니다. Private 속성이 캡슐화되어 있기 때문에 직접 값을 얻을 수는 없지만, 이 메소드를 클래스에 추가하면 "echo$p1->name"과 같은 문을 사용할 때 자동으로 값을 직접 얻을 수 있습니다. __get($name) 메소드를 호출하고 속성 이름을 $name 매개변수에 전달합니다. 이 메소드의 내부 실행을 통해 전달한 비공개 속성의 값이 반환됩니다. 멤버 속성이 비공개로 캡슐화되지 않은 경우 개체 자체는 이 메서드를 자동으로 호출하지 않습니다.

__set( $property, $value ) 메서드: 이 메서드는 비공개 멤버 속성에 대한 값을 설정하는 데 사용됩니다. 두 개의 매개 변수가 있으며 첫 번째 매개 변수는 값을 설정하려는 속성의 이름입니다. 두 번째 매개변수는 설정하려는 값입니다. 속성에 의해 설정된 값에는 반환 값이 없습니다. 이 메소드는 수동으로 호출할 필요도 없으며, private 속성 값을 직접 설정할 때 자동으로 호출됩니다. __set() 메소드가 없으면 Not입니다. 예를 들어 $this->name='zhangsan'이면 오류가 발생하지만, 클래스에 __set($property_name, $value) 메서드를 추가하면 프라이빗 속성에 값을 직접 할당할 때, name과 같은 속성을 $property_name에 전달하고 "zhangsan" 값을 $value에 전달하여 자동으로 호출됩니다. 이 메소드를 실행하면 할당 목적이 달성됩니다. 멤버 속성이 비공개로 캡슐화되지 않은 경우 개체 자체는 이 메서드를 자동으로 호출하지 않습니다. 잘못된 값을 전달하지 않기 위해 이 방법으로 판단할 수도 있습니다. 코드는 다음과 같습니다.

 <?php 
class Person 
{ 
//下面是人的成员属性,都是封装的私有成员 
private $name; //人的名子 
private $sex; //人的性别 
private $age; //人的年龄 
//__get()方法用来获取私有属性 
private function __get($property_name) 
{ 
echo "在直接获取私有属性值的时候,自动调用了这个__get()方法<br>"; 
if(isset($this->$property_name)) 
{ 
return($this->$property_name); 
} 
else 
{ 
return(NULL); 
} 
} 
//__set()方法用来设置私有属性 
private function __set($property_name, $value) 
{ 
echo "在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值<br>"; 
$this->$property_name = $value; 
} 
} 
$p1=newPerson(); 
//直接为私有属性赋值的操作,会自动调用__set()方法进行赋值 
$p1->name="张三"; 
$p1->sex="男"; 
$p1->age=20; 
//直接获取私有属性的值,会自动调用__get()方法,返回成员属性的值 
echo "姓名:".$p1->name."<br>"; 
echo "性别:".$p1->sex."<br>"; 
echo "年龄:".$p1->age."<br>"; 
?>

프로그램 실행 결과:

在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值
在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值
在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值
在直接获取私有属性值的时候,自动调用了这个__get()方法
姓名:张三
在直接获取私有属性值的时候,自动调用了这个__get()方法
性别:男
在直接获取私有属性值的时候,自动调用了这个__get()方法
年龄:20

위 코드에서 __get() 및 __set() 메서드를 추가하지 않으면 private 멤버는 클래스 외부에서 동작할 수 없기 때문에 프로그램에서 오류가 발생하며, 위의 코드는 다음과 같습니다. 코드는 __get() 및 __set() 메서드를 자동으로 호출하여 캡슐화된 전용 멤버에 직접 액세스할 수 있도록 도와줍니다.

더 많은 프로그래밍 관련 지식을 보려면 프로그래밍 소개를 방문하세요! !

위 내용은 PHP __set() 메소드를 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.