-2

デバッグ以外の目的で die() 関数を使用することを指しています。これは「うまくいく」状況ですが、それは悪い習慣ですか?

use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Filesystem\Exception\IOExceptionInterface;

/**
 * This Command will help Cjw create a new demo site to start off
 * with the Multisite bundle.
 *
 * Class CreateSiteCommand
 * @package Cjw\GeneratorBundle\Command
 */
class RemoveSiteCommand extends ContainerAwareCommand
{
    private $vendor; //eg "Cjw"
    private $fullBundleName; //eg "SiteCjwNetworkBundle"
    private $fullBundleNameWithVendor; //eg "CjwSiteCjwNetworkBundle"
    (more vars)

    /**
     * this function is used to configure the Symfony2 console commands
     */
    protected function configure()
    {
        $this
            ->setName('cjw:delete-site')
            ->setDescription('Delete Cjw Site')
            ->addOption('db_user', null, InputOption::VALUE_REQUIRED, 'If set, the database user will be shown on the instructions');
    }

    /**
     * This function executes the code after the command input has been validated.
     *
     * @param InputInterface $input gets the user input
     * @param OutputInterface $output shows a message on the command line
     * @return int|null|void
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        // set optional db_username

        $dialog = $this->getHelper('dialog');
        $reusable = new \Reusable();
        $fs = new Filesystem();
        $cmd = new \ColorOutput();

        //push only vendors into the vendors array
        $vendors = $reusable->getFileList($reusable->getMainDirectory('src'),true);


        //select a vendor from the array
        $vendor = $dialog->select(
            $output,
            'Select your vendor [1]: ',
            $vendors,
            1
        );

        $bundles_in_vendor = $reusable->getFileList($reusable->getMainDirectory('src/'.$vendors[$vendor]),true);

        //push bundles that start with 'Site' into array
        $sites = array();

        foreach($bundles_in_vendor as $bundle)
        {
            if($reusable->startsWith($bundle,'Site'))
            {
                array_push($sites,$bundle);
            }
        }

        $site_to_delete = $dialog->select(
            $output,
            'Select site to remove: ',
            $sites,
            1
        );

        $bundle_deletion_path = $reusable->getMainDirectory('src/'.$vendors[$vendor]).'/'.$sites[$site_to_delete];

        $are_you_sure = array('yes','no');
        $confirmation = $dialog->select(
            $output,
            'Are you sure you want to delete: '.$sites[$site_to_delete],
            $are_you_sure,
            1
        );

        if($are_you_sure[$confirmation] == 'yes')
        {
            echo $cmd->color('yellow','attempting to remove bundle in: '.$bundle_deletion_path);
            $fs->remove($bundle_deletion_path);

            //returns demo
            $sitename = strtolower($sites[$site_to_delete]);
            $sitename = substr($sitename,0,-6);
            $sitename = substr($sitename,4);
            $this->setRawSiteNameInput($sitename);

            // returns acmedemo
            $symlinkname =  strtolower($vendors[$vendor].substr($sites[$site_to_delete],0,-6));
            $this->removeSymlinks($symlinkname,$this->getRawSiteNameInput());

            $this->createSetters($vendor,substr($sites[$site_to_delete],0,-6));

            $this->deleteEzPublishExtension();
            echo $this->getFullLegacyPath();

            echo $cmd->color('green','deletion process completed.');
        }
        else
        {
            echo "deletion canceled";
            die();
        }

        function_that_further_deletion_process();
    }

これは、特定の構造からサイトを削除する symfony2 コンソール スクリプトです。

4

2 に答える 2

2

それがあなたの質問であれば、それは完全に安全です。なぜなら、php は準インタープリター言語として、実行を終了するときに痕跡やアーティファクトを残さないからです。

それが良い習慣であるかどうかは別のことです。テスト目的では問題ないと思いますが、最終的なコードでは避けるべきです。その理由は、コードの保守が困難になるためです。他の誰かがあなたのコードに飛び込み、ロジックを理解しようとしていると考えてください。この詳細につまずくには、実際にすべてのコードを調べなければなりません。そうでない可能性があるため、コードの動作が壊れているように見えます。

代わりに、次のいずれかを実行してみてください。

  • 例外をスローして現在のスコープを離れます。このような例外は、呼び出し元のスコープによってキャッチされて飲み込まれる可能性がありますが、明確で予測可能な戻り方です。明らかに、そのような動作を文書化する必要があります。

  • 「通常」返される値の範囲から明らかに外れている値を返します。たとえばnull、またはfalse典型的な値の代わりに。これにより、呼び出しスコープが戻り値をチェックするように強制されますが、とにかくそれは良い習慣です。

  • 突然実行を終了する理由がないように、コードを再構築してください。

于 2015-02-10T10:38:11.657 に答える
0

あなたの意図が何であるかを私たちに伝えていませんdie..その結果、あなたが正しいツールを使用しているかどうかを判断できません...

dieと同義語であり、exitどちらもスクリプトを終了します。それがあなたの望みなら、それでいいのです。

exit私は通常の操作とdie、誤った状況 (たとえば、データベースに接続できなかったなど、適切に回復できないもの)に使用する傾向があります。ラッパーも使用しているdieため、必要に応じてそのようなイベントをログに記録できます。どちらのコマンドも同じことをしますが、意図に違いがあるので、その意図をコードで表現したいと思います。

あなたの例では、私は使用しますexit

于 2015-02-10T10:39:46.033 に答える