>백엔드 개발 >PHP 튜토리얼 >PHP의 오버로딩에 대한 자세한 설명

PHP의 오버로딩에 대한 자세한 설명

小云云
小云云원래의
2018-03-31 09:53:213163검색

PHP의 오버로딩은 다른 객체지향(C#, Java) 언어와 다릅니다. 예를 들어 C#의 오버로딩은 메소드 이름은 동일하지만 형식적인 매개변수 목록(즉, 숫자, 유형 및 배열)이 다릅니다. 호출 시 형식 매개변수 목록을 기반으로 호출할 메소드를 결정합니다.

PHP의 오버로딩은 현재 개체의 액세스할 수 없는 멤버(정의되지 않았거나 정의되지 않았지만 액세스할 수 없음)를 처리하기 위한 것입니다.

<?php
	Class Student{
		private $_age;
	}
	$o1=new Student();
	$o1->_name="Li";
	var_dump($o1);
	echo "<br/>";
	$o1->_age=24;
	var_dump($o1);
 ?>

이 결과에서 우리는 다음을 볼 수 있습니다. 존재하지 않는 멤버 $_name에 액세스할 때 멤버 공개 속성으로 객체에 추가됩니다. 접근 권한 문제의 경우 오류가 보고됩니다.

이 상황을 위해 PHP에서 속성 오버로딩을 위한 몇 가지 마법의 방법이 있습니다:

속성 오버로딩

1.__set($name,$value): 호출된 특정 속성에 액세스할 수 없는 경우(존재하지 않음/제한된 액세스) ), 시스템은 해당 클래스의 __set() 함수를 자동으로 호출합니다. $name은 호출된 속성 이름을 나타내고 $value는 작업 중에 전달된 값을 나타냅니다.

속성이 존재하지 않는 경우:

<?php
	Class Student{
		private $_age;
		function __set($name,$value){
			
		}
	}
	$o1=new Student();
	$o1->_name="Li";
	var_dump($o1);

여기서 위의 예를 일부 변경할 때: $o1->_name="을 실행할 때 Student 클래스에 __set() 메서드를 추가합니다. Li ";이 코드는 자동으로 __set() 메서드를 호출합니다. 그 안에 코드가 없기 때문에 기본값과 동일한 할당을 달성하는 것이 불가능하므로 표시된 $o1 객체에는 $_age 전용 속성이 하나만 있습니다.

이 코드를 __set() 메서드에 작성할 수도 있습니다. :

    function __set($name,$value){
$this->$name=$value;
}

이때 결과는


입니다. 속성이 존재하지만 접근할 수 없는 경우:

<?php
header("Content-Type:text/html;charset=utf-8");
	Class Student{
		private $_age;
		function __set($name,$value){
		//进入该函数表示$name 这个属性不可访问。
			if(property_exists($this,$name)){
				//property_exists()函数判断当前对象($this)中是否存在$name属性。
				trigger_error("属性不可访问!",E_USER_ERROR);
			}else{
				
			}
		}
	}
	$o1=new Student();
	$o1->_age=2;
	var_dump($o1);

2.__get(): 은 접근할 수 없는 멤버에 접근할 때 실행됩니다. :

<?php
header("Content-Type:text/html;charset=utf-8");
	Class Student{
		private $_age=23;
		function __get($name){
		//进入该函数表示$name 这个属性不可访问。
			return $this->$name;
		}
	}
	$o1=new Student();
	echo $o1->_age;
	echo "<br/>";
	var_dump($o1);

3.__unset(): 이 함수는 변수가 삭제될 때 트리거됩니다.

구체적인 적용 시나리오: 우리 모두는 특정 변수를 삭제하는 unset() 함수를 알고 있습니다. 예를 들어 위의 예에서 $_age가 공개인 경우 unset(을 사용할 수 있습니다. $o1 ->_age); 그러나 여기서 $_age는 비공개 속성이므로 현재 unset()을 사용하여 액세스할 수 없습니다.

<?php
header("Content-Type:text/html;charset=utf-8");
	Class Student{
		private $_age=23;
	}
	$o1=new Student();
	unset($o1->_age);


클래스의 속성 삭제를 구현하려면 __unset() 매직 메서드가 필요합니다.

<?php
header("Content-Type:text/html;charset=utf-8");
	Class Student{
		private $_age=23;
		function __get($name){
			return $this->$name;//正常应该有判断语句,这里省略了。
		}
		function __unset($name){
			unset($this->$name);
		}
	}
	$o1=new Student();
	echo $o1->_age;
	unset($o1->_age);
	echo $o1->_age;


특정 애플리케이션은 위의 __set() 및 __get()과 유사합니다. (변수 이름);을 unset하면 __unset() 메서드가 자동으로 호출되며, 메서드 본문은 직접 정의할 수 있습니다.

4.__isset(): 주로 __unset()과 마찬가지로 속성이 있는지 확인하는 데 사용됩니다. 외부에서 속성이 있는지 확인하려는 경우 isset() 함수를 사용하여 전용 변수에 액세스할 수 없습니다. 이 경우 __isset() 메서드를 사용하여 정의할 수 있습니다.

오버로드된 메서드

메서드 오버로딩과 속성 오버로딩의 조건은 동일합니다. 존재하지 않거나 액세스할 수 없는 메서드를 호출하면 __call() 및 Static__callStatic() 메서드가 호출됩니다.

시스템에 기본적으로 존재하지 않는 메소드 호출:

<?php
header("Content-Type:text/html;charset=utf-8");
	Class Student{
		public static $a=1;
		private $_age=23;
	}
	$o1=new Student();
	$o1->getName();//当调用本不存在的方法时。

시스템에 심각한 오류가 발생합니다.

__call() : 객체를 이용하여 호출할 때 사용하는 매직 메소드

<?php
header("Content-Type:text/html;charset=utf-8");
	Class Student{
		public static $a=1;
		private $_age=23;
		function __call($name,$arr){
			//$name表示传入的方法名,$arr表示传入的方法列表(是一个数组)。
			trigger_error("不存在该函数",E_USER_NOTICE);//直接报错
			//也可以在此重写函数。
		}
	}
	$o1=new Student();
	$o1->getName();//当调用本不存在的方法时。

Static__callStatic() : 클래스 호출 메소드를 사용하면, 즉 존재하지 않는 정적 메소드를 호출할 때 이 매직 메소드를 사용할 수 있다.

관련 권장 사항:

PHP의 오버로딩 소개

JavaScript의 함수 오버로딩에 대한 자세한 설명

PHP의 오버로딩 및 매직 메서드에 대한 자세한 예

위 내용은 PHP의 오버로딩에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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