программирование, создание программ, учебник Delphi, учебник по программированию, бейсек, делфи, си, паскаль
 
 
 

Операторы

Операторы присваивания

Простейший оператор присваивания «=». Не путайте его с оператором сравнения «=». Присваивание осуществляется копированием значения из левой части выражения в правую. Возможны комбинации при присваивании:
$а = ($b = 4) + 5; // $а теперь равно 9. а $b равно 4.
Комбинированные операции (например, +=, &=, .=) позволяют сократить запись присваивания, объединяя ее с основной операцией, при этом переменная слева используется и как исходное значение, и как место сохранения результата.
$а = 3;
$а += 5: // $а = 8. эквивалентна:
$а = $а + 5; $b = "Hello ".
$b .- "There!"; // заносит в $b строку "Hello There!",
//эквивалентна $b = $b . "There!":
Поскольку присваивание осуществляется посредством копирования, иногда выгоднее использовать присваивание значения по ссылке: $var = &$othervar;. Присваивание по ссылке фактически меняет указатель в переменной назначения так, что теперь он указывает на место, в котором хранится значение назначаемой переменной, то есть обе переменные теперь ссылаются на одно и то же значение и изменение одной переменной влечет за собой непосредственное изменение другой.
Арифметические операторы


Пример

Название

Результат

$a + $b

Сложение

Сумма $а и $b

$a - $b

Вычитание

Разность между $а и $b

$a*$b

Умножение

Произведение $а и $b

$a/$b

Деление

Частное от деления $а на $b

$a % $b

Остаток

Остаток от целочисленного деления $а на $b

Оператор деления «/» возвращает целое значение (то есть выполняет целочисленное деление), если делимое и делитель — целые числа (строки конвертируются в целые числа). Иначе если одно из чисел дробное, то результат будет также-дробным.
Инкремент/Декремент
РНР использует синтаксис С в операторах пре- и постинкремента и декремента.


Пример

Название

Результат

++$а

Преинкремент

Увеличивает $а на единицу, а затем возвращает значение $а

$а++

Постинкремент

Возвращает $а, а затем увеличивает $а на единицу

-$а

Предекремент

Уменьшает $а на единицу, а затем возвращает значение $а

$а-

Постдекрсмент

Возвращает $а, а затем уменьшает $а на единицу

 

     
<?php
echo "<h3>Postincrement</h3>";
$a = 5:
echo "Должно равняться 5. "
. $a++ "<br>\n";
echo "Должно равняться 6: " .
$a . "<br>\n";
echo "<h3>Preincrement</h3>".
$a = 5:
echo "Должно равняться б: "
. ++$a . "<br>\n";
echo "Должно равняться 6: "
. $a . "<br>\n";
/
echo "<h3>Postdecrement</h3>":
a = 5.
echo "Должно равняться 5: " .
$a-- . "<br>\n"
echo "Должно равняться 4: " .
$a . "<br>\n".
echo "<h3>Predecrement</h3>":
$a = 5.
echo "Должно равняться 4: " .
--$a . "<br>\n"
echo "Должно равняться 4: "
. $a . "<br>\n": r
Бинарные операторы
Бинарные операторы изменяют значения отдельных битов в целочисленных переменных.


Пример

Название

Результат

$а & $b

Побитовое И

Побитовое «умножение» (1, если оба бита равны 1)

$а | $b

Побитовое ИЛИ

Побитовое «сложение» (0, если оба бита равны 0)

$а Л $b

Побитовое исключающее ИЛИ

«Различие» (1, если биты различные)

-$а

Инверсия

Меняет 1 на 0, а 0 на 1

$а « Sb

Побитовый сдвиг влево

Эквивалентен умножению на 2 $b раз

$а » $b

Побитовый сдвиг вправо

Эквивалентен делению на 2 $b раз

Схема действия побитовых операций:


Биты

Результат оператора

$а & $b

$а| $b

$ал $b

~$а

0

0

0

0

0

1

0

1

0

1

1

1

1

0

0

1

1

0

1

1

1

1

0

0

Операторы сравнения


Пример

Название

Результат

$а -= $b

Равенство

True, если $а равно $b

$а === $b

Идентичность

True, если $а равно $b, и они одного типа

$а != $b

Неравенство

True, если $а не равно $b

Sa !== $b

Неидентичность

True, если $а не равно $b, или они разного типа

$a<$b

Меньше чем

True, если $а меньше чем $b

$a>$b

Больше чем

True, если $а больше чем $b

$a <= $b

Меньше или равно

True, если $а меньше или равно $b

$a >= $b

Больше или равно

True, если $а больше или равно $b

Другой условный оператор «? :» (тернарный), с синтаксисом:
((exprl) ? (ехрг2) : (ехргЗ))
действует так: это выражение имеет значение, равное ехрг2, если exprl равняется TRUE, в противном случае (если exprl = FALSE) оно равняется ехргЗ.
Логические операторы


Пример

Название

Результат

$а and $b

Логическое И

True, если $а И $b равны TRUE

$а or $b

Логическое ИЛИ

True, если $а ИЛИ $b равно TRUE

$а xor $b

Логическое исключающее ИЛИ

True, если $а и $b имеют разные логические значения

!$а

НЕ

Логическая инверсия

$а && $b

Логическое И

Аналогия «and»

$а || $b

Логическое ИЛИ

Аналогия «or»

Причина наличия двух аналогичных вариантов для операторов and и or — их различный приоритет (см. «Приоритет операторов»).
 
Конкатенация — слияние строк
Имеется два строковых оператора: конкатенация «.», объединяющая строки, и конкатенация с присваиванием «.=», которая позволяет сократить запись $А = $А . $Х; до $А .= $Х;.
$a = 'Hello ';
$b = $a "World!" // теперь $b содержит "Hello World!"
Приоритет операторов
Приоритет операторов определяет порядок вычисления значений выражений. Например, выражение 1+5*3 равно 16, а не 18, потому что умножение имеет более высокий приоритет и вычисляется до сложения. Скобки изменяют приоритет операторов, например:
(1+5)* 3 == 18


Ассоциативность

Операторы (в порядке уменьшения приоритета)

левая

 

левая

or

левая

XOr

левая

and

правая

print

левая

= += .= *= /=ж = %= &-, |=&_ __ <<= >> =

левая

V ;

левая

II

левая

&&

левая

!

левая

&

левая

&

не имеет

== != === i==

не имеет

<<->>=

левая

« »

левая

+-.

Ассоциативность

Операторы (в порядке уменьшения приоритета)

левая

* / 0/
/ %

(Ыправая

!-++.- (jnt) (double) (string) (array) (object) @

правая

F

не имеет

new

 
Операторы контроля ошибок
PHP поддерживает один оператор контроля ошибок — «0». Когда он предшествует выражению РНР, любое сообщение об ошибке, которое возникает при выполнении этого выражения, игнорируется. Если параметр track_errors разрешен, всякое сообщение об ошибке сохраняется в глобальной переменной $php_errormsg. Эта переменная перезаписывается каждый раз при возникновении новой ошибки.
<?php
/* Умышленная ошибка в SQL (лишняя кавычка): */
$res = @mysql_query ("select name, code from 'namelist") or
die ("Query failed er-or was '$php_errormsg'"): ?>
См. также функцию error_reporting().
Будьте внимательны: в настоящее время префиксный оператор контроля ошибок «@» блокирует даже сообщение о критических ошибках, прерывающих исполнение сценария. Поэтому при таком варианте выполнение сценария может быть прервано, но сообщение об ошибке выведено не будет.
Оператор запуска внешней программы
В РНР есть оператор «обратная галочка» (backticks): (" ') для запуска внешней программы. Запомните, это не одинарная кавычка! РНР попытается запустить программу (или исполняемый сценарий), как если бы она запускалась из командной оболочки. То, что выдается при этом запуске на консоль вывода, возвращается и может быть сохранено в переменной (и использовано для вывода). Заметьте, сам запуск ничего не выводит, если он завершается успешно.
// выдает список файлов текущего каталога
Soutput = "Is -аГ: // в сиаемах Unix
Soutput = 'dir'; // в системах Windows
echo "<pre>$output</pre>". // распечатать результат
запуска команды
См. также функции: system(), passthru(), exec(), popen() и escape-shel Icmd().
If - Управляющие структуры
Любой PHP-сценарий состоит из последовательности команд. Это могут быть присваивания, вызовы функций, циклы, условные структуры и даже пустые команды, которые ничего не делают «:>>. Команды обычно завершаются точкой с запятой и могут быть сгруппированы с помощью фигурных скобок (как в С}. Группа команд в фигурных скобках сама является командой (только без знака «;» в конце).
if
Одна из основных условных конструкций — if, она позволяет исполнить фрагмент кода при определенном условии. Ее синтаксис сходен с синтаксисом в С:
if (условное_выражение) команда;
Как было описано выше, условное выражение проверяется на соответствие значению «истина». Если оно равно TRUE, PHP выполняет следующую команду, иначе — игнорирует ее.
if ($а > $b)
print "a is bigger than b";
Часто нужно выполнить группу команд при определенном условии, тогда они группируются с помощью фигурных скобок.
if ($а > $b) {
print "a is bigger than b":
$b = $a; } Условные структуры могут быть
вложенными.
 else
Иногда требуется, чтобы при одном условии выполнялось одно действие, а в противном случае — другое; для этого используется ключевое слово else, расширяющее возможности if.
if ($a > $b) {
print "а больше чем b"; }
else { // ($а <*• $b)
"N print "а не больше чем b":
Фрагмент else выполняется только в том случае, если условное вы-/ ражение в скобках после if имеет значение FALSE, и другие выражения elseif (если они существуют), также имеют значение FALSE (см. ниже).
elseif
Условная конструкция elseif, как видно из названия, — комбинация if и else. Подобно else, она требует, чтобы основное выражение if равнялось FALSE, но также требует, чтобы се собственное выражение равнялось TRUE.
if ($a > $t» {
print "а больше чем b"; }
elseif ($а == №) {
print "а равно b". } else {
piint "а меньше чем b";
Можно иметь несколько подблоков elseif в одном блоке if. Из нескольких блоков elseif исполняется первый, который равняется TRUE. В PHP elseif можно писать также как else if (двумя словами), и смысл при этом не теряется. Таким образом, elseif-блок исполняется, только если начальное выражение if и любое другое, предшествующее el self-выражение равняются FALSE, а текущее elseif — TRUE.
Альтернативный синтаксис управляющих структур
Для управляющих структур if, while, for, foreach, и switch PHP предоставляет альтернативный синтаксис записи. Изменения выражаются в том, что после условного выражения в круглых скобках ставится двоеточие (:), затем следует фрагмент кода, подлежащий условному выполнению, завершающийся соответственно словами: endif;, endwhile;, endfor;, endforeach; или endswitch;. Использование фигурных скобок (для группировки условного фрагмента кода) при этом не требуется.
<?php if ($а == 5)- ?>
A is equal to 5 <?php endif; ?>
В примере html-блок «A is equal to 5» включается в генерируемую страницу при условии, что $а равно 5.
if ($a == 5):

print "a equals 5";
print "...".-elseif ($а == 6):
print "a equals 6";
print "!!!": else-
print "a is neither 5 nor 6": endif:
while
Цикл while — самый простой в PHP, он аналогичен своему тезке в С.
while (expr) statement:
Его смысл — повторять выполнение команды до тех пор, пока выражение истинно (TRUE). Проверка значения происходит каждый раз до выполнения команды. Если условное выражение не изменяется (в команде/блоке), то цикл будет исполняться бесконечно. Если условное выражение изначально ложно (FALSE), условный блок игнорируется и выполняться не будет. Блок условного кода может быть органичен фигурными скобками или двоеточием и словом endwhile;. Следующие два примера приводят к идентичному результату (они печатают числа от \ до 10):
/* пример 1 */
$1 =1:
while ($1 <= 10) {
print $i++: /* постинкремент */ )
/* пример 2 */ $1 = 1; while ($i <= 10):
print $1:
$i++: endwhile;
do..while
Циклы do. .while сходны с циклами while с тем отличием, что выражение проверяется на истинность не до исполнения блока, а после него. То есть гарантируется, что условный блок будет исполнен минимум один раз.
$1 = 0: do {
print $i; // напечатает «О» один раз
while ($i>0). // условие не выполняется
($i не больше 0) 
Следующий пример демонстрирует сложный (однократный) цикл и использование команды «break;» (ради тренировки попробуйте разобраться, что он делает).
do {
if ($i < 5) {
print "i is not big enough", break:
// досрочно завершить
цикл $i *= $factor.
if ($1 < Smimmumjimit) {
break: // досрочно завершить цикл
print "i is ok", * process i... } while(O);
// 0 блокирует дальнейшее выполнение цикла
for
Циклы for - наиболее сложные в РНР.
for (exprl; expr2; ехргЗ) statement:
Первое выражение exprl выполняется безусловно, один раз, до начала цикла (обычно это инициализация переменной-счетчика цикта) Перед началом каждой итерации цикла на истинность проверяется условие ехрг2, и если оно истинно (TRUE), то цикл выполняется i конце каждой итерации цикла выполняется ехргЗ (часто это инкремент счетчика цикла).
Каждое из выражений может быть пустым (то есть «;»). Если выражение ехрг2 - пустое, то цикл является бесконечным (РПР по умолчанию считает его равным TRUE) и его прерывание возможно только осредством использования внутри его блока команды break. Сравните примеры ниже, все они выводят числа от 1 до 10.
/* Пример 1 - Классический стиль*/
for ($1 = 1; $1 <= 10; $1++) {
print $1: } /* Пример 2 */
for ($1 = 1;;$!++) {
if ($i > 10) {
reak: }
print S1: } /* Пример З */
$i = 1;
for (:.) {
if ($1 > 10) { break. }
print $1.
$i++; }
/* Пример 4 - Модернистский стиль*/
for ($1 - 1. $1 <= 10; print $1. $i++) ;
Наиболее «красивы» первый и последний цикл. Но пустые выражения являются часто очень полезными.
РНР также поддерживает синтаксис ограничения блока цикла двоеточием:
for (exprl: expr2. ехргЗ) statement: :
endfor; См. также циклы foreach      ниже.
foreach
В РНР 4 включена инструкция foreach, позволяющая осуществлять поэлементно одинаковый набор действий для каждого элемента массива. Конструкция может иметь два варианта синтаксиса:
foreach($naccHB as $значение_элемента)
действия; foreach($MaccnB as $key =>
1значение_элемента)
действия:
Первая форма цикла перемещается по элементам массива, указанным как $массив. При каждой итерации значение текущего элемента присваивается переменной $значение_элемента, внутренний курсор массива (указатель на текущий элемент массива) смещается на следующий элемент и при следующей итерации мы получаем следующий элемент. Вторая форма делает то же самое, но мы можем дополнительно использовать индексное значение массива в переменной Skey (что полезно при работе с ассоциированными массивами). Если вторая форма цикла работает с одномерным, не ассоциированным массивом, то значения Skey и $значение_элемента будут одинаковы.
При первом прохождении цикла foreach курсор массива автоматически сбрасывается для указания на первый элемент массива; таким образом, не требуется вызывать функцию reset() перед запуском цикла foreach.
Также отметим, что цикл foreach оперирует с копией массива, а не с самим массивом, и поэтому курсор самого массива не изменяется, как в конструкции each.
Следующие примеры функционально идентичны:
// работа с численно индексированным
массивом $агг = array (1. 2. 3.        17): reset ($arr):
while (list(. Svalue) = each ($arr))
{ echo "Value: $value<br>\n"; }
foreach ($arr as $value) {
echo "Value $value<br>\n": }
// Следующие примеры также
функционально идентичны:
$агг = array ( "one" => 1.
"two" => 2.
"three" => 3.
"seventeen" -> 17 ).
reset ($arr).
while (list($key. Svalue) = each ($arr))
{ echo "Key: Skey; Value:
$value<br>\n"; }

foreach ($arr as $key => Svalue) {
echo "Индекс. Skey: Значение: $value<br>\n":
// print "\$a[$key] => Sa[$key] \n"
// Можно и так написать }
break
break прерывает выполнение циклов for, while, и структур switch, break имеет необязательный аргумент, определяющий, сколько вложенных циклов необходимо прервать.
 $arr = array ('one'. 'two', 'three', 'four', 'stop', 'five'):
// массив строк
while (list (. $val) = each (Sarr)) {
// эквивалент записи: foreach(Sarr
  as $val)
if ($val == 'stop') {// если элемент массива
break. /* здесь также
можно написать: break 1; */ }
echo "$val<br>\n"; }
'* Использование необязательного
аргумента. */ $i = 0:
while (++$i) { snitch ($i) { case 5.
echo "At 5<br>\n";
break 1. /* Выйти только из switch */ case 10:
echo "At 10; quittihg<br>\n":
break 2. /* Выйти из структуры switch и
цикла while. */ default: break: }}
continue
continue используется в циклических структурах для того, чтобы избежать выполнения оставшейся части цикла и перейти к следующей итерации, continue, подобно инструкции break; может име'гь числовой аргумент, показывающий, на сколько вложенных циклов должно распространяться се действие.
 while (list ($key. $value) = each ($arr)) {
if (!($key % 2}) { I! пропустить нечетный
элемент continue.
обработать_четный_элемент (Svalue); }
$1 = 0;
while ($i++ < 5) {
echo "цикл 1-го уровня <br>\n"; while (1)
{
echo " цикл 2-го уровня <br>\n"; while (1)
 { echo " цикл 3-го уровня <br>\n".
continue 3: }
echo "Эта строка никогда не
будет выведена.<br>\n": }
echo " .. .Эта тоже --br>\n". }
echo "Все завершено.<br>\n":
switch
Конструкция switch эквивааснтна последовательности конструкций if, имеющих одно общее условное выражение. Часто приходится выполнять проверку одной переменной (или выражения) на соответствие различным значениям и соответственно выполнять различные наборы инструкций в каждом случае. Это именно то, для чего предназначена конструкция switch.
Следующие два примера демонстрируют замену нескольких конструкций if на одну switch:
 if ($1 — 0) {
print "1 равно 0"; }
if ($1 == 1) {
print "i равно 1": }
if ($1 - 2) {
print "i равно 2". }
switch ($1) { -ase 0:
print "i равно О"; break; case 1:
print BI равно 1": break; case 2
print "i равно 2"; break. }
В конструкции switch инструкции case проверяются одна за другой, и когда обнаруживается соответствие переменной (выражения) значению, указанному после слова case, исполняются все последующие строки, пока не встретится слово break. Если слово break не указано, выполнение продолжается до конца switch-блока.
 switch ($1) { case О
orint "i равно О"; Cdse 1:
print "i равно 1".
case 2:
print "i равно 2": }
В этом примере, если $i равно О, РНР выполнит все три инструкции print! Если $i равно 1, будут выполнены две последние команды print, и только если $1 равно 2, вы получите единственное «ожидаемое»;сообщение: i равно 2. Поэтому не забывайте указывать слово break в каждом блоке case.
В конструкции switch условное выражение вычисляется только раз и проверяется на соответствие каждому варианту case. В el seif- конструкциях условие проверяется заново (и выражение вычисляется заново), поэтому switch-конструкции выполняются быстрее, если выражение сложное. Блок case также может быть пустым, тогда РНР просто переходит к следующему case (см. объяснение выше).
 switch ($1) { case О case l-case 2:
print "i равно 0. или 1. или 2": break: case 3
print "i равно З"; }
Особый случай case — это case по умолчанию — default. Он используется в том случае, когда ни один из вариантов не соответствует условному выражению.
 switch ($1) { case С:
print "i равно О";
break; case 1:
print "i равно 1";
break: case 2
print "i равно 2";
break; default
rint "i не равно ни 0, ни 1. ни 2": }
Выражение после слова case может быть любым, способным иметь значение и простой тип, то есть целым либо дробным числом или строкой. Массивы и объекты не могут быть использованы в этом I случае, если только они не могут быть приведены к простому типу.
Для конструкций switch возможен альтернативный синтаксис.
 / switch ($1). // вместо открывающей фигурной
 скобки case 0: print "1 равно О": break, default:
print "i не равно 0. 1 и 2"; endswltch:
// вместо завершающей фигурной скобки
 Директивы require() и include()
Директивы require() и include() заменяются интерпретатором в ходе выполнения на содержимое файла, указанного в этих директивах (их аналогией является директива С препроцессора include). Если в конфигурации РНР разрешен параметр «URL fopen wrappers» (по умолчанию он разрешен), в этих директивах, наряду с локально доступными файлами можно использовать файлы из сети Интернет путем указания их URL (для Widows эта возможность пока недоступна). См. функцию fopen().
Файл, включаемый данными директивами, считается файлом HTML, поэтому если он содержит код РНР, то должны присутствовать теги-ограничители (например, <? и ?>), чтобы этот код выполнялся. Обычный синтаксис:
 require ('header.тс'). // возможна
также запись: require "header nnr":
Фактически require() не функция, а специальная конструкция языка. В руководстве по РНР говорится, что «на нее не влияют условные конструкции». Но при проверке на практике выяснилось, что require() функционирует так же, как и include(), то есть на нее влияют условные структуры и в цикле с перечислением имен включаемых файлов она заменяет имена файлов. Директива require() выполняется всегда, вне зависимости от того, выполняется ли код, ею подставляемый. Она не возвращает значение (include() может возвращать значение с помощью команды return).
Директива include() — это «почти» функция. Характерный пример ее применения:
 Sfiles = array ('first.inc'. 'second.inc'. 'third.me');
 for ($1 = 0:
       $1 < count($flies); $i++)
{ include $files[$i]: }
Руководство по РНР требует заключения include() в фигурные скобки в условных конструкциях (но, как я выяснил, в этом нет необходимости).
Включаемые файлы также наследуют все переменные, доступные вы-зываюшему сценарию, с теми значениями, которые они имеют в той строке, где встречается директива включения. Если директива включения встречается в объявлении функций или класса, содержимое включаемого файла ведет себя, как если бы оно находилось вместо директивы включения.
include() также позволяет возвращать значение из включаемого сценария командой return (это завершает выполнение включаемого сценария).
 <?php // file test.тс echo
"До return <br>\n"; if    
   (11 { return 27: }
echo "После return <br>\n": ?>
<?php // main file (main.php)
Sretval = include ('test.inc'):
echo "Возвращенное значение:
'Sretval'<br>\n":
>>
/I Запуск main.php выведет:
// До return <br>
// Возвращенное значение. '27'<br>
Если необходимо передать во включаемый сценарий аргументы (как при вызове функций), это можно сделать двумя способами: установкой глобальных переменных и вызовом сценария посредством HTTP-запроса (с передачей параметров в адресе URL). Однако не стоит забывать, что во втором способе надо задавать полный адрес URL (чтобы обращение происходило к web-серверу, а не локальному файлу) и что при этом включаться будет не сам код, а результаты его выполнения; помимо этого, сервер должен быть способен выполнить запрашиваемый сценарий.
 require ("file php7varone=l&vartwo=2"):
 // не работает (это не URL) require
("http://someserver/file.php?varone=l&vartwo=2");
 // работает Svarone = 1: Svartwo = 2:
require ("file txt");
/* Можно включать локальные файлы
с любым расширением */
См. также: readfile() и virtuaH).
 
require_once() и include_once()
Эти директивы аналогичны вышеописанным с тем отличием, что они Ш не допускают повторного включения файла, если его включение уже происходило. Это позволяет избежать возникновения ошибок при множественном включении файлов — например, когда это приводит к ситуации повторного определения функции (что вызывает ошибку в РНР), повторного назначения констант и т. п.
См. также: get_required_files(), get_included_files(), readfile() и virtual().
Пользовательские функции
Пользовательские функции могут быть определены следующим образом:
 function foo ($arg_l. $arg_2.....$arg_n) {
echo "Example function.\n":
return Sretval. // значение,
возвращаемое функцией }
Внутри тела функции может присутствовать любой PHP-код и даже определение других функций или классов. В РНР 3 определение функции должно предшествовать первому ее использованию, в РНР 4 это требование отсутствует.
РНР не допускает перегрузку функций (в отличие от C++), то есть если функция однажды определена, ее код нельзя изменить или удалить. Поэтому вторичное (пере)определение функции вызовет
ошибку.
РНР 4 также поддерживает неопределенное число аргументов функции и значение аргументов по умолчанию (см. дальше). Для использования этих возможностей полезны функции:
func_num_args(), func_ get_arg() и func_get_args().
Если вы помните, функциям недоступны глобальные переменные.
Передача функциям аргументов
Информация передается функциям через набор их аргументов, представленных последовательностью значений (переменных, выражений), разделенных запятыми. РНР поддерживает: передачу значений аргументов «по значению» (по умолчанию) и передачу значений по ссылке; значения аргументов по умолчанию и переменное для функции число аргументов. См. также:
func_num_args(), func_get_arg() и func_get_args().
 function takes_arra.y($'input) { // в функцию
 передается массив
echo "$input[0] + $input[l] = ". $input[0]+$input[l]: }
Передача значений аргументов по ссылке
По умолчанию в функцию передаются значения аргументов, то есть копии значений выражений и переменных, поэтому изменение значений аргументов имеет смысл только внутри функций и не отражается вовне. Если необходимо изменять сами аргументы, тогда их необходимо передавать по ссылке, так как тогда в функцию передаются не значения, а ссылки переменных. Для этого перед переменной в объявлении функции ставится знак амперсант (&), тогда аргумент всегда будет передаваться в функцию по ссылке:
 function add_some_extraWstnng. $x)
 { Istnng .= "дополним строку
        \п"; $х += 3. // бессмысленно, т.к.
//значение $х потеряется при завершении
функции }
$str = 'Есть строка - '; $а = 1;
add_some_extra($str. $а):
echo $str; // напечатает
'Есть строка - дополним строку'
echo $a. // значение $а не изменилось
Если вы хотите передать аргумент по ссылке в функцию, которая по умолчанию принимает значения «по значению», то амперсант ставится перед переменной в строке вызова функции:

     
function foo ($bar) { // функция принимает аргумент
«по значению»         $bаг = ' и что-то еще';
} $str = 'Это строка. ':
foo ($str); // передача аргумента
по значению echo Sstr . "\n"; // выведет 'Это строка. '
foo (&$str), // передача аргумента по ссылке
echo $str; // выведет ' Это строка, и что-то еще'
Значения аргументов по умолчанию
В определении функции можно использовать синтаксис C++ для задания значений аргументов по умолчанию:
function fee ($type = "Яблоко") {
return "Имеем фрукт: $type.\n";
}
echo fee О:
// выводит «Инеем фрукт: Яблоко» echo fee ("Груша");
// выводит «Имеем фрукт Груша»
Значение по умолчанию должно быть константным.
Отметим, что аргументы, имеющие значения но умолчанию, должны стоять (в объявлении функций) после аргументов, их не имеющих.

function mm (Staste = "вкусный". $ fruit)
{ return "Имеем Staste фрукт $ fruit\n"; }
echo mm ("Яблоко")
// Ошибка смысла!
PHP выдаст следующее:
Warning: Missing argument 2 in call to
ram () in Предупреждение: Не  указан 2-й аргумент
в вызове mmm ()
/usr/local/etc/httpd/htdocs/php3test/functest.htrnl
on' line 41 Имеем Яблоко фрукт:
Интерпретатор пытается присвоить первое значение (из аргументов функции) первому аргументу, а так как для второго аргумента значение не задано (ни по умолчанию, ни явно), ю это вызывает ошибку (хотя и не препятствует дальнейшему выполнению сценария). Сравните со следующим примером:
function mmm2000 (Sfruit. $taste = "вкусный")
{ return "Имеем  Staste фрукг: $ fruit\n".
} echo mwn2000 ("Яблоко");
// работает как надо!
echo mim2000 ("Яблоко", "кислый");
// явное указание        аргумента
РНР выдаст следующее:
Имеем вкусный фрукт:
Яблоко
Имеем кислый фрукт:
Яблоко
Неопределенное число аргументов в функции
РНР 4 поддерживает неопределенное число аргументов в функциях пользователя. Для использования этого имеются функции func_num_ args(), func_get_arg() и func get_args(). При этом не требуется использовать специальный синтаксис и список аргументов может указываться, как в обычных функциях.
Возвращение функциями значений
Значения возвращаются функциями с помощью команды return. Возвращаться может любой тип, включая массивы и объекты.
Пользовательские функции 71
function square ($num)
{ return $num * $num:
} echo square (4); // outputs '16'.
Из функции нельзя возвратить несколько значений одновременно, и если такая необходимость возникает, следует использовать массив.
function snalljiumbers() {
return array (0. 1. 2);
} list ($zero. $one. $two)
= smalljiumbers(),
echo "Szero. $one, $two";
Чтобы вернуть из функции ссылку, нужно использовать оператор ссылки (&) перед именем функции при ее объявлении и при присваивании ее значения переменной.
function &returns_reference()
{ return $someref; }
Snewref =&returns_reference();
Помимо возвращения значений команда return выполняет еще одну важную роль. Она прерывает выполнение функции подобно команде break в условных структурах и циклах. Если необходимо просто прервать выполнение функции, не возвращая никакого значения, в*команде return аргумент можно не использовать.
function а О {
echo "Эта строка будет выведена":
return:
echo "Сюда мы не доберемся";
} а О;
Переменные-функции
РНР поддерживает концепцию переменных-функций. Это означает, что если после имени переменной указаны круглые скобки, РНР будет искать функцию с именем, содержащимся в переменной, и при нахождении таковой запустит ее. Эту полезную особенность можно использовать для осуществления обратных вызовов, составления списков функций и многими другими способами.
<?рпр
function foot) {
echo "Функция foo()<br>\n",
} function barf $arg = '' )
{ echo "Функция bагО;
с аргументом '$arg' ,<br>\n" }
Sfunc = 'too'.
$func(): // запустит функцию foo():
Sfunc = 'bar'.
$func( 'test' );
// запустит функцию bar('test'):
?>
Классы
Класс — это коллекция переменных и функций для работы с ними. Переменные класса объявляются словом van. В функциях класса переменная $this означает: «данный объект этого класса» (экземпляр). Необходимо использовать запись this->что-либо для доступа к любой переменной или функции, имеющейся в этом объекте.
<?рhр
class Корзина {
var $items: // Переменная
(ассоциативный массив).
// используемая для хранения данных о том
// что имеется в корзине и   в каком количестве
// Добавить в корзину предмет $а в количестве
$num штук function add_item
($a. $num) {
$this->items[$a] += $num: }
// Удалить из корзины предмет $а
в количестве $num штук function remove_item
($a. $num) { if ($this->items[$a] >
$num) { $this->items[$a]
-= $num; return TRUE: } else
{ // нельзя удалить больше предметов, чем
имеется return FALSE: } } }?>
Этот класс состоит из одного ассоциативного массива и двух функций для работы с ним.
В PHP 4 только константа может инициализировать значение переменной в объявлении класса, для присваивания неконстантных значений используйте конструктор класса.
Конструктор класса — эта функция класса, имеющая его имя и запускаемая автоматически при создании экземпляра класса.
Объявление класса — всего лишь его описание. Для того чтобы создать экземпляр класса — объект, необходимо создать переменную и назначить ей класс оператором new.
Scart = new Корзина. $cart->addjitpm("10". 1);
Класс может быть расширением другого класса. При наследовании все переменные и функции родительского класса наследуются дочерним классом. Наследование объявляется словом extends после имени класса. РНР не поддерживает множественное наследование (то есть одновременное наследование от нескольких классов).
class Моя_Корзина extends
Корзина {
var Sowner; // владелец
// конструктор класса
function Моя_Корзина (Sname = "Игорь")
{ $this->owner =         $name:
} }
Класс Моя_Корзина расширяет класс Корзина добавлением одной переменной и конструктора.
$ncart = new Моя_Корзина;
print $ncart->owner; // Кто владелец корзины?
$nc = new Моя_Корзина("Вова"),
// Бовина корзина print $nc->owner;
$ncart->add_item ("10" 1):
// (Унаследованная функциональность
от класса Корзина)
Будьте осторожны: для дочерних классов конструктор родительско-ю класса не вызывается при создании экземпляра дочернего класса. Если необходимо вызвать конструктор родительского класса, это должно быть сделано явно (подобно вызову обычной функции родительского класса).
Ссылки
В РНР ссылки — это способ доступа к значению переменной под различными именами. Они отличны от указателей в С, хранящих адрес переменной, в РНР это всего лишь псевдонимы какой-либо переменной.
Ссылки РНР позволяют двум переменным указывать на одно значение. Так, запись:
$а =& $b
означает, что теперь и $а и $b указывают на одно значение. Причем $а и $b теперь полностью идентичны, то есть не $а указывает на $b или наоборот, а обе они указывают на одно место хранения значения.
Основные варианты использования ссылок: передача аргументов по ссылке и возвращение ссылок из функций, они представлены в главе «Функции».
Тот же синтаксис используется в функциях, возвращающих ссылки и при использовании оператора new.
$bаг =& new fooclassO: $foo =& find_var ($bar).
He забудьте: для использования ссылок на объекты оператор ссылки (&), должен использоваться как в конструкторе для переменной $this, так и при создании объекта (назначении его переменной), иначе вы получите два различных объекта.
В дополнение к тому, что сказано о ссылках в главе «Функции», отметим, что по ссылке кроме переменных могут передаваться объекты, созданные оператором new (например, foo(new foobarO), и ссылки, возвращаемые другими функциями.
Удаление ссылочной связи производится использованием функции unset().
Ja = 1;
$b =& $а; // создание ссылочной связи
inset ($a); // удаление ссылочной связи
// при этом $b продолжает оставаться
переменной со значением 1

Ссылки можно рассматривать как аналогии жестких файловых связей в системе Unix, тогда действие unseto — аналог команды unlink.
 
На главную | Содержание | < Назад....Вперёд >
С вопросами и предложениями можно обращаться по nicivas@bk.ru. 2013 г. Яндекс.Метрика