Сайт о телевидении

Сайт о телевидении

» » Переменные окружения. Переменные и функции. Использование примитивных типов

Переменные окружения. Переменные и функции. Использование примитивных типов

Когда браузер запрашивает от веб-сервера документ, он также пересылает на сервер техническую информацию об определённых параметрах браузера и операционной системы. Веб-сервер в свою очередь одновременно с документом возвращает некоторые свои характеристики. Таким образом, браузер и веб-сервер обмениваются данными, которые называются переменные окружения. Эти переменные можно применять в своих целях и отображать их на веб-странице.

При использовании SSI общий синтаксис вывода определенной переменной окружения будет следующий.

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

Табл. 1. Список переменных окружения Переменная Описание
DOCUMENT_ROOT Путь к корневой папке сайта. Для локального веб-сервера значение может принимать вид z:/home/сайт/www, а в других случаях зависит от операционной системы сервера и используемого программного обеспечения.
GATEWAY_INTERFACE Версия CGI (Common Gateway Interface, общий шлюзовый интерфейс). Значение обычно равно CGI/1.1 .
HTTP_ACCEPT Типы файлов, которые способен принять браузер. В качестве значения возвращается список поддерживаемых MIME-типов разделенных между собой запятой, например: text/html, application/xhtml+xml .
HTTP_CONNECTION Тип соединения браузера с веб-сервером. Так, значение keep-alive означает, что браузер поддерживает постоянное соединение с сервером. При этом в течение одного сеанса соединения разрешено делать несколько запросов. Повторного соединения в таком случае уже не происходит.
HTTP_HOST Доменное имя сайта. Обычно различают имена с префиксом www (www..ru). Переменная вернёт тот адрес сайта, который указан в адресной строке браузера.
HTTP_REFERER Адрес страницы, с которой пользователь перешел на данный сайт, он еще называется реферер.
HTTP_USER_AGENT

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

Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2

говорит, что пользователь использует браузер Firefox 6.0.2 под операционной системой Windows 7.

QUERY_STRING Запрос, который указан в адресной строке после вопросительного знака (?). Обычно пишется в форме «переменная=значение», где переменные разделяются между собой амперсандом (&).?id=5&slv=34 будет возвращено значение id=5&slv=34 .
REMOTE_ADDR IP-адрес посетителя сайта.
REQUEST_METHOD Метод отправки данных на сервер. По умолчанию применяется метод GET.
REQUEST_URI Адрес запрашиваемого документа. Отсчёт ведётся от корня сайта, т.е..html вернется значение 1.html .
SERVER_ADDR IP-адрес компьютера, на котором размещается сайт.
SERVER_ADMIN Адрес электронной почты администратора сайта.
SERVER_NAME Имя сервера.
SERVER_PORT Порт, по которому ожидается получение данных.
SERVER_PROTOCOL Протокол для получения и отправки данных. Значение обычно равно HTTP/1.1 .
SERVER_SOFTWARE Программное обеспечение установленное на сервере. Для веб-сервера Apache возвращается номер версии (Apache/2.2.4 ), а также версия PHP (PHP/5.3.3 ).

В примере 1 показано использование переменных окружения для отображения на веб-странице требуемой информации.

Пример 1. Вывод значения переменной DOCUMENT_ROOT

SSI

Путь к корневой папке сайта:

В результате выполнения примера будет выведена следующая строка: Путь к корневой папке сайта: /home/сайт/www .

Значения переменных окружения можно посмотреть с помощью программы на PHP, используя функцию phpinfo(), как показано в примере 2.

Пример 2. Использование phpinfo()

В результате выполнения программы будет выведена таблица с разными параметрами, в том числе и переменными окружения в разделе «Apache Environment» (рис. 1).

Рис. 1. Apache Environment

Также можно написать программу на PHP, которая будет выводить все переменные окружения в виде таблицы (пример 3)..

Пример 3. Вывод переменных окружения

Вы определяете переменную, используя ключевое слово var , также вы можете опционально в этом же выражении присвоить переменной значение. Переменные, которые определены в функции, называются локальными переменными , они доступны только внутри функции. Переменные, которые определены напрямую в элементе script , называются глобальными переменными , они доступны всем, включая другие скрипты. В показано использование локальных и глобальных переменных.

Листинг 5-6: Использование локальных и глобальных переменных Example var myGlobalVar = "apples"; function myFunc(name) { var myLocalVar = "sunny"; return ("Hello " + name + ". Today is " + myLocalVar + "."); }; document.writeln(myFunc("Adam")); document.writeln("I like " + myGlobalVar );

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

Hello Adam. Today is sunny. I like apples

Использование примитивных типов

В JavaScript представлено мало примитивных типов. Это string , number и boolean . Кажется, что список очень короткий, но JavaScript очень гибко управляется с этими тремя типами.

Работа со строками

Значения для типа string определяются с использованием одинарных или двойных кавычек, как показано в .

Листинг 5-7: Определение строковых переменных Example var firstString = "This is a string"; var secondString = "And so is this";

Знаки кавычек, которые вы используете, должны совпадать. Например, вы не можете начать строку с одинарной кавычки, а закончить двойными.

Работа с булевскими переменными

Булев тип (boolean) имеет два значения: true и false . В показано, как используются оба значения. Булев тип наиболее полезен при работе с условными операторами, которые я опишу далее в этой главе.

Листинг 5-8: Определение булевских значений Example var firstBool = true; var secondBool = false; Работа с числами

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

Листинг 5-9: Определение числовых значений Example var daysInWeek = 7; var pi = 3.14; var hexValue = 0xFFFF;

Вам не нужно указывать, какой вид числа вы используете. Вы просто присваиваете нужное значение, и JavaScript его обрабатывает соответствующим образом. В листинге я определил значение для целого числа, для числа с плавающей точкой и указал шестнадцатеричное значение при помощи приставки 0x .

Создание объектов

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

Листинг 5-10: Создание объекта Example var myData = new Object(); myData.name = "Adam"; myData.weather = "sunny";

Я создал объект new Object() , а результат (только что созданный объект) я назначил переменной myData . Как только объект создался, я могу назначить ему свойства, просто указав значение, например, так:

myData.name = "Adam";

До этого выражения у моего объекта не было свойства name . После того как выражение было выполнено, возникло свойство и ему было присвоено значение Adam . Прочитать значение свойства можно, если объединить имя переменной и имя свойства точкой, вот так:

document.writeln("Hello " + myData.name + ". ");

Использование литералов объекта

Можно определить объект и его свойства за один шаг, используя формат литерала объекта. В показано, как это делается.

Листинг 15-11: Использование формата литерала объекта Example var myData = { name: "Adam", weather: "sunny" }; document.writeln("Hello " + myData.name + ". "); document.writeln("Today is " + myData.weather + ".");

Каждое свойство, которое вы хотите определить, отделяется от своего значения при помощи двоеточия (:), а сами свойства разделяются запятой (,).

Использование функций как методов

Так же, как вы добавляете к объекту свойства, вы можете добавить к объекту функции. Функция, которая принадлежит объекту, известна как метод . Это одна из возможностей JavaScript, которые я люблю больше всего. Я не знаю, почему, но я считаю этот способ элегантным и бесконечно приятным. В показано, как можно добавлять методы таким вот способом.

Листинг 15-12: Добавление метода объекту Example var myData = { name: "Adam", weather: "sunny", printMessages: function () { document.writeln("Hello " + this.name + ". "); document.writeln("Today is " + this.weather + "."); } }; myData.printMessages();

В этом примере я использовал функцию, чтобы создать метод printMessages . Обратите внимание, что ссылаясь на свойство, определенное в объекте, я использовал ключевое слово this . Когда функция используется в качестве метода, функция передается объекту, в котором был вызван метод, в качестве аргумента при помощи специальной переменной this . Результат работы кода таков:

Hello Adam. Today is sunny.

Совет

JavaScript может гораздо больше чего предложить, когда дело доходит до создания и управления объектами, но вам не нужны эти функции для работы с HTML5. Обратите внимание на книги, которые я рекомендовал в начале этой главы, если вы хотите углубиться в изучение этого языка.

Работа с объектами

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

Чтение и изменение значений свойств

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

Листинг 5-13: Чтение и изменение свойств объекта Example myData.name = "Joe"; myData["weather"] = "raining"; document.writeln("Hello " + myData.name + "."); document.writeln("It is " + myData["weather"] );

Первый способ таков, что его знают большинство программистов, и я его использовал в предыдущих примерах. Вы объединяете имя объекта и имя свойства, используя точку (точечная нотация), вот так:

myData.name = "Joe";

Второй способ – это "массивная" нотация (как при обращении к индексу массива), которая выглядит следующим образом:

myData["weather"] = "raining";

В данном случае имя свойства вы заключаете в квадратные скобки ([ и ]). Это может быть очень удобным способом доступа к свойству, потому что вы можете обратиться к нужному свойству, используя переменную:

var myData = { name: "Adam", weather: "sunny", }; var propName = "weather"; myData[propName ] = "raining";

Это основа для перечисления свойств объекта, о чем я сейчас расскажу.

Перечисление свойств объекта

Вы перечисляете свойства объекта, используя оператор for...in . В показано, как можно использовать этот оператор.

Листинг 5-14: Перечисление свойств объекта Example var myData = { name: "Adam", weather: "sunny", printMessages: function () { document.writeln("Hello " + this.name + ". "); document.writeln("Today is " + this.weather + "."); } }; for (var prop in myData) { document.writeln("Name: " + prop + " Value: " + myData); }

В цикле for...in в блоке кода выполняются выражения для каждого свойства объекта myData . Переменной prop назначено имя свойства, обрабатываемого при каждой итерации. Я использовал "массивную" нотацию, чтобы получить значение свойства объекта. Результат работы кода из листинга таков (я отформатировал результаты, чтобы их было проще читать):

Name: name Value: Adam Name: weather Value: sunny Name: printMessages Value: function () { document.writeln("Hello " + this.name + ". "); document.writeln("Today is " + this.weather + "."); }

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

Добавление и удаление свойств и методов

Даже если вы использовали литералы объекта, вы все равно можете определить для объекта новые свойства. Пример представлен в .

Листинг 5-15: Добавление нового свойства объекту Example var myData = { name: "Adam", weather: "sunny", }; myData.dayOfWeek = "Monday";

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

Листинг 5-16: Добавление нового метода в объект Example var myData = { name: "Adam", weather: "sunny", }; document.writeln("Hello"); };

Вы можете удалить свойство или метод из объекта, используя ключевое слово delete , как показано в .

Листинг 5-17: Удаление свойства из объекта Example var myData = { name: "Adam", weather: "sunny", }; myData.sayHello = function() { document.writeln("Hello"); }; delete myData.name; delete myData["weather"]; delete myData.sayHello; Как определить, есть ли у объекта свойство

Вы можете определить, есть ли у объекта свойство, используя выражение in , как показано в .

Листинг 5-18: Проверка на то, есть ли у объекта свойство Example var myData = { name: "Adam", weather: "sunny", }; var hasName = "name" in myData; var hasDate = "date" in myData; document.writeln("HasName: " + hasName); document.writeln("HasDate: " + hasDate);

В этом примере я сделал проверку для свойства, которое существует, и для свойства, которого нет. Значение переменной hasName будет true , значение свойства hasDate – false .

Переменные и функции

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

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

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

Впрочем, функции создают новую область видимости. Переменные функ ции аргументы функции и любые переменные, определенные внутри функ ции, существуют только в этой функции и недоступны извне. Другими слова ми, это локальные переменные с локальной областью действия. Подобным образом к внешней переменной можно обратиться, только передав ее в функ цию как аргумент или же с помощью инструкции global. Последняя приблизи тельно означает: «Я хочу, чтобы эта переменная в функции была такой же, как и вне функции». Другими словами, глобальная инструкция превращает локальную переменную с областью видимости внутри функции в глобальную переменную с областью действия в пределах всей программы. Любые изменения глобаль ной переменной в функции автоматически передаются в переменную с тем же именем, когда она используется вне функции (после вызова функции, конеч но), без помощи команды return.
Синтаксис инструкции global следующий:

Function FunctionName (SArgument) {
global $Variable;
statement(s);

Рассмотрим подробнее, что же дает нам инструкция глобализации. Обыч ная переменная, даже если ее имя внутри функции полностью совпадает с та ким же именем в основной части программы, представляет собой совершенно другую структуру (возможно, с другим значением, нежели переменная вне функ ции). Пусть строка вызова функции выглядит как FunctionName ($Valuel) , а функция определена как FunctionName ($Argumentl). В момент обращения к функции РНР устанавливает значение $Argumentl равным значению $Valuel, и далее первое используется в теле функции. Если вы измените значение $Argumentl внутри функции, это никак не отразится на значении $Valuel. Если бы имена переменных случайно совпали, это бы ничего не изменило: они все равно являются двумя разными переменными. Область действия одной внут ри функции, другой вне функции. Поэтому, чтобы избежать путаницы, при написании функций мы предусмотрительно использовали различные имена пе ременных в строке определения функции и в строке ее вызова.

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

  • Откройте файл numbers.php в текстовом редакторе (листинг 9.6).
  • Уберите аргументы $Price и $TaxRate из функции CalculateTotal, что бы строка 2 выглядела так:
  • function CalculateTotal ($HowMany, $SavingsT {

    Переменные $Price и $TaxRate будут введены в функцию как $Cost и $Тах с помощью инструкции global, поэтому нет необходимости использовать их как аргументы.

  • Добавьте две глобальные инструкции.
  • global $Cost;
    global $Tax;

    Они «Прикажут» функции использовать переменные $Cost и $Тах, которые уже существуют вне ее.

  • Отредактируйте оставшуюся часть функции, заменив переменную $Price на $Cost, $TaxRate на $Тах, a $TheCost на $TotalCost.
  • $Тах++; // $Тах составляет 1.06. *
    $TotalCost ~ ($Cost * $HowMany);
    if (($TotalCost < 50) AND ($Savings)) {
    print ("Your $$Savings will not apply because
    -the total value of the sale is under !\n

    ");
    } if ($TotalCost >= 50) {
    $TotalCost = $TotalCost $Savings;
    }.
    $TotalCost = $TotalCost * $Tax;
    return $TotalCost;

    Так как теперь функцией используются разные имена переменных, необхо димо соответствующим образом изменить вычисления. Чтобы лучше понять область действия переменной, мы поменяли также переменную $TheCost на $TotalCost. Запомните, что $TotalCost в функции это совсем не та перемен ная, как переменная с тем же именем, но находящаяся вне функции

  • Ниже в сценарии, после строки $Тах = 0.06; (строка 29), распечатайте текущее значение переменной. Оно будет меняться в ходе дальнейшего выполнения сценария.
  • print ("The tax value is currently $$Tax .\n

    ");

    Для показа того, что инструкция global вводит переменную в функцию и что любые реализованные в функции изменения применяются глобально, распечатаем значение $Тах до и после вызова функции.

  • Измените строку вызова функции CalculateTotal () , чтобы переменные
  • $Тах и $Cost больше не передавались как аргументы.
    $TotalCost = CalculateTotal ($Quantity, $Discount);

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

  • Еще раз распечатайте значение переменной $Тах.
  • print ("After calling the function, the tax value
    is now $$Tax .\n

    ");

    Если бы не было инструкции global, то значения, распечатанные здесь и выше, были бы одинаковыми. Но, поскольку глобальная переменная $Тах была модифицирована в функции, распечатанные значения будут разными.

  • Сохраните сценарий (листинг 9.7), загрузите его на сервер и протестируй те в браузере (рис. 9.5). Не забудьте отправить в сценарий значение коли чества (и значение скидки, если захотите), добавив его к адресу URL или через HTMLформу.
  • Листинг 9.7 т Так как функции CalculateTotal требуются значения пере менных $Cost и $Тах, они легко могут быть включены с помощью инструкции global. Помните, переменные больше нельзя передавать как аргументы это может запутать программиста и вызвать определенные ошибки в работе при ложения.

    1
    22
    23
    24 Calculation Functions
    25
    26
    27