PHP - Вызов функции при каждом вызове метода - PullRequest
1 голос
/ 11 июля 2020

У меня есть несколько классов с несколькими методами. Я хотел бы выполнять функцию с каждым вызовом метода без соответствующего вызова в каждом методе.

Есть ли способ автоматизировать это? Что-то вроде слушателя метода?

1 Ответ

1 голос
/ 11 июля 2020

Вы можете объявить весь свой метод private и использовать такой метод magi c __call.

<?php

class MyClass
{
    private function doSomething($param1, $param2){ //your previously public method
       echo "do ".$param1." ".$param2;
    }
    private function doSomethingForbidden($param1, $param2){ //your previously public method
       echo "doSomethingForbidden";
    } 

    private function verifyPermission($methodName){
       return in_array($methodName, [
          "doSomething"
       ]);
    }

    public function __call($name, $arguments)
    {
        if($this->verifyPermission($name)){
          return call_user_func_array(array($this, $name), $arguments);
        }else{
          throw new \Exception("You can't do that !");
        }
    }
}

$nc = new MyClass();
$nc->doSomething("pet", "the dog");
//do pet the dog
$nc->doSomethingForbidden("feed", "the birds");
//Fatal error:  Uncaught Exception: You can't do that !

когда метод является частным или не существует, PHP автоматически направляет вызов методу __call, если он существует. Оттуда вы можете делать то, что хотите (проверять разрешения, записывать данные и т. Д. c.), И, поскольку вы теперь находитесь «внутри» своего класса, вы можете сами вызывать свои частные методы, используя call_user_func_array с исходными аргументами.

Вы можете узнать больше, прочитав документацию для magi c methods https://www.php.net/manual/en/language.oop5.overloading.php#object .call

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...