@romazhan

Как вызвать `public` метод в php через объектные литералы?

<?php declare(strict_types = 1);

namespace Main;

class A {
    public function a(): void {
        echo 'a';
    }
}

final class B extends A {
    public function controll(string $method): void {
        ['returnA' => $this->a()][$method];
    }
}

$b = new B;
$b->controll('returnA');

Этот код будет работать, только если в `$methods` только один метод, если же больше, то они вызываются сразу после инициализации массива. Как сделать так, чтобы можно было вызывать их только при необходимости, не используя `switch` и другие условные операторы.
  • Вопрос задан
  • 363 просмотра
Пригласить эксперта
Ответы на вопрос 2
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
можешь использовать __invoke()
public function __invoke($method)
{
      if (!method_exists($this, $method)) {
            throw new BadMethodCallException($method);
      }
      return [$this, $method]();
}

ну и испльзование: $instance = new Test(); $instance($method);
Ответ написан
Tim-A-2020
@Tim-A-2020
Если я вас правильно понял, то можно примерно так реализовать
<?php
class A
{
    public function a()
    {
        echo "a";
    }
}

class B extends A
{
    public function controll($method)
    {
        if (method_exists($this, $method)) { // проверяем существует ли метод
            $reflectionMethod  = new ReflectionMethod($this, $method);
            if ($reflectionMethod->isPublic()) { // проверка является ли метод публичным
                return $this->$method(); // вызываем функцию
            }
        }
    }
}

$b = new B;
$b->controll("a");
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы