Вы можете объявить весь свой метод 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