> 백엔드 개발 > PHP 문제 > PHP에서 객체지향 매직 메소드인 __call 함수를 사용하는 방법

PHP에서 객체지향 매직 메소드인 __call 함수를 사용하는 방법

coldplay.xixi
풀어 주다: 2023-03-03 17:46:01
원래의
2473명이 탐색했습니다.

PHP는 객체 지향 매직 메소드의 __call 함수를 사용합니다. 1. 액세스할 수 없는 멤버 메소드가 호출되면 [__call] 매직 메소드가 호출됩니다. 2. 멤버 메소드가 존재하지 않고 멤버 메소드가 보호됩니다. private 언제, [__call] 매직 메서드를 호출합니다.

PHP에서 객체지향 매직 메소드인 __call 함수를 사용하는 방법

PHP는 객체 지향 매직 메서드의 __call 함수를 사용합니다.

기본 소개:

(1) 액세스할 수 없는 멤버 메서드를 조정할 때 __call 매직 메서드는 Call이 됩니다.

(2) 액세스할 수 없는 멤버 메서드는 (1. 멤버 메서드가 존재하지 않음, 2. 멤버 메서드가 protected 또는 private임)을 참조하세요.

Requirements

클래스 외부에서 직접 액세스할 수 있기를 바랍니다. 회원 메소드(비공개, 보호).

사례 설명

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

<?php

    header(&#39;content-type:text/html;charset=utf-8&#39;);

    //__call魔术方法

     class Monk{

        public $name;

        protected $hobby;

        public function __construct($name, $hobby){

            $this->name = $name;

            $this->hobby = $hobby;

        }

         

        //输出该对象的信息

        public function showInfo(){

             

            echo &#39;<br> 名字是 &#39; . $this->name;

            foreach($this->hobby as $hobby){

                echo &#39;<br> 爱好有 &#39; . $hobby;

            }

        }

        //会做算术题, 保护的

        protected function getSum($num1, $num2){

             

            return $num1 + $num2;

        }

        //编写这个__call魔术方法, __call 魔术方法会接收到两个参数

        /*

            @param $method_name 就是函数名

            @param $parameters 就是参数,类型是array

        */

        public function __call($method_name, $parameters){

             

//            echo &#39;<br> method_name = &#39; . $method_name;

//            echo &#39;<br> $parameters <br>&#39;;

//            var_dump($parameters);

             

            //判断 $this 中是否有  $method_name 函数,有就返回true,否则返回false

            if(method_exists($this, $method_name)){

                return $this->$method_name($parameters[0], $parameters[1]);

            }else{

                return &#39;没有你要调用的函数&#39;;

            }

             

        }

     }

     $monk = new Monk(&#39;济公&#39;, array(&#39;no1&#39;=>&#39;腾云驾雾&#39;, &#39;no2&#39;=>&#39;喝酒&#39;));

     $monk->showInfo();

     //当我们直接调用 protected 方法时,就会触发 __call 魔术方法

     echo &#39;<br> 结果是&#39; . $monk->getSum(100, 200);

로그인 후 복사

연습 질문:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

<?php

    header(&#39;content-type:text/html;charset=utf-8&#39;);

    /*

    练习题:

请编写一个Cat类(有 年龄, 名字 二个属性),要求二个属性全部都是public。

Cat类有一个 方法 jiSuan($n1, $n2, $oper) 可以计算+ - * / 是私有的.

在类外部,$对象名->play(&#39;jiSuan&#39;, $n1, $n2, $oper) 得到结果,注意play这个方法,在类中没有定义.

要求 play 是固定的,如果没有按规则写,则给出相应的错误提示!

    */

    class Cat{

        public $name;

        public $age;

        public function __construct($name, $age){

            $this->name = $name;

            $this->age = $age;

        }

         

        private function jiSuan($n1, $n2, $oper){

             

            $res = 0;

            switch($oper){

                case &#39;+&#39;:

                    $res = $n1 + $n2;

                    break;

                case &#39;-&#39;:

                    $res = $n1 - $n2;

                    break;

                case &#39;*&#39;:

                    $res = $n1 * $n2;

                    break;

                case &#39;/&#39;:

                    $res = $n1 / $n2;

                    break;

                default :

                    echo &#39;你输入的运算符号不对&#39;;

            }

            return $res;

        }

        //编写一个__call 魔术方法

        public function __call($method_name, $parameters){

             

            //先判断是否通过 &#39;play&#39; 调用

            if($method_name == &#39;play&#39;){

                //继续

                if( method_exists($this, $parameters[0]) ){

                    //继续

                    return $this->$parameters[0]($parameters[1], $parameters[2], $parameters[3]);

                }else{

                    return &#39; 你调用的 &#39; . $parameters[0] . &#39; 不存在&#39;;

                }

            }else{

                return &#39; 你调用的方式有问题 &#39;;

            }

        }

    }

    $cat = new Cat(&#39;小花猫&#39;, 3);

    echo &#39;<br> 运算的结果是 &#39; . $cat->play(&#39;jiSuan&#39;, 10, 20, &#39;-&#39;);

로그인 후 복사

위 내용은 PHP에서 객체지향 매직 메소드인 __call 함수를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿