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() : 클래스 호출 메소드를 사용하면, 즉 존재하지 않는 정적 메소드를 호출할 때 이 매직 메소드를 사용할 수 있다.
관련 권장 사항:
JavaScript의 함수 오버로딩에 대한 자세한 설명
위 내용은 PHP의 오버로딩에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!