Mysql глобальные переменные php

Mysql глобальные переменные php

Наш чат в Telegram для обмена идеями, проектами, мыслями, людьми в сфере ИТ г.Ростова-на-Дону: @it_rostov

Здесь переменная $a будет доступна внутри включенного скрипта b.inc. Однако определение (тело) пользовательской функции задает локальную область видимости данной функции. Любая используемая внутри функции переменная по умолчанию ограничена локальной областью видимости функции. Например:

$a = 1; /* глобальная область видимости */ function test() < echo $a; /* ссылка на переменную локальной области видимости */ >test();

Этот скрипт не сгенерирует никакого вывода, поскольку выражение echo указывает на локальную версию переменной $a, а в пределах этой области видимости ей не было присвоено значение. Возможно вы заметили, что это немного отличается от языка C в том, что глобальные переменные в C автоматически доступны функциям, если только они не были перезаписаны локальным определением. Это может вызвать некоторые проблемы, поскольку люди могут нечаянно изменить глобальную переменную. В PHP, если глобальная переменная будет использоваться внутри функции, она должна быть объявлена глобальной внутри определения функции.

Ключевое слово global

Сначала пример использования global:

Пример #1 Использование global

$a = 1; $b = 2; function Sum() < global $a, $b; $b = $a + $b; >Sum(); echo $b;

Вышеприведенный скрипт выведет 3. После определения $a и $b внутри функции как global все ссылки на любую из этих переменных будут указывать на их глобальную версию. Не существует никаких ограничений на количество глобальных переменных, которые могут обрабатываться функцией.

Второй способ доступа к переменным глобальной области видимости — использование специального, определяемого PHP массива $GLOBALS. Предыдущий пример может быть переписан так:

Пример #2 Использование $GLOBALS вместо global

$a = 1; $b = 2; function Sum() < $GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b']; >Sum(); echo $b;

$GLOBALS — это ассоциативный массив, ключом которого является имя, а значением — содержимое глобальной переменной. Обратите внимание, что $GLOBALS существует в любой области видимости, это объясняется тем, что $GLOBALS является суперглобальным. Ниже приведен пример, демонстрирующий возможности суперглобальных переменных:

Пример #3 Суперглобальные переменные и область видимости

Замечание:

Использование ключевого слова global вне функции не является ошибкой. Оно может быть использовано в файле, которые включается внутрь функции.

Использование статических (static) переменных

Другой важной особенностью области видимости переменной является статическая переменная. Статическая переменная существует только в локальной области видимости функции, но не теряет своего значения, когда выполнение программы выходит из этой области видимости. Рассмотрим следующий пример:

Пример #4 Демонстрация необходимости статических переменных

Эта функция довольно бесполезна, поскольку при каждом вызове она устанавливает $a в 0 и выводит 0. Инкремент переменной $a++ здесь не играет роли, так как при выходе из функции переменная $a исчезает. Чтобы написать полезную считающую функцию, которая не будет терять текущего значения счетчика, переменная $a объявляется как static:

Читайте также:  String literal type typescript

Пример #5 Пример использования статических переменных

Теперь $a будет проинициализирована только при первом вызове функции, а каждый вызов функции test() будет выводить значение $a и инкрементировать его.

Статические переменные также дают возможность работать с рекурсивными функциями. Рекурсивной является функция, вызывающая саму себя. При написании рекурсивной функции нужно быть внимательным, поскольку есть вероятность сделать рекурсию бесконечной. Вы должны убедиться, что существует адекватный способ завершения рекурсии. Следующая простая функция рекурсивно считает до 10, используя для определения момента остановки статическую переменную $count:

Пример #6 Статические переменные и рекурсивные функции

Замечание:

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

Пример #7 Объявление статических переменных

Замечание:

Статические объявления вычисляются во время компиляции скрипта.

Замечание:

Использование ключевого слова global вне функции не является ошибкой. Оно может быть использовано, если файл включается внутрь функции.

Ссылки с глобальными (global) и статическими (static) переменными

Движок Zend Engine 1, лежащий в основе PHP 4, оперирует модификаторами переменных static и global как ссылками. Например, реальная глобальная переменная, внедренная в область видимости функции указанием ключевого слова global, в действительности создает ссылку на глобальную переменную. Это может привести к неожиданному поведению, как это показано в следующем примере:

function test_global_ref() < global $obj; $obj = &new stdclass; >function test_global_noref() < global $obj; $obj = new stdclass; >test_global_ref(); var_dump($obj); test_global_noref(); var_dump($obj);

Результат выполнения данного примера:

Аналогично ведет себя и выражение static. Ссылки не хранятся статично:

function &get_instance_ref() < static $obj; echo 'Статический объект: '; var_dump($obj); if (!isset($obj)) < // Присвоить ссылку статической переменной $obj = &new stdclass; >$obj->property++; return $obj; > function &get_instance_noref() < static $obj; echo 'Статический объект: '; var_dump($obj); if (!isset($obj)) < // Присвоить объект статической переменной $obj = new stdclass; >$obj->property++; return $obj; > $obj1 = get_instance_ref(); $still_obj1 = get_instance_ref(); echo "\n"; $obj2 = get_instance_noref(); $still_obj2 = get_instance_noref();

Результат выполнения данного примера:

Статический объект: NULL
Статический объект: NULL
Статический объект: NULL
Статический объект: object(stdClass)(1) [«property»]=>
int(1)
>

Этот пример демонстрирует, что при присвоении ссылки статической переменной она не запоминается, когда вы вызываете функцию &get_instance_ref() во второй раз.

User Contributed Notes 59 notes

class sample_class < public function func_having_static_var($x = NULL) < static $var = 0; if ($x === NULL) < return $var; >$var = $x; > > $a = new sample_class(); $b = new sample_class(); echo $a->func_having_static_var()."\n"; echo $b->func_having_static_var()."\n"; // this will output (as expected): // 0 // 0 $a->func_having_static_var(3); echo $a->func_having_static_var()."\n"; echo $b->func_having_static_var()."\n"; // this will output: // 3 // 3 // maybe you expected: // 3 // 0
class test1<> class test2<> class test3<> function cache( $class ) < static $loaders = array(); $loaders[ $class ] = new $class(); var_dump( $loaders ); >print '
'; cache( 'test1' ); cache( 'test2' ); cache( 'test3' );
print "Global scope FILENAME [$filename]\n"; class MyTestClass extends PHPUnit_Framework_TestCase < function testMyTest() < global $filename; print "Method scope global FILENAME [$filename]\n"; print "Method scope GLOBALS[FILENAME] [".$GLOBALS["filename"]."]\n"; >>
function foo()< $f_a = 'a'; function bar()< global $f_a; echo '"f_a" in BAR is: ' . $f_a . '
'; // doesn't work, var is empty! > bar(); echo '"f_a" in FOO is: ' . $f_a . '
'; >
//Using the keyword global $a=1; $b=2; function sum() < global $a, $b; $a += $b; >$t = microtime(true); for($i=0; $i echo microtime(true)-$t; echo " -- ".$a."
"; //Using the superglobal array $a=1; $b=2; function sum2() < $GLOBALS['a'] += $GLOBALS['b']; >$t = microtime(true); for($i=0; $i echo microtime(true)-$t; echo " -- ".$a."
";
//declare this before include global $myVar; //or declare this inside the include file $nowglobal = $GLOBALS['myVar'];
I was struggling forever to figure this out and finally tried the $GLOBALS["filename"] = $filename approach, and it worked for me. This happens on one of my machines, on which I installed Zend AMF a few months before my most recent machine. The globals worked fine when calling the PHP script directly from a browser, but when I called the function from my Flash project, which uses Zend AMF to interface with the PHP script, I was seeing this problem, but it was fixed using this approach.

3
jakub dot lopuszanski at nasza-klasa dot pl3 years ago
If you use __autoload function to load classes' definitons, beware that "static local variables are resolved at compile time" (whatever it really means) and the order in which autoloads occur may impact the semantic.
For example if you have:
class Singleton static public function get_instance() static $instance = null;
if($instance === null) $instance = new static();
>
return $instance;
>
>
?>
and two separate files A.php and B.php:
class A extends Singleton<>
class B extends A<>
then depending on the order in which you access those two classes, and consequently, the order in which __autoload includes them, you can get strange results of calling B::get_instance() and A::get_instance().
It seems that static local variables are alocated

Описание класса language, примеры использования класса language.

Источник

MySQL пользовательская глобальная переменная

В моей структуре базы данных я склонен хранить некоторую переменную, которая должна действовать как РОЛЬ или ТИП, как SMALLINT , Например:

CREATE TABLE `house` ( `id` int(11) NOT NULL AUTO_INCREMENT, `type` smallint(11) NOT NULL, 
define('HOUSE_SMALL_TYPE', '0'); define('HOUSE_MEDIUM_TYPE', '1'); 

Так в php, в запросах SELECT я делаю:

$this->db->query("SELECT * FROM house WHERE type=?;", HOUSE_SMALL_TYPE); 
  1. В части PHP есть лучший способ сделать это?
  2. В самом mysql, mysql также имеет глобальную функциональность определения (как определение в php)?
SELECT * FROM house WHERE type = HOUSE_SMALL_TYPE 

в запросе MySQL.
Моя цель состоит в том, чтобы, когда я делаю SELECT в mysql, я никоим образом не буду продолжать отображать значение 0,1,2 с его реальным значением. Просто конвенсия для просмотра значений таблиц, без изменения структуры таблицы и полей.

5 ответов

Я предлагаю использовать переменные MySQL:

SET HOUSE_SMALL_TYPE = 0; SET HOUSE_MEDIUM_TYPE = 1; 

Затем в ваших запросах вы можете использовать эти переменные:

SELECT * FROM house WHERE type = @HOUSE_SMALL_TYPE; 

Этот метод определяет переменные сеанса:

Если вы изменяете системную переменную сеанса, значение остается в силе до тех пор, пока ваш сеанс не закончится или пока вы не измените переменную на другое значение. Изменение не видно для других клиентов.

Если вы хотите определить глобальные переменные MySQL (доступны для всех сессий):

SET GLOBAL HOUSE_SMALL_TYPE = 0; SET GLOBAL HOUSE_MEDIUM_TYPE = 1; 

Чтобы явно указать, что переменная является глобальной переменной, перед ее именем следует указывать GLOBAL или @@global. Привилегия SUPER требуется для установки глобальных переменных.

Начиная с MySQL 5.5 невозможно установить глобальную пользовательскую переменную.

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

DROP PROCEDURE IF EXISTS HOUSE_SMALL_TYPE; DELIMITER // CREATE PROCEDURE HOUSE_SMALL_TYPE () BEGIN SELECT 0; END// DELIMITER ; 

DROP заявление необходимо для того, чтобы иметь возможность изменить его.

ИМХО, MySQL имеет огромный пробел в этой области, по-видимому, в последних версиях. Одной из альтернатив, возможно, было прибегнуть к установке переменных среды ОС, но как я могу получить такие значения из MySQL, я не смог увидеть.

Здесь есть целая страница: https://dev.mysql.com/doc/refman/5.0/en/setting-environment-variables.html обучающая нас тому, как "устанавливать" переменные среды ОС в оболочке, но ни слова о фактически вызывает такие переменные в MySQL.

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

CREATE DEFINER=`root`@`localhost` FUNCTION `DEFAULT_COUNTRY_CODE`() RETURNS CHAR(4) DETERMINISTIC RETURN '+234'; 

В другом месте в вашем запросе вы можете сделать:

SELECT CONCAT(DEFAULT_COUNTRY_CODE(), "-", telephone) FROM contacts WHERE CountryCode = "NGA" 

Ваш подход хорош, если вы хотите видеть значения в MySQL вместо 1, 2, 3 и т. Д., То подумайте:

define('HOUSE_SMALL_TYPE', 'HOUSE_SMALL_TYPE'); define('HOUSE_MEDIUM_TYPE', 'HOUSE_MEDIUM_TYPE'); 

Тогда в MySQL вы можете использовать:

SELECT * FROM house WHERE type = 'HOUSE_SMALL_TYPE'; 

Вам просто нужно помнить, что вы не можете просто вставить любое значение, которое вам нравится, в house.type без поддержки этого в PHP.

потому что тогда вы можете использовать HouseType::SMALL или же House::TYPE_SMALL в вашем коде PHP, а не с использованием глобального определения. Делая это, вы можете получить выгоду от завершения кода в некоторых IDE.

Источник

Оцените статью