Приступим к обсуждению первого вопроса.
Итак, по области видимости все переменные можно структурировать, как локальные и глобальные.
Локальные переменные – это переменные, доступ к которым может быть осуществлен только в каком-то конкретном месте. Например, все переменные, которые объявлены внутри функции – локальные. Это значит, что обратиться к ним можно только внутри этой самой функции. Чтобы убедиться в этом «прощупайте», как работает следующий код:
Здесь мы создали небольшую функцию, задача которой просто объявить переменную $a со значением “Привет!», и вывести эту переменную на экран. Далее после объявленной функции мы вызываем ее, что приводит к тому, что на экран выводится значение «Привет!». Выведет ли это значение последняя строчка кода еще раз? Нет! Потому что любая переменная, объявленная внутри функции – локальна, и не видна, нигде, кроме как внутри блока функции.
Попробуйте выполнить теперь следующий код:
Он выводит на экран следующую строку: «Привет! Пока!». Как видим из-за локальности объявленных внутри функции переменных, мы можем не переживать по поводу уникальности имени этих переменных. Даже если в коде уже присутствуют переменные с тем же именем, ничто не мешает нам объявить их и внутри функции. Дело в том, что при объявлении переменной в функции, в оперативной памяти выделяется отдельная область для этих переменных, которая никоим образом не пересекается с основной областью, где хранятся все остальные данные.
Это свойство очень облегчает жизнь тех программистов, которые используют одни и те же функции в разных программах. Им не нужно каждый раз переименовывать переменные внутри вставляемой из «чужого» кода функции для придания им уникальности. Достаточно просто скопировать и вставить функцию в любой код. Она будет работать прекрасно!
Еще одна особенность работы с локальными переменными. Они сохраняют свое значение только во время работы самой функции. При следующем обращение к этой же функции, переменные перезаписываются заново. Чтобы лучше понять, как это работает, давайте попробуем запустить следующий код:
Суть работы объявленной функции заключается в том, чтобы объявить переменную $a и присвоить ей значение 10. Далее функция увеличивает значение $a на единицу, и в следующей строке выводит ее на экран. Значит, на экран должно быть выведено число 11. Далее в коде мы дважды обращаемся к объявленной функции, и получаем в итоге два числа 11. Если бы локальная переменная сохраняла свое значение на протяжении всего кода программы, то мы бы получили значения: 11 и 12.
Итак, срок жизни локальной переменной, объявленной внутри функции – это время выполнения самой функции. После того, как интерпретатор переходит к выполнению следующего за функцией кода, он стирает из памяти все объявленные в ней переменные.
Однако при необходимости мы можем это изменить. Мы можем заставить «помнить» уже инициализированные переменные, путем использования ключевого слова static. Это слово говорит интерпретатору о том, что инициализировать объявленную в функции переменную нужно только один раз. При каждом последующем обращении к функции, переменная будет использована с тем значением, которая она имела при предыдущем выполнении кода функции. Это может звучать немного запутанно, но при просмотре результатов работы следующего простого кода все становится на свои места:
Теперь этот код выведет числа 11 и 12. Это произошло потому, что интерпретатор «знает», что переменная $a уже объявлена, и пропускает строку с ключевым словом static. Таким образом, в тот момент, когда начал выполняться код $a++, $a была равна уже не 10, а 11 вследствие выполнения функции в предыдущий раз. Если теперь в любом месте кода повторно вызывать эту функцию, то переменная $a всегда будет увеличена на единицу.
Что же такое глобальные переменные? Это переменные, которые помещены в системную переменную $_GLOBALS, и доступ к которым возможен из любого участка кода. Все переменные, которые объявляются вне функции – глобальные. К ним можно обратиться из любого участка кода просто по имени.
У глобальных переменных тоже есть одна особенность, связанная с использованием функций. Дело в том, что, как мы уже говорили раньше, для работы с функцией выделяется специальная область памяти, доступ к которой и осуществляется при работе блока кода внутри функции. Это значит, что по умолчанию, функция не обращается к основной области памяти, выделенной для всего кода, а значит, она не видит ни одной переменной, объявленной вне самой себя.
Для того, чтобы заставить функцию видеть нужные нам переменные, можно использовать обращение к элементу массива $GLOBALS. Либо перед объявлением переменной вставить ключевое слово global. Однако лучше не использовать эти возможности, и минимизировать область видимости переменных. Это сделает работу с кодом гибче. Проще будет вносить в него изменения. Если вы хотите, чтобы функция "видела» объявленные вне ее некоторые переменные, лучше всего передавать их в качестве параметров функции (вспомните, для чего мы после названия функции пишем скобочки)
В конце этого урока хотелось поделиться с вами приятной информацией. Когда вам необходимо добавить в свой код тот или иной функционал, и вы собираетесь разработать для этого свою функцию, помните, что большинство велосипедов уже изобретено. И никто не мешает вам их использовать повторно. Например, сам язык PHP уже содержит в себе огромное множество всевозможных функций. И для работы с ними, вам даже не придется вставлять их код (он уже и так прописан в ядре PHP). Вам нужно просто найти название той или иной функции, и вставить его в код своей программы.
Помимо этого, вы можете использовать поисковые системы для поиска функций, разработанных другими программистами для решения ваших проблем. В PHP все сделано для того, чтобы можно было легко вставлять «чужеродный» код функций и не испытывать при том никаких проблем с работоспособностью программы!
Все статьи этой серии:
- Вступление. Необходимый инструментарий. Первый скрипт
- Базовый синтаксист. Оператор echo
- Переменная. Константы
- Типы данных
- Операторы. Операции
- Ветвления
- Функции
- Область видимости переменных и время их жизни
- Циклы
- Массивы
- Предопределенные массивы. Функции для работы с массивами
- HTTP-запросы
- Формы. Работа с HTML-кодом
- Формы. Обработка средствами PHP
- Базы данных. SQL-запросы
- Базы данных. Работа с SQL средствами PHP
- Защита от SQL-инъекций
- Продолжение следует
Сообщение отредактировал GoodX: 04 Сентябрь 2012 - 02:34