belarusweb.net
© Петр Романовский Минск, 2016-2017.



belarusweb.net

Основы создания сайтов...
PHP+MySQL >>>
                          Учебник Задачник Справочник

1.5. Понятие переменной

Переменные в PHP, как и в других языках программирования, применяются для хранения и обработки различных типов данных и являются именованными контейнерами для их размещения. В случае необходимости хранимые данные могут быть получены по имени и далее использованы, заменены другими данными или вообще удалены. Объявлять переменные в PHP перед использованием не нужно, они могут быть инициализированы (т.е. им может быть присвоено начальное значение) сразу же после создания. Для обозначения переменных используется знак доллара '$', после которого записывается непосредственно имя переменной. Как и другие идентификаторы PHP имя переменной является регистрозависимым, должно начинаться со знака подчеркивания или буквы латинского алфавита и может состоять только из букв латинского алфавита, цифр и знаков подчеркивания. Использование переменных показано в коде примера 1.4.

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">	
	<title>Переменные</title>
</head>
<body>
<?php 
	$apples=0; 		//Присвоили переменной начальное значение
	
	/* Оператор echo выводит перечисляемые через запятую 
	переменные в код html-документа, но перед выводом преобразует 
	их в строки, подробнее об этом позже*/
	
	echo "Пока что у нас имеется ", $apples, " яблок.<br>";
		
	$apples=5; 		//Присвоим переменной новое значение
	
	echo "После встряски дерева яблок стало ", $apples, ".<br>";
	
	/* Изменим значение переменной прибавив еще пять яблок.
	Для этого к прежнему значению прибавим число 5, теперь 
	$apples==10 (равно) */
	$apples=$apples+5; 
	$Apples=3;	 	//$Apples и $apples разные переменные
	
	echo "От ветра упало еще 5 яблок и теперь их стало ", 
		 $apples, ".<br>", "Из них ", $Apples, " яблока 
		 оказались червивыми.<br>";
?>
</body>
</html>

Пример 1.4. Переменные в PHP

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

Оператор echo служит для вывода одной или нескольких строк. Разрешается выводить и другие типы данных, например, числа, но они, как и другие типы данных, перед выводом все равно преобразуются в строки (о типах данных и преобразовании одних типов данных в другие мы поговорим в соответствующем разделе). При этом, если блок php-кода вставлен, например, в html-документ, то выводимый оператором echo текст будет вставлен в html-код, в то время как сам php-код перед отправкой страницы будет из нее удален. Подробнее данный оператор будет рассмотрен во второй части учебника.

Не забываем о необходимости набора кода примеров в редакторе. Не пытайтесь ускорить процесс изучения лишь быстрым чтением материала. Большую часть времени нужно проводить за набором кода и его тестированием.

По умолчанию, переменные в PHP присваиваются по значению. Это значит, что после того, как значение одной переменной будет присвоено другой, обе переменные будут иметь одно и то же значение, но изменение после этого значения одной из них не повлияет на значение другой (см. пример 1.5). Таким образом, переменная, присвоенная по значению, и оригинальная переменная будут указывать на разные области памяти и являться независимыми друг от друга.

<?php	
$c=5; 					//Инициализировали переменную (присвоили значение)

$b=$c;   				//Присвоили переменной $b переменную $c, теперь $b==$c==5 

$b='new'; 				//Изменили значение переменной $b, при этом 
echo 'c='.$c.'<br>';	//значение переменной $c не изменилось ($c==5) 

$b=$c;  					//Опять присвоили переменной $b переменную $c, теперь $b==5 

$c='sos';  				//Изменили значение переменной $c, при этом 
echo 'b='.$b.'<br>';	//значение переменной $b не изменилось ($b==5) 
?>

Пример 1.5. Присвоение переменных по значению

Если же нужно, чтобы новая переменная ссылалась на оригинальную переменную, а не была независимой, следует присваивать переменную по ссылке. Для этого в процессе присвоения нужно просто добавлять знак амперсанда '&' перед оригинальной переменной (см. пример 1.6). В результате переменная, присвоенная по ссылке, и оригинальная переменная будут указывать на одну и ту же область памяти, а изменение значения одной из них сразу же отразится на значении другой.

<?php	
$c=5; 								//Инициализировали переменную (присвоили значение)

$b=&$c; 							 //Присвоили по ссылке переменной $b переменную $c, 
echo 'c='.$c.' b='.$b.'<br>';	//теперь $b==$c==5. 

$b='new'; 							//Изменили значение переменной $b, теперь 
echo 'c='.$c.' b='.$b.'<br>';	//$b=='new' и $c также равна 'new' 

$c=20;  								//Изменили значение переменной $c, теперь 
echo 'c='.$c.' b='.$b.'<br>';	//$c==20 и $b также изменилась ($b==20)
?>

Пример 1.6. Присвоение переменных по ссылке

В PHP имеется возможность использовать имена одних переменных в качестве значения других переменных (см. пример 1.7). В таких случаях говорят, что переменная используется в качестве динамического имени другой переменной.

<?php	
$apple=3; 		//Задали число яблок
$orange=7;		//Задали число апельсинов

$a='apple'; 	//Присвоили переменной в качестве значения 
					//строку с именем первой переменной
echo 'Количество фруктов: ', ${$a}, '.<br>'; 	//Выведет 3 

$a='orange'; 	//Присвоили переменной в качестве значения 
					//строку с именем второй переменной
echo "Количество фруктов: ${$a}."; 		//Выведет 7 вместо ${$a}

/* Во втором случае переменная указывается внутри строки,
взятой в двойные кавычки */
?>

Пример 1.7. Переменные переменных

Разрешается применять переменные внутри строк, взятых в двойные кавычки (см. примеры 1.7 и 1.8). При этом, для однозначной и недвумысленной интерполяции (замены имени переменной ее значением), как переменную, используемую в качестве имени другой переменной (переменная переменной), так и применяемую внутри строки, следует заключать в фигурные скобки. При этом переменные, расположенные внутри строк, взятых в одинарные кавычки, будут интерпретироваться как обычный текст даже в том случае, если они будут заключены в фигурные скобки.

<?php	
$a='apple';  			//Теперь $a=='apple' 
echo '$a'.'<br>'; 				//Выведет просто '$a' вместо строки 'apple', т.к. 
							//PHP видит переменные только внутри двойных кавычек 

echo "{$a}s".'<br>';			//Выведет 'apples' 

echo '{$a}s'.'<br>';  		//Выведет просто '{$a}s', т.к. кавычки одинарные 

echo "Это { $a}";  	//Выведет 'Это { apple}' вместо 'Это apple', 
							//т.к. пробела между '{' и '$' быть не должно  
?>

Пример 1.8. Интерполяция переменных в строках

После того, как переменная была создана, к ней можно обращаться по ее имени, не забывая про знак доллара '$' перед ним. Однако при этом нужно помнить, что в большинстве случаев переменная будет доступна только в той области видимости, в которой она была создана. Если она была создана в глобальной области видимости, т.е. вне определяемой пользователем функции в любом месте кода, то по умолчанию она будет видима только в глобальной области видимости и недоступна внутри функций (см. пример 1.9). И наоборот, если она была создана в локальной области видимости, т.е. внутри определяемой пользователем функции, то по умолчанию она будет видима только в данной локальной области видимости и недоступна вне этой функции, включая другие локальные области видимости.

<?php	
	function m_func(){ 	//Объявили новую пользовательскую функцию m_func(),            
		$sum='local_var'; //которая просто инициализирует локальную переменную 

		/* Переменные, которые создаются внутри фигурных скобок функции, 
		относятся к локальной области видимости */

		echo $sum.'<br>';  		//При вызове функции выведет 'local_var' 
	} 			     //После закрывающей скобки началась глобальная область видимости
	
	//echo $sum.'<br>';//Выведет ошибку, т.к. обращение к переменной идет из глобальной 
				     //области видимости, а здесь такой переменной не существует 
	m_func();     //Вызываем функцию, которая выведет 'local_var'  
				
	
	$sum_2='global_var'; 	   //Создали глобальную переменную

	/* Переменные, которые создаются вне фигурных скобок функции, т.е. в коде 
	верхнего уровня, относятся к глобальной области видимости */

	echo $sum_2.'<br>'; 			//Выведет 'global_var' 

	function m_func_2(){ 			//Объявили новую пользовательскую функцию m_func()_2,            
		echo $sum_2.'<br>'; 		//которая пытается вывести значение глобальной переменной 
	} 
	//m_func_2(); //Вызываем функцию и получаем ошибку, т.к. функция обращается 
					  //к глобальной переменной внутри себя, т.е. в локальной области
					  //видимости, где переменная не определена
?>

Пример 1.9. Локальные и глобальные переменные

Так как доступ к локальным переменным из глобальной области видимости запрещен, появляется возможность использовать одни и те же имена переменных в разных функциях, не опасаясь за то, что из-за этого могут возникнуть конфликты, поскольку в случае обращения к переменной из локальной области видимости интерпретатор будет использовать локальную переменную, определенную в данной локальной области видимости, а при обращения к переменной из глобальной области видимости интерпретатор будет использовать глобальную переменную (см. пример 1.10).

<?php	
	function m_func(){            
		$sum='local_var';  //Создали локальную переменную
		echo $sum.'<br>';  //При вызове функции выведет 'local_var' 
	} 	
	$sum='global_var'; 	 //Создали глобальную переменную
	
	echo $sum.'<br>'; 	 //Выведет 'global_var'
	m_func(); 				 //Выведет 'local_var'  
?>

Пример 1.10. Использование локальных и глобальных переменных с одинаковыми именами

Если требуется получить доступ к глобальной переменной из локальной области видимости (изнутри тела функции), то следует использовать ключевое слово global, которое будет указывать интерпретатору, что следует использовать именно глобальную версию переменной (см. пример 1.11). Переменные указываются после ключевого слова через пробел и разделяются запятыми. При этом не существует ограничений на количество используемых функцией глобальных переменных.

<?php	
$sum_1='global_var_1'; 		//Создали первую глобальную переменную
$sum_2='global_var_2'; 		//Создали вторую глобальную переменную

function m_func(){  			//Создали пользовательскую функцию        
	$sum='local_var'; 		//Создали локальную переменную
	global $sum_1, $sum_2;  //Указали, что будут использоваться 
									//глобальные переменные внутри функции
	$sum_1=10;  				//Присвоили новое значение глобальной переменной
	echo $sum, ' ', $sum_1, ' ', $sum_2.'<br>';  
} 	

m_func(); 						//Выведет 'local_var 10 global_var_2'  
echo $sum_1, ' ', $sum_2.'<br>';  //Выведет '10 global_var_2', т.к. после вызова
							      //функции значение глобальной переменной было изменено
?>

Пример 1.11. Использование ключевого слова global

Следует отметить, что значения глобальных переменных после их инициализации остаются неизменными до тех пор, пока они не будут изменены или сами переменные не будут удалены. Что касается локальных переменных, то при каждом вызове функции, они инициализируются заново, а при выходе из функции автоматически уничтожаются. Поэтому, в случае необходимости сохранять значение локальной переменной между вызовами функции, следует объявить ее статической при помощи ключевого слова static (см. пример 1.12).

<?php	
function m_func() {               
static $sum=0;   		//Объявили статическую переменную и присвоили ей 0 
$sum = $sum+1;   		//Увеличили значение статической переменной на единицу
$sum_2=0;   	 		//Объявили локальную переменную и присвоили ей 0 
$sum_2 = $sum_2+1; 	//Увеличили значение локальной переменной на единицу
echo 'Значение статической переменной равно ', $sum, '<br>';
echo 'Значение локальной переменной равно ', $sum_2, '<br>';
} 
m_func(); 				//Выведет для обоих переменных 1. 
m_func(); 				// Выведет для локальной переменной опять 1, а для 
							//статической - 2. 

/* При вызове функции локальная переменная всегда будет 
инициализироваться заново, а статическая будет сохранять приобретенное 
при предыдущем вызове значение */
?>

Пример 1.12. Использование статических переменных

Когда переменная становится не нужна, ее можно удалить. Для этого используется функция unset(), которой в качестве аргументов нужно через запятую передать удаляемые переменные. При этом, если переменная, объявленная глобальной либо переданная функции по ссылке, удаляется внутри функции, то будет удалена только локальная переменная, а переменная вне функции удалена не будет. Переменная, объявленная статической, также будет удалена только в контексте дальнейшего выполнения функции, а при последующем вызове этой функции предыдущее значение переменной будет восстановлено (см. пример 1.13).

<?php	
$a=8;  					//Присвоили переменной число 8 
$b="city"; 				//Присвоили переменной строку "city"

function my_func(){  //Создаем пользовательскую функцию
	
	global $a; 			//Ссылаемся на глобальную переменную
	$a=20;				//Изменили значение глобальной переменной
	static $c=10; 		//Создали статическую переменную
	
	echo $a,' ',$c.'<br>';   //Выведет '20 10' при каждом(!) вызове функции
	
	unset($a,$c); 		//Удаляем локальные переменные, теперь до конца 
							//выполнения данного вызова функции их не существует
	
	echo $a,' ',$c.'<br>';   //При вызове функции интерпретатор выведет ошибку, т.к. 
							//такие переменные больше не существуют до конца вызова функции
}
my_func(); 				//Вызываем функцию
echo $a,' ',$b.'<br>';  	 //Выведет строку '20 city', т.к. глобальная переменная $a
							//была изменена во время вызова функции my_func(), но при 
							//этом удаление внутри функции на нее не повлияло

unset($a,$b); 			//Удалили глобальные переменные  
echo $a,' ',$b.'<br>';  	 //Интерпретатор выведет ошибку, т.к. такие 
							//переменные больше не существуют					   
?>

Пример 1.13. Удаление переменных

Контрольные вопросы и задания

  1. Как присвоить по ссылке одной переменной другую переменную? Чем отличаются переменные, присвоенные по значению, от переменных, присвоенных по ссылке?
  2. Что означает фраза 'переменная переменной'?
  3. Разрешается ли использование переменных внутри строк?
  4. Как получить доступ к глобальной переменной изнутри тела функции?
  5. Что такое статическая переменная?
  6. Как удалить переменную?

Словарь новых английских слов

brackets [ˈbrækəts] – скобки.
square [skwɛː] – квадрат, квадратный.
angle [ˈæŋɡl] – угол, угловой.
curly [ˈkəːli] – фигурный, изогнутый, волнистый.
round [raʊnd] – круглый.
preprocessor [ˌpriːˈprəʊsɛsə] – предпроцессор.
hypertext [ˈhaɪpərtekst] – гипертекст.
camel [ˈkam(ə)l] – верблюд.
case [keɪs] – регистр клавиатуры.
try [traɪ] – пытаться, попытка.
catch [kætʃ] – поймать, захват.
snake [sneɪk] – змея, извиваться.
if [ɪf] – если.
global [ˈɡloʊbl] – глобальный, всеобщий.
local [ˈləʊk(ə)l] – локальный, местный.
static [ˈstætɪk] – статический, неподвижный.
define [dɪˈfʌɪn] – определять.
constant [ˈkɑːnstənt] – константа, постоянная.
echo [ˈekoʊ] – вторить, повторять, эхо.
unset [ʌnˈsɛt] – сбросить, удалить (переменную).
Комментарии (0)
Петр Романовский
1. Приветствуются комментарии, которые содержат дополнения к материалу текущей страницы, а также ваши ответы на вопросы других пользователей.
2. Если вам что-то непонятно - спрашивайте, не забывая написать, что именно и с какого места.
Показаны все комментарии
Чтобы оставить свой комментарий, авторизуйтесь, пожалуйста!    
     
belarusweb.net © Петр Романовский, Минск, 2016-2017.
Связаться с автором
Наверх