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


Kirill.K 24.11.2018 в 20:50

bin/cli.php

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

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

Kirill.K 25.11.2018 в 14:34

Я думал над этим, долго) Но не мог понять как решить эту проблему, а с этой наводкой сделал моментально, мало ещё опыта, не все инструменты держатся в голове)
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 25.11.2018 в 17:25

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

Kirill.K 25.11.2018 в 18:14

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

dnldcode 25.03.2019 в 19:31
    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 27.03.2019 в 11:29

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

Iliusha99 09.08.2019 в 18:21

$classReflector = new ReflectionClass($className);

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

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

ivashkevich 10.08.2019 в 07:23

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

ivashkevich 10.08.2019 в 07:22

Отлично

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

Отлично

Moskva 17.08.2019 в 22:50
    $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 18.08.2019 в 06:52

Отлично

andreskrip 25.02.2020 в 18:30

Спасибо за урок!

    // Проверяем, является ли класс подклассом AbstractCommand
    $obj = new ReflectionClass($className);
    if (!$obj->isSubclassOf(\MyProject\Cli\AbstractCommand::class)) {
        throw new \MyProject\Exceptions\CliException($className . ' not extend AbstractCommand');
    }
ivashkevich 26.02.2020 в 20:14

Отлично

New 01.04.2020 в 00:13
private function getParam(string $paramName)
    {
        return $this->params[$paramName] ?? null;
    }

    private function ensureParamExists(string $paramName)
    {
        if (!isset($this->params[$paramName])) {
            throw new CliException('Param with name "' . $paramName . '" is not set!');
        }
    }

Если устанавливать значение элемента массива в null, почему бы это не делать сразу в методе ensureParamExists?

private function ensureParamExists(string $paramName)
    {
        if (!isset($this->params[$paramName])) {
            $this->params[$paramName] = null;
            throw new CliException('Param with name "' . $paramName . '" is not set!');
        }
    }

А вообще, зачем эта установка в null? Ведь при проверке

(!isset($this->params[$paramName]))

в случае отсутствия этого элемента в массиве вылетит все равно исключение?

ivashkevich 01.04.2020 в 04:47

Речь идёт только о проверке только обязательных параметров, а не вообще всех. Метод, который называется ensure... Не должен менять состояние проверяемых данных, это сайд-эффект, никак не отражаемый в его названии.

Логические задачи с собеседований