Область видимости переменных 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Область видимости переменных



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

<? function get_sum () { $var = 5; // локальная переменная echo $var; } $var = 10; // глобальная переменная   get_sum (); // выводит 5 (локальная переменная) echo( "<br>$var" ); // выводит 10 (глобальная переменная)?>

Локальную переменную можно сделать глобальной, если перед ее именем указать ключевое слово global. Если внешняя переменная объявлена как global, то к ней возможен доступ из любой функции:

<?function get_sum () { global $var;    $var = 5; // изменяем глобальную переменную echo $var; } $var = 10; echo( "$var<br>" ); // выводит 10 get_sum (); // выводит 5 (глобальная переменная изменена)?>

Доступ к глобальным переменным можно получить также через ассоциативный массив $GLOBALS:

<? function get_sum () { $GLOBALS["var"] = 20; // изменяем глобальную переменную $var echo( $GLOBALS["var"] ); } $var = 10; echo( "$var<br>" ); // выводит 10 get_sum (); // выводит 20 (глобальная переменная изменена)?>

Массив $GLOBALS доступен в области видимости любой функции и содержит все глобальные перемене, которые используются в программе.

Время жизни переменной

Временем жизни переменной называется интервал выполнения программы, в течение которого она существует. Поскольку локальные переменные имеют своей областью видимости функцию, то время жизни локальной переменной определяется временем выполнения функции, в которой она объявлена. Это означает, что в разных функциях совершенно независимо друг от друга могут использоваться переменные с одинаковыми именами. Локальная переменная при каждом вызове функции инициализируется заново, поэтому функция-счетчик, в приведенном ниже примере всегда будет возвращать значение 1:

function counter () { $counter = 0; return ++$counter; }

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

function counter () { static $counter = 0; return ++$counter; }

Временем жизни статических переменных является время выполнения сценария. Т. е., если пользователь перезагружает страницу, что приводит к новому выполнению сценария, переменная $counter в этом случае инициализируется заново.

Что такое рекурсия

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

Рассмотрим классические примеры использования рекурсии - реализацию операции возведения в степень и вычисление факториала числа. Заметим, что эти примеры являются классическими только из-за их удобства для объяснения понятия рекурсии, однако они не дают выигрыша в программной реализации по сравнению с итерационным способом решения этих задач.

 

<? function degree ( $x,$y ) { if( $y ) { return $x * degree ( $x,$y - 1 ); } return 1; } echo( degree ( 2,4 )); // выводит 16?>

Этот пример основан на том, что xy эквивалентно x*x(y-1). В этом коде задача вычисления 24 разбивается на вычисление2*2³. Затем 2*2³ разбивается на 2*2² и так до тех пор, пока показатель не станет равным нулю.

Итерационный вариант этого примера выглядит так:

<? function degree ( $x,$y ) { for( $result = 1; $y > 0; --$y ) { $result *= $x; } return $result; } echo( degree ( 2,4 )); // выводит 16?>

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

<? function fact ( $x ) { if ( $x < 0 ) return 0; if ( $x == 0 ) return 1; return $x * fact ( $x - 1 ); } echo ( fact ( 3 )); // выводит 6?>

Для отрицательного аргумента функция возвращает нулевое значение, так как факториал отрицательного числа не существует по определению. Для нулевого параметра функция возвращает значение 1, поскольку 0! = 1. В иных случаях вызывается та же функция с уменьшенным на 1 значением параметра, после чего результат умножается на текущее значение параметра. Т. е. происходит вычисление произведения:

k * (k - 1) * (k - 2) *... * 3 * 2 * 1 * 1

Последовательность рекурсивных вызовов прерывается только при вызове fact(0), который и приводит к последнему значению 1 в произведении, так как последнее выражение, из которого вызывается функция, имеет вид 1 * fact(1 - 1).

Итерационно факториал можно вычислить так:

<? function fact ( $x ) { for ( $result = 1; $x > 1; --$x ) { $result *= $x; }   return $result; } echo ( fact ( 6 )); // выводит 720?>

 

Открытие файлов

Файл представляет собой последовательность байтов, хранящуюся на каком-либо физическом носителе информации. Каждый файл имеет абсолютный путь, по которому определяется его местонахождение. В качестве разделителя пути в Windows может использоваться как прямой (/), так и обратный (\) слеш. В других операционных системах используется только прямой слеш.

Открытие файлов в файловой системе сервера производится при помощи функции fopen:

int fopen(string filename, string mode [, int use_include_path ])

Первый аргумент filename - имя файла или абсолютный путь к нему. Если абсолютный путь не указывается, то файл должен находится в текущем каталоге.

Второй аргумент mode говорит о том, для каких действий открывается файл и может принимать следующие значения:

· r (Открыть файл только для чтения; после открытия указатель файла устанавливается в начало файла);

· r+ (Открыть файл для чтения и записи; после открытия указатель файла устанавливается в начало файла);

· w (Создать новый пустой файл только для записи; если файл с таким именем уже есть вся информация в нем уничтожается);

· w+ (Создать новый пустой файл для чтения записи; если файл с таким именем уже есть вся информация в нем уничтожается);

· a (Открыть файл для дозаписи; данные будут записываться в конец файла);

· a+ (Открыть файл для дозаписи и чтения данных; данные будут записываться в конец файла);

· b (Флаг, указывающий на работу (чтение и запись) с двоичным файлом; указывается только в Windows).

Третий необязательный аргумент use_include_path определяет должны ли искаться файлы в каталоге include_path. (Параметр include_path устанавливается в файле php.ini).

В случае удачного открытия файла, функция fopen возвращает дескриптор файла, в случае неудачи - false. Дескриптор файла представляет собой указатель на открытый файл, который используется операционной системой для поддержки операций с этим файлом. Возвращенный функцией дескриптор файла необходимо затем указывать во всех функциях, которые в дальнейшем будут работать с этим файлом.

Код, приведенный ниже, открывает файл C:/WWW/HTML/file.txt для чтения:

<? $file = fopen ( "c:/www/html/file.txt","r" ); if(!file ) { echo( "Ошибка открытия файла" ); }?>

Открытие двоичного файла, к примеру, рисунка происходит таким же образом, только с флагом b:

<? $file = fopen ( "c:/www/html/river.jpg","rb" ); if(!file ) { echo( "Ошибка открытия файла" ); }?>

 

Отображение файлов

Содержимое открытого файла можно отобразить в браузере с помощью функции fpassthru:

int fpassthru (int file )

Аргумент file представляет собой дескриптор файла.

<? $file = fopen ( "c:/www/html/pavlovo.jpg","rb" ); if(!file ) { echo( "Ошибка открытия файла" ); } else { fpassthru ( $file ); }?>

Для текстовых файлов существует еще одна функция отображения readfile:

readfile (string filename )

Обращаем ваше внимание на то, что в качестве аргумента эта функция принимает имя файла, а не его дескриптор:

<? readfile ( "file.txt" );?>

Закрытие файлов

После того, как вы закончите работу с файлом его необходимо закрыть. Закрытие файлов осуществляется с помощью функции fclose:

int fclose (int file )

Аргумент file представляет собой дескриптор файла, который необходимо закрыть.



Поделиться:


Последнее изменение этой страницы: 2020-11-28; просмотров: 95; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.189.2.122 (0.007 с.)