Es sieht für mich so aus, als ob dein Programm, mit welchem den $output verarbeitest, noch etwas ändert (evtl. eine Template-Engin, die keine empty-html-tags zulässt).
Bei mir läuft es jedenfalls korrekt durch.
<?php
// Enter your code here, enjoy!
$cdn = "https://kit.fontawesome.com/58c2e6341b.js";
$integrity = "";
$crossorigin = "";
echo '<script defer src="'.$cdn.'" integrity="'.$integrity.'" crossorigin="'.$crossorigin.'"></script>';
Result:
<script defer src="https://kit.fontawesome.com/58c2e6341b.js" integrity="" crossorigin=""></script>