>  기사  >  백엔드 개발  >  PHP에서 __get 메소드를 사용하는 방법은 무엇입니까?

PHP에서 __get 메소드를 사용하는 방법은 무엇입니까?

王林
王林원래의
2020-11-04 09:19:594340검색

PHP에서 __get 메소드의 역할: 비공개 멤버 속성 값을 얻는 데 사용됩니다. __get 메서드는 수동으로 호출할 필요가 없으므로 이 메서드를 개인 속성을 얻을 때 객체가 자동으로 호출하는 개인 메서드로 만들 수 있습니다.

PHP에서 __get 메소드를 사용하는 방법은 무엇입니까?

일반적으로 말해서, 클래스의 속성은 항상 비공개로 정의하세요. 이는 현실적인 논리에 더 부합합니다. 그러나 속성을 읽고 할당하는 작업은 매우 빈번하므로 PHP5에서는 속성을 가져오고 할당하기 위해 "__get()" 및 "__set()" 두 함수가 미리 정의되어 있습니다. Java의 javabean 연산과 비슷하며, 사용하는 방법도 비슷하지만 javabean처럼 각 필드에 대해 set, get 연산을 수행할 필요가 없습니다. 두 가지 매직 메서드를 추가하면 됩니다. 즉, 민간회원의 가치를 설정하고 획득하는 작업이다.

(권장 튜토리얼: php 비디오 튜토리얼)

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

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

__get() 메서드: 이 메서드는 개인 멤버 속성 값을 가져오는 데 사용됩니다. 이 메소드는 수동으로 호출할 필요가 없으므로 이 메소드를 private 메소드로 만들 수도 있으며, 이는 private 속성을 직접 호출할 때 객체에서 자동으로 호출됩니다. 획득.

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

__set() 메서드: 이 메서드는 비공개 멤버 속성에 대한 값을 설정하는 데 사용됩니다. 두 개의 매개변수가 있습니다. 첫 번째 매개변수는 값을 설정하려는 속성의 이름이고 두 번째 매개변수는 값입니다. 속성에 대해 설정하려고 합니다. 반환 값이 없습니다. 또한 이 메서드는 수동으로 호출할 필요가 없으며 private으로 설정할 수도 있으며 private 속성 값을 직접 설정하면 자동으로 호출됩니다.

동일한 개인 속성이 캡슐화되었습니다. __set() 메서드가 없으면 허용되지 않습니다. 예: $this->name= ' zhangsan ' , 오류가 발생하지만 추가하면 됩니다. 클래스 프라이빗 속성에 직접 값을 할당할 때 __set($property_name, $value) 메서드가 자동으로 호출됩니다. $property_name에 name과 같은 속성을 전달하고, $value에 할당할 "zhangsan" 값을 전달합니다. 이 메소드를 실행하면 할당 목적이 달성됩니다.

구성원 속성이 비공개로 캡슐화되지 않은 경우 개체 자체는 이 메서드를 자동으로 호출하지 않습니다. 잘못된 값을 전달하지 않기 위해 이 방법으로 판단할 수도 있습니다.

코드는 다음과 같습니다.

<?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 = new Person();
// 直接为私有属性赋值的操作,会自动调用 __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 training

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

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