Все переменные функции являются глобальными - PullRequest
0 голосов
/ 31 мая 2010

Возможно ли сделать все переменные функции глобальными, не набирая их все как global $a, $b, $c...?

Ответы [ 4 ]

4 голосов
/ 31 мая 2010

Попробуйте создать статический объект в вашем приложении и назначить переменные для этой области, вот так!

<?php
/*
    * Core class thats used to store objects of ease of access within difficult scopes
*/
class Registry
{
    /*
        * @var array Holds all the main objects in an array a greater scope access
        * @access private
    */
    private static $objects = array();

    /**
        * Add's an object into the the global
        * @param string $name
        * @param string $object
        * @return bool
    */
    public static function add($name,$object)
    {
        self::$objects[$name] = $object;
        return true;
    }

    /*
        * Get's an object out of the registry
        * @param string $name
        * @return object on success, false on failure
    */  
    public static function get($name)
    {   if(isset(self::$objects[$name]))
        {
            return self::$objects[$name];
        }
        return false;
    }

    /**
        * Removes an object out of Registry (Hardly used)
        * @param string $name
        * @return bool
    */
    static function remove($name)
    {
        unset(self::$objects[$name]);
        return true;
    }

    /**
        * Checks if an object is stored within the registry
        * @param string $name
        * @return bool
    */
    static function is_set($name)
    {
        return isset(self::$objects[$name]);
    }
}
?>

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

Допустим, вы только что установили соединение с БД, вот как вы его используете

...
$database = new PDO($dns);

Registry::add('Database',$database);

$DBConfig = Registry::get('Database')->query('SELECT * FROM config_table')->fetchAll(PDO::FETCH_CLASS);
Registry::add('Config',$DBConfig);

Больше нигде в вашем скрипте вы не можете добавлять или извлекать элементы.

с Registry::get('ITEM_NEEDED');

Это будет работать в методах функций и т. Д.

Идеальный пример

function insertItem($keys,$values)
{
   Registry::get('Database')->query('INSERT INTO items ('.implode(',',$keys).') VALUES ('.implode(',',$values).')');
}

Надеюсь, это поможет

3 голосов
/ 31 мая 2010

Нет. В любом случае это было бы ужасно.

2 голосов
/ 31 мая 2010

Вы можете передать их в качестве аргументов, и тогда вам не понадобится ключевое слово global:

function(&$a, &$b, &$c)
{
 // your code........
}
1 голос
/ 31 мая 2010

Вы всегда можете использовать $GLOBALS["var"] вместо $var. Конечно, если вам это нужно, вы, скорее всего, делаете это неправильно.

...