1

有没有人通过 Symfony2 控制台使用按位运算符?或者类似于 style of 的东西--[no-]flag

我遇到了一个可以使用的实例--[no-]hardware--[no-software]用于触发包含/排除硬件、包含/排除软件。我总共有 3 个可以触发的不同选项。

我可以使用 symfony/console 2.8.x 在此功能上参考任何在线示例吗?

4

1 回答 1

2

尝试以下操作:

namespace AppBundle\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

class FlagTestCommand extends Command
{
    private static $flags = [
        'hardware' => 1,
        'software' => 2,
        'item3'    => 4,
        'item4'    => 8,
    ];

    protected function configure()
    {
        $this->setName('flags:test');

        foreach (self::$flags as $flagName => $bit) {
            $this
                ->addOption('no-' . $flagName, null, InputOption::VALUE_NONE)
                ->addOption($flagName, null, InputOption::VALUE_NONE)
            ;
        }
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        // you can configure your default bits here
        $bitsSet = 0;

        foreach (self::$flags as $flagName => $bit) {
            if ($input->getOption($flagName)) {
                // bit should be set
                $bitsSet |= $bit;
            }

            if ($input->getOption('no-' . $flagName)) {
                // bit should not be set
                $bitsSet &= ~$bit;
            }
        }

        // check if flags are set
        $hardwareEnabled = ($bitsSet & self::$flags['hardware']) === self::$flags['hardware'];
        $softwareEnabled = ($bitsSet & self::$flags['software']) === self::$flags['software'];

        var_dump(
            $hardwareEnabled,
            $softwareEnabled
        );
    }
}

输出:

$ php bin/console flags:test -h
Usage:
  flags:test [options]

Options:
      --no-hardware
      --hardware
      --no-software
      --software
      --no-item3
      --item3
      --no-item4
      --item4

$ php bin/console flags:test
bool(false)
bool(false)

$ php bin/console flags:test --hardware
bool(true)
bool(false)

$ php bin/console flags:test --hardware --no-hardware
bool(false)
bool(false)

$ php bin/console flags:test --hardware --no-hardware --software
bool(false)
bool(true)

PHP 位运算符参考: http: //php.net/manual/en/language.operators.bitwise.php

于 2018-05-11T05:29:47.403 回答