Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИТ_Курсач_Указания.doc
Скачиваний:
1
Добавлен:
15.07.2019
Размер:
1.75 Mб
Скачать

Строковый тип данных

В информационном обмене между клиентом и сервером важную роль играют строки. В языке строка реализуется как массив байтов (array of bytes), размер буфера для которого определяется целочисленным значением. Строки можно объединить при помощи оператора точка « . ». Знак «+» для этой цели не используется.

В PHP литералы строкового типа специфицируются различными путями:

  • single quoted – одинарные кавычки;

  • double quoted - двойные кавыче;

  • heredoc syntax – heredoc синтаксис;

  • nowdoc syntax (начиная с PHP 5.3.0)- nowdoc синтаксис;

С различным поведением переменных внутри одинарных и двойных кавычек мы уже сталкивались. Отличие double-quoted и heredoc синтаксисов заключается в том, что переменные и escape – последовательности для специальных символов не раскрываются, если заключены в одинарные кавычки. В одинарных кавычках символ одиночной кавычки можно ввести как (\’), а символ обратного слэша (backslash) – как (\\). Остальные escape – последовательности (например, \r или \n,) будут выведены как литералы.

Heredoc синтаксис

Поддерживается начиная с PHP 4. Согласно этому синтаксису начало строки обозначается симолами <<<, за которым следует идентификатор за которым, в свою очередь, должен идти символ перевода строки (newline). После этого может следовать одна или несколько строк.

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

$str = <<<EOD Example of string spanning multiple lines using heredoc syntax. EOD;

Свойства строки, заданной описанным образом, соответствуют свойствам строки, заключённой в двойные кавычки. В указанном примере вместо идентификатора «EOD» можно было использовать любой другой правильный идентификатор. Начиная с PHP 5.3.0, открывающий Heredoc идентификатор может быть заключён в двойные кавычки.

Nowdoc синтаксис

Строки полученные при помощи nowdoc синтаксиса эквивалентны строкам, заключённым в одинарные кавычки, а полученные при помощи heredoc синтаксиса – заключённым в двойные кавычки (are to double-quoted strings). Nowdoc специфицирована аналогично heredoc, но внутри строк, созданных в соответствии с nowdoc не производится парсинг. Кострукция идеальна для встраивания PHP - кода (embedding PHP code) или другого рода длинных блоков текста, внутри которых не требуется расшифровывать escap – последовательности (without the need for escaping). Блок текста в соответствии с nowdoc определяется идентично тому, как описано для heredoc, за исключением того, что открывающий идентификатор заключается в одиночные кавычки:

echo <<<'EOT' My name is "$name". I am printing some $foo->foo. Now, I am printing some {$foo->bar[1]}. This should not print a capital 'A': \x41 EOT;

В соответствии с описанием nowdoc, клиент прочитает следующий текст:

My name is "$name". I am printing some $foo->foo.

Now, I am printing some {$foo->bar[1]}.

This should not print a capital 'A': \x41

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

Массивы в PHP

Синтаксис массивов несколько отличается от используемого в JavaScript. В руководстве синтаксис описан следующим образом:

array( key => value, key => value, )

// key may only be an integer or string

// value may be any value of any type

В соответствии с описанием массив представляет собой таблицу, состоящую из двух столбцов, в первом из которых содержатся значения ключей. Ключ может быть строкового или целочисленного типа. Если при инициализации массива упущен индекс, он генерируется автоматически, начиная со значения ноль. Если элементами одномерного массива являются массивы, то таким образом описывается двумерный массив. В соответствии с синтаксисом, мвссив инициализируется объявлением необходимых пар значений "index => values". Обратите внимание на то, что пары значений разделяются запятыми, а для разделения ключа от значения применяется специфический символ «=>». В руководстве приводится следующие примеры объявления массива:

$fruits = array (     "fruits"  => array("a" => "orange", "b" => "banana", "c" => "apple"),     "numbers" => array(1, 2, 3, 4, 5, 6),     "holes"   => array("first", 5 => "second", "third")

); ?>

<?php $array = array(1, 1, 1, 1,  1, 8 => 1,  4 => 1, 19, 3 => 13); print_r($array); ?>

Примечание: если при объявлении встречаются два одинаковых индекса, то последний перезаписывает первый.

В последнем примере использована функция «print_r», которая распечатывает переменную в виде, удобном для восприятии человеком (human-readable information):

mixed print_r ( mixed $expression [, bool $return = false ] )

Сказанное хорошо иллюстрирует приведённый в руководстве пример использования функции print_r:

<pre> <?php $a = array ('a' => 'apple', 'b' => 'banana', 'c' => array ('x', 'y', 'z')); print_r ($a); ?> </pre>

Результат работы скрипта показан на рисунке 6. Обратите внимание на то, что данные выдаются в тегах <pre>.

С

Рис. 10. Результат работы функции print_r 

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

Объекты

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

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

<?php class test {     function test() {         ?>         <?php         print 'OK';     } } ?>

Отметим, что внутри функций класса разрешено использование блоков. Если необходимо, чтобы в момент создания объекта были автоматически проинициализированы некоторое переменные не константными (non-constant values) значениями, то необходимо создать функцию, имя которой совпадает с именем класса, которая и осуществляет запланированные действия:

<?php /* This is how it should be done. */ class Cart {     var $todays_date;     var $name;     var $owner;     var $items = array("VCR", "TV");     function Cart() {         $this->todays_date = date("Y-m-d");         $this->name = $GLOBALS['firstname'];         /* etc. . . */     }} ?>

Такие функции называются конструкторами. В руководстве сказано, что конструкоры (Constructors) являются функциями класса, автоматически исполняемыми при создании нового экземпляра класса при помощи оператора «new».

Если в скобках, в списке формальных параметров при вызове конструктора указать реальные значения переменных, то произойдёт их инициализация в соответствии с тем, как закодировано в конструкторе. Обратите внимание на то, что автоматическая инициализация переменных производится функцией Cart(), имя которой совпадает с именем класса. В приведённом примере используется ещё несколько не обсуждённых синтаксических конструкций.

Во-первых, отметим, что в распоряжение программиста имеется псевдо – переменная (pseudo-variable) $this , при помощи которой можно вызвать метод объекта изнутри контекста объекта. По сути $this является ссылкой на исполняемый объект (reference to the calling object).

Во-вторых, конструкция «->» здесь играет ту же роль, что и точка в других языках программирования и реализует доступ к членам класса.

В - третьих, следует обратить внимание на переменную $GLOBALS, которая является ассоциативным массивом (associative array) и содержит все ссылки на глобальные переменные. Имена переменных являются ключами массива.

<?php function test() {     $foo = "local variable";     echo '$foo in global scope: ' . $GLOBALS["foo"] . "\n";     echo '$foo in current scope: ' . $foo . "\n"; } $foo = "Example content"; test(); ?>

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

$foo in global scope: Example content

$foo in current scope: local variable

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

Начиная с PHP 5 >= 5.3.0 введено понятие «пространство имён». Пространство имён было задумано для решения двух проблем, с которыми могут неожиданно встретиться разработчики библиотек и приложений, когда создают такие повторно используемые элементы кода как классы или функции:

  • Возможность коллизии имён между создаваемым автором кодом и уже имеющимися именами классов/функций/констант используемого языка PHP или используемых библиотек сторонних разработчиков.

  • Возможность создания альяса или сокращённий экстра - длинных имён (Extra_Long_Names), задуманных для преодоления первой проблемы, повышения качества читаемости создаваемого кода.

Пространства имён (PHP Namespaces) обеспечивают путь группировки зависимых классов, интерфейсов, функций и констант. В языке имеется два пути получения доступа к элементам внутри текущего пространства имён: использование магической константы «__NAMESPACE__», начинающейся и заканчивающейся двумя знаками подчёркивания, и при помощи ключевого слова «namespace».

Значением, возвращаемым «__NAMESPACE__» является строка, содержащая имя текущего пространства имён. В глобальном, не использующем пространства имён коде, константа возвращает пустую строку.

Ключевое слово «namespace» может использоваться для развёртывания, уточнения запроса к элементу, текущего пространства имён или к подпространству имён. Ключевое слово «namespace» эквивалентно оператору self , используемому при работе с классами. Данные ниже примеры, взятые из включённого в инсталляцию руководства помогут понять назначение и порядок использования пространства имён.

Example #1 __NAMESPACE__ example, namespaced code

<?php namespace MyProject; echo '"', __NAMESPACE__, '"'; // outputs "MyProject" ?>

Example #2 __NAMESPACE__ example, global code

<?php echo '"', __NAMESPACE__, '"'; // outputs "" ?>

The __NAMESPACE__ constant is useful for dynamically constructing names, for instance:

Example #3 using __NAMESPACE__ for dynamic name construction

<?php namespace MyProject; function get($classname){     $a = __NAMESPACE__ . '\\' . $classname;     return new $a; } ?>

Example #4 the namespace operator, inside a namespace

<?php namespace MyProject; use blah\blah as mine; // see "Using namespaces: importing/aliasing" blah\mine(); // calls function MyProject\blah\mine() namespace\blah\mine(); // calls function MyProject\blah\mine() namespace\func(); // calls function MyProject\func() namespace\sub\func(); // calls function MyProject\sub\func() namespace\cname::method(); // calls static method "method" of class MyProject\cname $a = new namespace\sub\cname(); // instantiates object of class MyProject\sub\cname $b = namespace\CONSTANT; // assigns value of constant MyProject\CONSTANT to $b ?>

Example #5 the namespace operator, in global code

<?php namespace\func(); // calls function func() namespace\sub\func(); // calls function sub\func() namespace\cname::method(); // calls static method "method" of class cname $a = new namespace\sub\cname(); // instantiates object of class sub\cname $b = namespace\CONSTANT; // assigns value of constant CONSTANT to $b ?>

20