littleguga
@littleguga
Не стыдно не знать, а стыдно не интересоваться.

Можно ли использовать глобальные переменные?

В этой статье говорится, что использовать глобальные переменные не есть хорошо.
1) Это плохо только в php или во всех языках?
2) Как избегать их использование? Таскать каждый раз
$pdo = connectDB($host,$user,$pass,$db,$charset);
вместо
$pdo = connectDB(); //а уже в самой connectDB(); использовать глобальные


Заранее благодарен за ответ!
  • Вопрос задан
  • 3877 просмотров
Решения вопроса 3
FanatPHP
@FanatPHP
Чебуратор тега РНР
1. Про статью.
Аффтар кликушествует и тупит.
Единственная претензия, которую он родил, сводится к тому, что глобальную переменную можно переписать. Офигеть недостаток. А используя while, можно уйти в бесконечный цикл. Следуя его логике, while нельзя использовать, он разрушает структуру программы. И ещё моск.

2. О глобальных переменных.
Существует [по крайней мере] два способа использовать глобальные переменные.
  1. Для доступа к глобальным сервисам.
  2. Для передачи данных в функцию и получения результата из неё.

Так вот, второй способ является гарантированным пропуском в АДЪ. Это реальный способ довести до самоубийства человека, котрый будет потом разбирать твою программу.
В то же время, в первом варианте нет ничего зазорного. Все исползуют его, но из религиозных соображений задрапировав в статическую функцию, класс, или контейнер, но суть у всех будет ровно одна - получить доступ к глобальному сервису.

3. О твоем коде.
1. Учитывая п.2 из предыдущего раздела, становится понятно, что твой второй вариант нежелателен. При этом.
2. Я не понял фразу про "тасакать". Куда и что ты собираешься таскать? Код коннекта должен лежать вызываться РОВНО ОДИН РАЗ, лежать, где-нибудь глубоко в бутстрапе, и не вызывать ни малейших ассоциаций со словом "таскать".

И - да. Сто процентов отвечателей будут тебе писать не про твои переменные с хостом и паролем, а про саму $pdo. Потому что вопрос про неё является более логичным и куда боле актуальным: ведь переменные для коннекта требуются тебе 1 раз, а само соединение - десятки раз в разных местах скрипта.
Ответ написан
sanchezzzhak
@sanchezzzhak
Ля ля ля...
Использовать статику.
class DB {
   public static $pdo = null;
   public static function connect(){
        if(self::$pdo === null ){
               self::$pdo = connectDB($host,$user,$pass,$db,$charset);
         }
       return self::$pdo;
  }
}

2 вариант имеет право на жизнь только в место глобальных переменых использовать конфиг в види массива
config.php
<?php 
return [
              'host => 'localhost',   'username' => 'root' , 'password' => 122
];


У себя в функции
$config = include(PATH_CONFIG);
Ответ написан
abler98
@abler98
Software Engineer
Это плохо тем, что переменную можно переопределить, лучше сделать по второму способу от Александр N++ А вот очень простой, но полезный класс
<?php

class DB {
    private static $instance;

    public static function __callStatic($name, $args) {
        if (!self::$instance) self::getInstance();
        return call_user_func_array([self::$instance, $name], $args);
    }

    public static function getInstance() {
        self::$instance =  new PDO('mysql:host=127.0.0.1;dbname=test', 'root', '');
        self::$instance->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
        self::$instance->query('SET NAMES `utf8`');
    }
}

Использовать его можно примерно так
$query= DB::query('SELECT * FROM `users`');
$prepare = DB::prepare('...')->execute(...);

Надеюсь, что суть ясна )
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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