Неопределенная переменная, Undefined variable: currencies in, при подключении конвертора валют из php в html

Доброго времени суток друзья! Не так давно углубился в изучении php и при воспроизведении кода, столкнулся с "Неопределенной переменной" в ошибке, никак не могу понять, как это получилось, где свернул не там...

Сама ошибка

<select tabindex="4" class="dropdown drop">
                                <br />
<b>Notice</b>:  Undefined variable: currencies in <b>D:\OSPanel\domains\ishop.loc\app\widgets\currenc\Currency.php</b> on line <b>19</b><br />
<br />
<b>Notice</b>:  Undefined variable: currency in <b>D:\OSPanel\domains\ishop.loc\app\widgets\currenc\Currency.php</b> on line <b>20</b><br />
<option value="" class="label"></option><!-- указываем код массива -->
<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>D:\OSPanel\domains\ishop.loc\app\widgets\currenc\currency_tpl\currency.php</b> on line <b>2</b><br />
                            </select>

Подключенные php классы

<?php

namespace app\controllers;

use ishop\base\Controller;
use app\models\AppModel;
use app\widgets\currenc\Currency;
use ishop\App;

//подключаем и создаем подкласс Контроллера с базой, от которого будем плясать
class AppController extends Controller{

    public function __construct($route){//выводим базы данных
        parent::__construct($route);
        new AppModel();
        /*для удобства использования конвертора Currency создаем к нему доступ через основной контролер, результат работы записываем в реестр, для работы на протежении всего приложения*/
        /*$curr = Currency::getCurrencies();//записываем метод назв валют в curr*/
        /*setcookie('currency', 'EUR', time() + 3600*24*7, '/');//валюта по умолчанию*/
        App::$app->setProperty('currencies', Currency::getCurrencies());//записываем в реестр валют который'currencies' библиотеку валют из метода
        App::$app->setProperty('currency', Currency::getCurrency(App::$app->getProperty('currencies')));//выгружаем реестр методов в реестр активной валюты с помощью setProperty
        /*debug(App::$app->getProperties());//распечатываем содержимое реестра*/
    }
}
<?php

namespace app\widgets\currenc;

use ishop\App;

class Currency{

    protected $tpl;
    protected $currencies;
    protected $currency;

    public function __construct(){/*формируем конструктор в котором отображаем путь к файлу с функцией*/
        $this->tpl = __DIR__ . '/currency_tpl/currency.php';
        $this->run();//вызываем метод
    }

    protected function run(){ //создаем метод основной
        $this->$currencies = App::$app->getProperty('currencies');
        $this->$currency = App::$app->getProperty('currency');
        echo $this->getHtml();
    }

    public static function getCurrencies(){//список валют
        return \R::getAssoc("SELECT code, title, symbol_left, symbol_right, value, base FROM currency ORDER BY base DESC");//возвращаем в метод из библиотеки, данные по столбцам меняя их порядокк с пр на лев
    }

    public static function getCurrency($currencies){//активная валюта
        if(isset($_COOKIE['currency']) && array_key_exists($_COOKIE['currency'], $currencies)){//если в куки в реесторе валют есть ключь currency
            $key = $_COOKIE['currency'];//помещаем тогда в массив
        }else{
            $key = key($currencies);//если нет то берем из ключа выбранной валюты
        }
        $currency = $currencies[$key];//и помещаем $key(выбранная валюта) вместе со всеми данными из нее в $currency
        $currency['code'] = $key;//присваеваем выбр валюте погоняло 'code'
        return $currency;//возвращаем записанный массив
    }

    protected function getHtml(){//формирует html разметку
        ob_start();//буферизация, для не отображения самой функции
        require_once $this->tpl;//подключаем шаблон с прописаным путем
        return ob_get_clean();//возвращаем проработанные данные обратно
    }
} 
 <option value="" class="label"><?=$this->currency['code'];?></option><!-- указываем код массива -->
<?php foreach($this->currencies as $k => $v): ?><!-- проходимся по реестору -->
    <?php if($k != $this->currency['code']): ?>проверяем какая валюта активная
        <option value="<?=$k;?>"><?=$k;?></option><!-- показываем ключ -->
    <?php endif; ?>
<?php endforeach; ?> 

html шаблон

 <div class="col-md-6 top-header-left">
    <div class="drop">
    <div class="box">
        <select tabindex="4" class="dropdown drop">
                <?php new \app\widgets\currenc\Currency(); ?>
        </select>
    </div>

Ответы (1 шт):

Автор решения: Simon

ну как минимум при беглом осмотре, вот это:

protected function run(){ //создаем метод основной
    $this->$currencies = App::$app->getProperty('currencies');
    $this->$currency = App::$app->getProperty('currency');
    echo $this->getHtml();
}

имеет лишние $, должно быть:

protected function run(){
    $this->currencies = App::$app->getProperty('currencies');
    $this->currency = App::$app->getProperty('currency');
    echo $this->getHtml();
}
→ Ссылка