Дело в том, что точка остановки это точка которая БУДЕТ выполнена, а не УЖЕ выполненная. Т.е. когда XDebug останавливается на строчке
$arr = [0,1,2,3,4,5];
это означает, что эта строчка только БУДЕТ выполнена. Соответственно, поскольку до этой строчки переменная $arr нигде не объявлена, то до выполнения это строчки переменной вообще не существует. Переменная создается во время выполнения этой строчки.
UPD
Если вопрос заключается в том, почему переменной не существует до выполнения строчки
$arr = [0,1,2,3,4,5];
то представьте гипотетическую ситуацию
function TestFunction(){
if ($_REQUEST['some_key'] == 1)
return [1,2,3,4,5];
else if ($_REQUEST['some_key'] == 2)
return '12345';
else if ($_REQUEST['some_key'] == 3)
return 12345;
//и т.д.
else
return null;
}
$arr = TestFunction();
var_dump($arr);
В этом случае в переменную $arr могут попасть кардинально разные значения, зависящие исключительно от того, что пришло в запросе. PHP не в состоянии предсказать, какой тип переменной создавать для $arr до того как выполниться функция TestFunction(). Именно поэтому в PHP переменные не существуют до первого присвоения. Это особенность любого языка с динамической типизацией.