Метод
render() в классе View работает не так, как вы этого ожидаете.
Когда вы подключаете шаблон, то в данном случае там доступен только $this, а $this - это сам объект View.
Поэтому получить массив персон вы можете только через
$this->data['persons'] и никакой $persons там естественно нет.
т.е. в шаблоне работать будет только так
//...
foreach ($this->data['persons'] as $person) {
echo $person['lastName'];
// ...
}
Понимаете?
Для того, что был доступ в шаблоне именно к переменной $persons, вам надо импортировать её в методе render() с помощью функции extract() или через присваивание переменной переменной
public function render(string $template)
{
ob_start();
// функция импорта
extract($this->data, EXTR_OVERWRITE);
include $template;
$content = ob_get_contents();
ob_end_clean();
return $content;
}
Либо через переменные переменных
public function render(string $template)
{
ob_start();
// Импорт
foreach($this->data as $key => $value) {
// Переменные переменных $$
$$key = $value;
}
include $template;
$content = ob_get_contents();
ob_end_clean();
return $content;
}
В том и другом случае результат одинаковый.
И тогда в шаблоне вы уже сможете работать непосредственно с $persons