Du kannst nicht im Array-Index von $this->data \1 benutzen. Das \1,\2,\n wird nur geparsed wenn es direkt in dem String steht der an preg_replace übergeben wurde steht. Dein Skript sucht in $this->data nach dem Element mit dem Index '\1'. Das gibts nicht -> es ist leer -> es erscheint nichts im Template.

Du könntest es so machen, dass alle Vorkommnisse von $global durchgegangen und jeweils einzeln ersetzt werden. z.B. so:
PHP-Code:
while(preg_match('#\$global\[(.*)\]#Uis'$this->str$matches))
{
  
$this->str preg_replace('#\$global\['.$matches[1].']#Uis'$this->data[$matches[1]], $this->str);

Ungetestet.