PHP 매직 메소드 __call 및 __callStatic에 대한 자세한 설명(코드 예제)
이 글의 목표:
1. PHP의 매직 메소드 정의를 이해합니다
2. __call() 매직 메소드의 사용 시나리오를 이해합니다
3. __call() 매직 메소드의 사용법을 숙지합니다
4. __callStatic() 매직 메소드 사용 시나리오 이해하기
5. __callStatic() 매직 메소드 사용법 익히기
(1) PHP
PHP의 매직 메소드 정의 이해하기 __(밑줄 2개)로 시작하는 모든 항목을 입력하세요. 클래스 메소드는 매직 메소드로 예약되어 있습니다. 따라서 클래스 메소드를 정의할 때 위의 매직 메소드를 제외하고 앞에 __를 붙이지 않는 것이 좋습니다.
이 두 가지 매직 메소드에는 또 다른 이름이 있는데, 이는 메소드의 오버로딩이라고도 할 수 있습니다
(2) __call() 매직 메소드의 사용 시나리오를 이해합니다
클래스에 존재하지 않는 메소드를 호출할 때 오류를 보고하려면 클래스에 __call 메소드를 정의하면 됩니다. 이 메소드는 이때 자동으로 실행됩니다
(3) __call() 매직 메소드 사용법을 마스터하세요
요약 :
1. PHP에서 __call의 형식은 다음과 같이 클래스에 정의됩니다: 공용 함수 __call(매개변수 1, 매개변수 2) 여기에는 2개의 __이 있어야 하며 __call이어야 합니다. 2개의 매개변수를 사용하고 하나를 덜 사용하면 작동하지 않습니다
2. 존재하지 않는 메서드를 호출하면 시스템은 개체가 있는 클래스의 정의된 __call 메서드를 자동으로 트리거합니다.
모든 요약은 다음을 통해 가져옵니다. 이제 연습을 활용합니다. 이해를 돕고 각 요약을 더욱 명확하고 직관적으로 만들 수 있는 요약을 보여드리겠습니다.
사례 1,
실제 목표:
1. PHP에서 __call은 공용 함수 __call(매개변수 1, 매개변수 2) 형식으로 클래스에 정의됩니다. 여기서는 2개의 __이 있어야 합니다. , 반드시 2개의 매개변수를 취해야 하며, 그 중 하나는 작동하지 않습니다
구체적인 코드는 다음과 같습니다: 매개변수 없이 먼저 살펴보겠습니다
<?php class Animal{ public function eat(){ } public function sleep(){ } //魔术方法 public function __call(){ echo "自动执行了Animal类中的__call方法<br/>"; } } $ani = new Animal(); ?>
실행 결과는 다음과 같습니다.
치명적인 오류: Method Animal::__call()은 D:E-classclass-codeclassingindex.php에서 정확히 2개의 인수를 취해야 합니다. 15
이제 2개의 매개변수를 작성하세요
<?php class Animal{ public $name = ""; public function __construct($name){ $this->name = $name; } public function eat(){ } public function sleep(){ } //魔术方法 public function __call($name,$args){ echo "自动执行了Animal类中的__call方法<br/>"; } } $monkey = new Animal("猴子"); ?>
실행 결과
오류가 보고되지 않았음을 나타내는 빈 페이지를 수정합니다.
사례 2,
실용 목표:
1. 객체가 위치한 클래스의 정의된 __call 메소드를 자동으로 트리거합니다
구체 코드는 다음과 같습니다.
<?php class Animal{ public $name = ""; public function __construct($name){ $this->name = $name; } public function eat(){ } public function sleep(){ } //魔术方法 public function __call($name,$args){ echo "自动执行了Animal类中的__call方法<br/>"; } } $monkey = new Animal("猴子"); //调用不存在的方法 $monkey->test(); ?>
실행 결과는 다음과 같습니다.
Animal 클래스의 __call 메소드가 자동으로 실행됩니다
我们发现其实我们没有手动的去调用__call方法,也就是说没有写成$monkey->__call(),但是这个方法依然执行了,因为什么呢?因为我们写了$monkey->test();而这个test方法没有在类中定义,然后这个类中又定义了这个魔术方法,所以它就像魔术一样,突然就被自动执行了
这里一定要注意,是2个下划线,不是一个,否则就不是魔术方法了,下面还是再来做下测试
具体代码如下:
<?php class Animal{ public $name = ""; public function __construct($name){ $this->name = $name; } public function eat(){ } public function sleep(){ } //魔术方法 试着少写一个_看下 public function _call($name,$args){ echo "自动执行了Animal类中的__call方法<br/>"; } } $monkey = new Animal("猴子"); //调用不存在的方法 $monkey->test(); ?>
运行结果为:
Fatal error: Uncaught Error: Call to undefined method Animal::test() in D:\E-class\class-code\classing\index.php:20 Stack trace: #0 {main} thrown in D:\E-class\class-code\classing\index.php on line 20
所以此刻就会报错了,因为没有__call的魔术方法了,所以一定要注意是2个下划线,就好像构造函数和析构函数一样,都是两个下划线
(四)、了解__callStatic()魔术方法的使用场景
为了在调用一个类中不存在的静态方法时,不报错,我们可以在类中定义__callStatic方法,它会在此刻被自动执行
(五)、掌握__callStatic()魔术方法的用法
1、PHP中__callStatic在类中定义格式如下 static public function __callStatic(参数1,参数2),这里注意必须是2个__,必须是__callStatic,而且必须是要带2个参数,多一个少一个都不行
2、当调用不存在的静态方法时,系统会自动触发对象所在类的定义好的__callStatic方法
每个总结都是通过实践得出来的,现在我们用实践来演示总结,这样可以促进理解,让每个总结理解起来更加清晰,直观
案例一、
实践目标:
1、PHP中__callStatic在类中定义格式如下 static public function __callStatic(参数1,参数2),这里注意必须是2个__,必须是__callStatic,而且必须是要带2个参数,多一个少一个都不行
具体代码如下:
<?php class Animal{ public $name = ""; public function __construct($name){ $this->name = $name; } public function eat(){ } public function sleep(){ } static public function staticFun(){ echo "Animal中的staticFun执行了<br/>"; } //魔术方法 static public function __callStatic($name,$args){ echo "自动执行了Animal类中的__callStatic方法<br/>"; } } //调用不存在的静态方法 Animal::staticFun(); Animal::test(); ?>
运行结果如下:
Animal中的staticFun执行了
自动执行了Animal类中的__callStatic方法
我们发现其实我们没有手动的去调用__callStatic方法,也就是说没有写成Animal::__callStatic(),但是这个方法依然执行了,因为什么呢?因为我们写了Animal::test();这个静态方法在类中不存在,然后这个类中又定义了这个魔术方法,所以它就像魔术一样,突然就被自动执行了
这里一定要注意,是2个下划线,不是一个,否则就不是魔术方法了,下面还是再来做下测试
<?php class Animal{ public $name = ""; public function __construct($name){ $this->name = $name; } public function eat(){ } public function sleep(){ } static public function staticFun(){ echo "Animal中的staticFun执行了<br/>"; } //魔术方法 试着少写一个 static public function _callStatic($name,$args){ echo "自动执行了Animal类中的__callStatic方法<br/>"; } } //调用不存在的静态方法 Animal::staticFun(); Animal::test(); ?>
运行结果如下:
Animal中的staticFun执行了
Fatal error: Uncaught Error: Call to undefined method Animal::test() in D:\E-class\class-code\classing\index.php:23 Stack trace: #0 {main} thrown in D:\E-class\class-code\classing\index.php on line 23
所以此刻就会报错了,因为没有__callStatic的魔术方法了,所以一定要注意是2个下划线,就好像构造函数和析构函数一样,都是两个下划线,而且一定要记得这个魔术方法本身就是static静态方法,否则也不会对
重要的东西我们还是用代码实践一下:
<?php class Animal{ public $name = ""; public function __construct($name){ $this->name = $name; } public function eat(){ } public function sleep(){ } // static public function staticFun(){ // echo "Animal中的staticFun执行了<br/>"; // } //魔术方法 试着少写static public function __callStatic($name,$args){ echo "自动执行了Animal类中的__callStatic方法<br/>"; } } //调用不存在的静态方法 // Animal::staticFun(); Animal::test(); ?>
运行结果为:
Warning: The magic method __callStatic() must have public visibility and be static in D:\E-class\class-code\classing\index.php on line 17
自动执行了Animal类中的__callStatic方法
所以一定要注意,__callStatic本身就是静态方法,不要少写static
(六)、总结
1、本文主要讲了另外2个魔术方法,__call,__callStatic,讲了他们的使用场景以及具体的实现
希望本文能给大家带来一定的帮助,谢谢!!!
위 내용은 PHP 매직 메소드 __call 및 __callStatic에 대한 자세한 설명(코드 예제)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Go 언어를 사용하여 객체 지향 이벤트 중심 프로그래밍을 구현하는 방법 소개: 객체 지향 프로그래밍 패러다임은 소프트웨어 개발에 널리 사용되며 이벤트 중심 프로그래밍은 트리거링 및 처리를 통해 프로그램 흐름을 실현하는 일반적인 프로그래밍 모델입니다. 이벤트. 이 기사에서는 Go 언어를 사용하여 객체 지향 이벤트 중심 프로그래밍을 구현하는 방법을 소개하고 코드 예제를 제공합니다. 1. 이벤트 중심 프로그래밍의 개념 이벤트 중심 프로그래밍은 이벤트와 메시지를 기반으로 하는 프로그래밍 모델로, 프로그램의 흐름 제어를 이벤트 트리거 및 처리로 전달합니다. 이벤트 중심으로

@JsonIdentityInfo 주석은 Jackson 라이브러리에서 객체가 부모-자식 관계를 가질 때 사용됩니다. @JsonIdentityInfo 주석은 직렬화 및 역직렬화 중에 객체 ID를 나타내는 데 사용됩니다. ObjectIdGenerators.PropertyGenerator는 사용할 개체 식별자가 POJO 속성에서 나오는 상황을 나타내는 데 사용되는 추상 자리 표시자 클래스입니다. 구문@Target(값={ANNOTATION_TYPE,TYPE,FIELD,METHOD,PARAMETER})@Retention(값=RUNTIME)공개

Go 언어는 유형 정의 및 메소드 연관을 통해 객체 지향 프로그래밍을 지원합니다. 전통적인 상속을 지원하지 않지만 구성을 통해 구현됩니다. 인터페이스는 유형 간의 일관성을 제공하고 추상 메소드를 정의할 수 있도록 합니다. 실제 사례에서는 OOP를 사용하여 고객 운영 생성, 획득, 업데이트 및 삭제를 포함하여 고객 정보를 관리하는 방법을 보여줍니다.

Go 언어는 객체 지향 프로그래밍, 구조체를 통한 객체 정의, 포인터 수신기를 사용한 메서드 정의, 인터페이스를 통한 다형성 구현을 지원합니다. 객체 지향 기능은 Go 언어에서 코드 재사용, 유지 관리 용이성 및 캡슐화를 제공하지만 클래스 및 상속 및 메서드 시그니처 캐스트에 대한 전통적인 개념이 부족하다는 제한 사항도 있습니다.

PHP 개체 지향 프로그래밍에서 플라이웨이트 패턴 분석 개체 지향 프로그래밍에서 디자인 패턴은 코드의 가독성, 유지 관리성 및 확장성을 향상시킬 수 있는 일반적으로 사용되는 소프트웨어 디자인 방법입니다. 플라이웨이트 패턴은 객체를 공유하여 메모리 오버헤드를 줄이는 디자인 패턴 중 하나입니다. 이 기사에서는 프로그램 성능을 향상시키기 위해 PHP에서 플라이웨이트 모드를 사용하는 방법을 살펴보겠습니다. 플라이웨이트 모드란 무엇인가요? 플라이웨이트 패턴은 서로 다른 객체 간에 동일한 객체를 공유하는 것을 목적으로 하는 구조적 디자인 패턴입니다.

PHP의 OOP 모범 사례에는 명명 규칙, 인터페이스 및 추상 클래스, 상속 및 다형성, 종속성 주입이 포함됩니다. 실제 사례에는 웨어하우스 모드를 사용하여 데이터를 관리하고 전략 모드를 사용하여 정렬을 구현하는 것이 포함됩니다.

Golang(Go 언어)에는 전통적인 의미의 클래스 개념이 없지만, 클래스와 유사한 객체지향 기능을 구현할 수 있는 구조체라는 데이터 형식을 제공합니다. 이 기사에서는 구조를 사용하여 객체 지향 기능을 구현하는 방법을 설명하고 특정 코드 예제를 제공합니다. 구조의 정의와 사용법 먼저 구조의 정의와 사용법을 살펴보자. Golang에서는 type 키워드를 통해 구조를 정의한 다음 필요한 곳에 사용할 수 있습니다. 구조에는 속성이 포함될 수 있습니다.

Python 메타프로그래밍 기본 Python 메타프로그래밍은 Python 코드를 동적으로 조작하는 기능으로 Python을 매우 강력한 언어로 만듭니다. 메타프로그래밍은 다음과 같은 방식으로 구현될 수 있습니다. 클래스 데코레이터: 클래스 데코레이터는 클래스 정의를 수정하는 데코레이터입니다. 클래스의 속성과 메서드를 추가하거나 수정하는 데 사용할 수 있으며 클래스의 인스턴스화 프로세스를 제어하는 데에도 사용할 수 있습니다. defadd_method_to_class(cls):defnew_method(self):print("Thisisanewmethod")setattr(cls,"new_method",new_method)returncls@a
