Возможно ли сделать php глобалы доступными внутри области действия функции автоматически? - PullRequest
1 голос
/ 16 августа 2011

Позвольте мне начать с объяснения.У меня есть несколько глобальных соединений с базой данных, и у меня есть несколько простых функций, которые используют каждое из них и выполняют запросы и т. Д.

Потому что я хочу использовать соединения более одного раза и избавить меня от определения их каждый раз в каждомФункция Я создал их как глобальные в верхней части документа.Однако мне просто интересно, что вместо того, чтобы писать

global $mysql_db1, $mysql_db2, $mysql_db3, $mysql_db4, $mysql_db5;

Есть ли способ заставить это случиться без необходимости копировать и вставлять его каждый раз?

Я знаю, что это тривиально, но япросто хотел ускорить мою собственную разработку,

Ответы [ 4 ]

3 голосов
/ 16 августа 2011

Я бы создал класс ConnectionManager, который хранит эти соединения и использовал бы экземпляр класса для любой функции, использующей db:)

Использование Singleton также является хорошей идеей, если вы не хотитеставьте параметр каждый раз.

1 голос
/ 16 августа 2011

Лучше всего объявить их объектно-ориентированным способом, скажем, как свойства Singleton, а затем получить к ним доступ таким образом.Если вы настаиваете на том, чтобы делать что-то таким, что огорчит последующих разработчиков, вы можете использовать массив $GLOBALS.Глобалы - это всего лишь плохая идея, и мне бы хотелось, чтобы, честно говоря, ключевое слово можно было вычеркнуть из языка.

Очень простая версия того, что вы могли бы использовать:

class ConnectionHolder
{
    public $mysql_db1;

    private static $inst;
    public static &getInstance()
    {
        if( !self::$inst )
            self::$inst = new ConnectionHolder();
        return self::$inst;
    }

    private function __construct()
    {
        $this->mysql_db1 = // ... you may want another nameing convension.
        // yada yada
    }
}

Тогда в ваших функциях:

$ch =& ConnectionHolder::getInstance()
$ch->mysql_db1;
0 голосов
/ 16 августа 2011

При прямом ответе на ваш вопрос: нет.

Практический ответ на ваш вопрос указывает на то, что глобалы не такая горячая идея. Имейте в виду, что большинство аргументов там, я считаю, являются недействительными и вращаются вокруг других, говоря: «Фу, это брутто!» или «ты дашь дьяволу!».

Однако все они как бы танцуют вокруг этой одной проблемы: если две части вашей программы пытаются использовать одну и ту же глобальную переменную $foo для разных целей (т. Е. Случайно они выбрали одно и то же имя), тогда нет никакой гарантии ошибка произойдет. Вот почему рекомендуется использовать другой метод хранения, например, класс, потому что два класса с именем Foo обязательно вызовут ошибку.

В контексте вашей программы можно было бы порекомендовать создать ConnectionManager синглтон, где вы могли бы получить соединения с базой данных, написав что-то вроде $conn1 = ConnectionManager::getConnection('conn1');.

0 голосов
/ 16 августа 2011

Глобалы обычно считаются плохой практикой. Я не буду рассказывать вам об этом, но прочитайте эту статью: http://blog.case.edu/gps10/2006/07/22/why_global_variables_in_php_is_bad_programming_practice

Вы можете использовать суперглобальный $GLOBALS для доступа к любой переменной, определенной в глобальной области ( docs ). Таким образом, в вашем примере кода простое использование $GLOBALS['mysql_db1'] будет эквивалентно наличию строки global $mysql_db1;, а затем использованию $mysql_db1.

Я не могу достаточно подчеркнуть (не понтифицировав), насколько это плохой план. Вы можете быть в порядке с ним все время, пока вы разрабатываете, но бедный бедный Джонни Следующий, и пусть Боги Кодекса спасут вас, если вы включите сторонний скрипт, который также использует глобальные переменные ... и существует конфликт переменных имена. Теперь вы за это!

Как уже было предложено, вам лучше инкапсулировать функциональность вашей базы данных в классе. Если вы используете статический класс, у вас все еще есть все преимущества глобальной переменной без загрязненной области видимости или опасности перезаписи.

Вот пример класса базы данных вместе с использованием:

// put this in a library file or some place that all scripts include
require_once('database_class.php');
$db = new db(array(
 'host'=>'localhost'
 'user'=>'db_user_name'
 'password'=>'db_password',
 'database_name'=>'my_database'
));


// now anywhere in code you want to use it
$array = db::getRows('SELECT id, name FROM users');
$field = db::getField('SELECT name FROM users WHERE id=10');


<?php
// database_class.php
class db {
    static protected $resource_link = null;

    function __construct($args=false) {
        if ($args===false || !is_array($args))
            return false;
        if (
            !isset($args['host']) ||
            !isset($args['user']) ||
            !isset($args['password']) || 
            !isset($args['database_name'])
        )
            return critical_error('Missing database configuration data.');


        self::$resource_link = @mysql_connect($args['host'],$args['user'],$args['password']);
        if (!self::$resource_link)
             return critical_error('Error connecting to database 2001.  MySQL said:<br>'.mysql_error());
        @mysql_select_db($args['database_name'],  self::$resource_link);
        return;
    }


    // return a single-dimmension array of fields as string
    static public function getFields ($sql=false, $field=false) {
        $res = null;
        if ($sql!==false) {
            $query_obj = mysql_query($sql, self::$resource_link);
            if ($query_obj) {
                $res = array();
                 while ($this_row = mysql_fetch_array($query_obj)) {
                    if ($field !== false && isset($this_row[$field]))
                        $res[] = $this_row[$field];
                    else
                        $res[] = $this_row[0];
                }
            } // end :: if query object is not null
        } // end :: if $sql is not false
        return $res;
    }

    // return a single-dimmension array of fields as string with keyfield as key
    static public function getKeyFields ($sql=false, $key_field='id', $list_field='id') {
        $res = null;
        if ($sql!==false) {
            $query_obj = mysql_query($sql, self::$resource_link);
            if ($query_obj) {
                 while ($this_row = mysql_fetch_array($query_obj)) {
                    if (isset($this_row[$key_field]))
                        $res[$this_row[$key_field]] = $this_row[$list_field];
                }
            } // end :: if query object is not null
        } // end :: if $sql is not false
        return $res;
    }

    // return a single field as string from the first row of results
    static public function getField ($sql=false) {
        $res = null;
        if ($sql!==false) {
            $query_obj = mysql_query($sql, self::$resource_link);
            if ($query_obj) {
                $this_array = mysql_fetch_array($query_obj);
                if (is_array($this_array))
                    return $this_array[0];
            } // end :: if query object is not null
        } // end :: if $sql is not false
        return $res;
    }

    // return a single row as an array
    static public function getRow ($sql=false) {  
        $res = null;
        if ($sql!==false) {
            $query_obj = mysql_query($sql, self::$resource_link);
            if ($query_obj)
                $res = mysql_fetch_assoc($query_obj);
        } // end :: if $sql is not false
        return $res;
    }

    // return an array of rows as arrays of strings
    static public function getRows ($sql=false) {
        $res = null;
        if ($sql!==false) {
            $query_obj = mysql_query($sql, self::$resource_link);
            $res = array();
            if ($query_obj) {
                 while ($this_row = mysql_fetch_assoc($query_obj)) {
                    $res[] = $this_row;
                }
            } // end :: if query object is not null
        } // end :: if $sql is not false
        return $res;
    }

    // return an array of rows as arrays of strings, using specified field as main array keys
    static public function getKeyRows ($sql=false, $key_field='id', $include_key_in_results=true) {
        $res = null;
        if ($sql!==false) {
            $query_obj = mysql_query($sql, self::$resource_link);
            if ($query_obj) {
                $res = array();
                 while ($this_row = mysql_fetch_assoc($query_obj)) {
                    if (isset($this_row[$key_field])) {
                        $res[$this_row[$key_field]] = $this_row;
                        if ($include_key_in_results == false)
                            unset($res[$this_row[$key_field]][$key_field]);
                    } // end :: if checking for key field in result array
                } // end :: while looping query obj
            } // end :: if query object is not null
        } // end :: if $sql is not false
        return $res;
    }


    // do an update query, return true if no error occurs
    static public function update ($sql=false) {
        $res = false;
        if ($sql!==false) {
            $query_obj = mysql_query($sql, self::$resource_link);
            if ($query_obj && strlen(mysql_error()) < 1)
                $res = true;
        }
        return $res;
    }

    // do an insert query, return the auto increment ID (if there is one)
    static public function insert ($sql=false) {
        $res = null;
        if ($sql !== false) {
            $query_obj = mysql_query($sql, self::$resource_link);
            if ($query_obj)
                $res = mysql_insert_id(self::$resource_link);
        }
        return $res;
    }    
}
?>
...