Чат Telegram
Группа ВКонтакте
Новый комментарий


Kirill.K

bin/cli.php

if (get_parent_class($className) != 'MyProject\Cli\AbstractCommand' ) {
        throw new \MyProject\Exceptions\CliException('Class "' . $className . '" not a subclass of AbstractCommand');
    }
ivashkevich

Хорошо, а если он является наследником через несколько классов? Подумайте в сторону PHP Reflection API.

Kirill.K

Я думал над этим, долго) Но не мог понять как решить эту проблему, а с этой наводкой сделал моментально, мало ещё опыта, не все инструменты держатся в голове)
bin/cli.php

...
    $reflectionOfClassName = new ReflectionClass($className);

    if (!$reflectionOfClassName->isSubclassOf('MyProject\Cli\AbstractCommand')) {
        throw new \MyProject\Exceptions\CliException('Class "' . $className . '" not a subclass of AbstractCommand');
    }
...
ivashkevich

Супер! Вместо строки 'MyProject\Cli\AbstractCommand' лучше использовать MyProject\Cli\AbstractCommand::class

Kirill.K

Хорошо, буду знать и использовать)

dnldcode
    if (in_array(\MyProject\Cli\AbstractCommand::class, class_parents($className))){
        throw new \MyProject\Exceptions\CliException('Class AbstractCommand is not a parent of class ' . $className);
    }
ivashkevich

Исключение будет бросаться для всех наследников этого класса, а нужно наоборот.

Iliusha99

$classReflector = new ReflectionClass($className);

if (!$classReflector->isSubclassOf(AbstractCommand::class)){
    throw new CliException("Некорректный класс");
}
Iliusha99

Такой вопрос, можно как то вызвать методы класса ReflectionClass статически, без создания объекта?

ivashkevich

Не знаю, почитайте документацию. Но непонятно для чего вам это.

ivashkevich

Отлично

Metey
$checkClassAbstract = new ReflectionClass($className);
    if (!$checkClassAbstract->isSubclassOf(MyProject\Cli\AbstractCommand::class)) {
        throw new \MyProject\Exceptions\CliException('Class "' . $className . '"is not subclass of AbstractCommand');
    }
ivashkevich

Отлично

Moskva
    $obj = new ReflectionClass($className);

    if(!$obj->isSubclassOf(MyProject\Cli\AbstractCommand::class)){
        throw new MyProject\Exceptions\CliException('Сlass '. $className . ' is not a descendant of the AbstractCommand class ');
    }
ivashkevich

Отлично

Онлайн-курсы PHP и MySQL
Обучение с полного нуля до уровня джуниора!
Начать бесплатно
Логические задачи с собеседований