@vanyproduction

Как можно улучшить код?

Здравствуйте. В php я "полный ноль".
Многие программисты php часто жалуются на "говнокод", которого очень много в проектах и никто за этим не следит.
Я накидал следующий код для проекта
<?php 
$price_usd = get_field('car-price-1hr'); 
$currency_usd = get_field('usd-currency', 'option');
$discount_3h = get_field('discount-3h','option');
$discount_5h = get_field('discount-5h','option');
$discount_12h = get_field('discount-12h','option');

$price_uah = $price_usd * $currency_usd;

$price_usd_3h = $price_usd * $discount_3h;
$price_usd_5h = $price_usd * $discount_5h;
$price_usd_12h = $price_usd * $discount_12h;

$price_uah_3h = $price_uah * $discount_3h;
$price_uah_5h = $price_uah * $discount_5h;
$price_uah_12h = $price_uah * $discount_12h;
?>

Код указывается до самого div'a, в котором выводится через echo разные переменные. Сначала я делал расчеты прям возле вывода, но заметил, что переменная видна и вне скобок <?php ?>, в которых рассчитана, и может быть вызвана в других местах, поэтому локализовал код до самого html.
Отсюда вывод - переменные могут вызываться где угодно. Нужно ли их очищать ну или как это называется у Вас, специалистов php? :)
  • Вопрос задан
  • 214 просмотров
Пригласить эксперта
Ответы на вопрос 2
shaks
@shaks
Почитайте про паттерн проектирования MVC
Суть паттерна заключается в изоляции моделей(Model) представлений (View) и контроллера (Controller) друг от друга.

Ну а технически изоляция переменных контроллера от представления (ваш случай сейчас) выглядит примерно так:

<?php
#app/controllers/prices.php
class PricesController extends BaseController // Контроллер.  Принимает запросы и работает с моделью и представлением. В примере моем только представление.
{
    function action_index() 
    {
        $foo = 'foo';
        $bar = array('bar1', 'bar2');
        self::render('prices/index', array('foo'=>$foo, 'bar'=>$bar)); // метод реализован в базовом контроллере
    }
}
#  app/controllers/base.php 
class BaseController {  // Главный контроллер, от которого унаследуются все остальные. В нем могут быть всякие настройки и тд итп. В данном случае только статический метод рендеринга страницы
    const VIEW_FOLDER = 'app/views';

    static function render($template, $data)
    {
        $view = VIEWS_PATH."/{$template}.html.php";
        if(file_exists($view))
        {
            extract($data); // Самая соль в этой функции, она создает переменные из полученного массива, именем переменной является ключ массива.
                            // В итоге шаблон у нас видит только эти переменные + те которые объявлены в самом методе render до инклуда, т.е. будет видна переменная $template и массив $data
            ob_start();
            include $view;
            $yield = ob_get_clean();
            include VIEWS_PATH . '/layouts/application.html.php'; // это главный лайут, содержащий хеадер и футер.
        }
    }
}


А вот и View:
главный лайоут:
# app/views/layouts/application.html.php
<html>
<body>
    <?php echo(isset($yield) ? $yield : '')?>
</body>
</html>


шаблон вывода для нашего контроллера:
# app/views/prices/index.html.php
foo: <?php echo($foo)?><br>
bar: <?php var_dump($bar)?>

В итоге, в шаблоне prices/index.html.php будут видны переменные $foo и $bar объявленные и в нашем контроллере и переданные на рендер. (
self::render('prices/index', array('foo'=>$foo, 'bar'=>$bar));
)

P.S. Я мог гдето ошибиться, т.к. писал быстро, буквально на коленке, ничего не проверял вообще. Я хотел показать саму концепцию на примере того, как делать изоляцию переменных чтобы они не могли вызываться "где угодно" как Вы выразились.

P.S.S Работу с моделями я не писал, поэтому приведенный здесь код не является MVC, лишь VC.
Ответ написан
@Akellacom
CTO
Еще можете почитать https://refactoring.guru/ru
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы