$dir = __DIR__ . '/dir';
if (is_dir($dir)) rmdir($dir);

Если каталог не будет пуст, то получим ошибку:

Warning: rmdir(dir): Directory not empty in...

Данная функция рекурсивно удалит саму директорию и её содержимое:

function removeDirectory(string $dir): void
{
  if (is_dir($dir)):
    chmod($dir, 0777);
      if ($elements = glob($dir . "/*")):
        foreach($elements as $element):
          is_dir($element) ? removeDirectory($element) : unlink($element);
        endforeach;
      endif;
    rmdir($dir);
  endif;
}

$dir = __DIR__ . '/dir';
removeDirectory($dir);

Вариант #2:

function removeDirectory(string $dir): void
{
  if (is_dir($dir)):
    $elements = array_diff(scandir($dir), ['.','..']);
    foreach ($elements as $element):
      is_dir("$dir/$element")
        ? removeDirectory("$dir/$element")
        : unlink("$dir/$element");
    endforeach;
    rmdir($dir);
  endif;
}

$dir = __DIR__ . '/dir';
removeDirectory($dir);

Данная функция удалит только содержимое директории (очистить её), если не передать в неё вторым параметром флаг на удаление самой директрии.

function clearDir(string $dir, bool $rmdir = false): void
{
  if (is_dir($dir)):
    if ($objs = glob($dir . '/*')):
      foreach($objs as $obj):
        is_dir($obj) ? clearDir($obj, true) : unlink($obj);
      endforeach;
    endif;
    if ($rmdir) rmdir($dir);
  endif;
}


$dir = __DIR__ . '/dir';
clearDir($dir);

// Очистить директорию и удалить саму директорию
clearDir($dir, true);

Например, нужно удалить все файлы, кроме файла .htaccess. Здесь важно то, что функция работает НЕ рекурсивно и удаляет только файлы:

function removeFilesExcept(string $dir, array $except): void
{
  if (is_dir($dir)):
    foreach (glob($dir . '/*') as $file):
      if (!in_array(basename($file), $except) && is_file($file)):
        unlink($file);
      endif;
    endforeach;
  endif;
}

$dir = __DIR__ . '/dir';
$except = ['.htaccess'];
removeFilesExcept($dir, $except);