Я имею в виду использование функции 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, который удаляет сайт из определенной структуры
Это совершенно безопасно, если это ваш вопрос, поскольку php как квазинтерпретируемый язык не оставляет никаких следов или артефактов при прекращении выполнения.
Если это хорошая практика, это другое дело. Я бы сказал, что это хорошо для тестирования, но вы должны избегать этого в конечном коде. Причина в том, что это затрудняет поддержку кода. Представьте, что кто-то еще погружается в ваш код и пытается понять логику. На самом деле придется пройти все код, чтобы наткнуться на эту деталь. Скорее всего, нет, поэтому поведение вашего кода кажется нарушенным.
Вместо этого попробуйте сделать одно из них:
бросить исключение, чтобы покинуть текущую область. Такое исключение вполне может быть поймано и поглощено областью вызова, но это четкий и предсказуемый способ возврата. Очевидно, вы должны задокументировать такое поведение.
вернуть значение явно вне области видимости того, что «обычно» будет возвращено. Так например null
или же false
вместо типичного значения. Это заставляет вызывающую область проверять возвращаемое значение, но в любом случае это хорошая практика.
реструктурируйте свой код так, чтобы не было причин внезапно прекращать выполнение.
Вы не сказали нам, что вы хотели с этим die
.. следовательно, мы не можем сказать, используете ли вы правильный инструмент …
die
и это синоним, exit
оба выхода из сценария. Если это то, что вы хотите, это нормально.
Я склонен использовать exit
для нормальной работы и die
для ошибочных ситуаций (что-то, из чего вы не можете правильно восстановиться, например: не удалось подключиться к базе данных). Я также использую обертку для die
поэтому при необходимости я могу записывать такие события. Хотя обе команды выполняют одно и то же, намерения различаются, и я хочу выразить это намерение в коде.
В вашем примере я бы использовал exit
,