Структура и синтаксис PHP (выжимка)
Я проработал по главам официальную документацию и использовал две книги связанных с PHP, результат работы стал данный пост. Писал я его, прежде всего для себя, он понадобиться мне для быстрого включения в работу, когда я подзабуду синтаксис PHP, все в голове не удержишь. Думаю, данная выжимка может кому-то пригодиться.
Сперва хочу дать ссылку на официальную документацию (на русском)
Используйте её как единственный верный источник информации о PHP, все что написано ниже – это моя логическая выжимка по структуре и синтаксису PHP с моими комментариями.
1. Комментарии
Комментарий бывают двух типов:
1 2 3 |
//однострочный комментарий /* многострочный комментарий */ |
С помощью “//” и “/* */” можно сделать интересный трюк – «комментарий переключатель»
1 2 3 4 5 6 7 |
<? //* echo "Раз"; /*/ echo "Два"; // */ ?> |
Сейчас закомментирована строка « echo «Два»; », но если удалить один слеш в первой строке (//*), то закомментируется первая строка и раскомментируется вторая. Выходит, с помощью удаление одного слеша, мы переключаем, какой блок занесен в комментарий, а какой нет.
2. Размещение скрипта в HTML
Скрипт размещается в следующих тегах:
1 |
<?php ... ?> |
или в
1 |
<? ... ?> //сокращенный вариант |
3. Типы данных
В PHP поддерживается 8-емь типов данных:
- bool – логическое значение TRUE или FALSE
- int — целые числа
- float или double – дробные числа
- string – строки
- array – массивы
- object – объекты
так же еще есть два специальных:
- resource – для дескрипторов ресурсов
- NULL – для неинициализированных значений
PHP язык динамической типизации данных, это значит что вам не надо указывать тип при объявление переменных. Поэтому, в PHP вы не часто увидите раздельное объявление и инициализацию переменных, обычно их сразу объявляют и инициализирует (присваивают им значение). Интерпретатор в процессе выполнения уже сам определяет что за тип.
В PHP есть возможность явного приведения типа, в ответственных участках скрипта я рекомендую его использовать.
Пример явного приведения типа:
1 2 3 |
$i = (int) 10 // переменная «i» имеет тип int, т.е. в ней записано число «10» $j= (bool) 10 // переменная «j» имеет тип bool, т.е. в ней записано значение TRUE // (в логическом типе 0 это FALSE, все остальные символы,знаки и т.п. – TRUE) |
Но это не значит, что $i и $j всегда будет заданного в скобках типа, они будут иметь данный тип только в том месте, где вы это укажете. Например, если после этого, я присвою $i значение 10.0, то переменная поменяет тип c int на double.
P.S. Узнать тип данных можно с помощью функции gettype(имя_переменной)
С PHP 5 стало возможно явно указывать тип аргументов функции (или методов), делается это как и в С/C++, перед аргументам указываем его тип, пример:
1 2 3 |
function f(array $x) { … }; |
Если мы вызовем функцию f с аргументом отличного типа от array (массив), то интерпретатор выведет ошибку:
«Catchable fatal error: Argument 1 passed to f() must be an array, тип_аргумента_который_вы_использовали given, called in …»
4. Переменные
Обозначение переменных начинается со знака «$».
Объявлять переменную и присваивать ей значение нужно так:
1 |
$name_var=value; |
Где name_var — имя переменной, value – значение переменной.
Пример объявление и инициализации переменных разных типов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$name_var=TRUE; // переменная типа bool с значением TRUE $name_var=10; // переменная типа int с значением 10 $name_var=10.1; // переменная типа float (или double) с значением 10.1 $name_var="слово"; // переменная типа string с значением «слово», так же // можно использовать одинарные кавычки, но тогда вам // будут не доступны спец символы \n, \r и т.д. // Спецсимволы понадобиться при печати в файл, для // вывода в браузер они работать не будут, вместо // их надо использовать тег <br>. $name_var= array("key_1" => "value_1","key_2" => "value_2"); // переменная типа array с ассоциативным массивом, состоящим // из двух элементов, с индексами key_1, key_2 и значениями value_1, // value_2, обращаются к массиву так - $name_var[ключ]; $name_var= array("value_1","value_2"); // переменная типа array с «простым» массивом, // индекс – нумерованный по порядку возрастания, // обращаются к массиву так $name_var[индекс]; $name_var=new myClass; // переменная типа object с экземпляром класса myClass или просто объект |
P.S. Повторюсь, узнать тип данных можно с помощью функции gettype(имя_переменной)
Продолжим…
Присвоить что-то переменной, можно по значению (простое присваивание), а можно по ссылке.
Пусть есть две переменные:
1 2 |
$s1="слово №1"; $s2="слово №2"; |
- Присвоим значение $s2 переменной $s1:
1$s1=$s2;
Переменная $s1 получила значение “слово №2”, то, что мы будем дальше делать с $s1 ни как не влияет на $s2. В общем, это самое обычное присваивание значение переменной. - Присвоим значение $s2 по ссылке переменной $s1
1$s1=&$s2;
Знак «&» обозначает, что присваиваться будет не значение, а ссылка на данную переменную. Теперь и в $s1 и в $s2 находиться одно значение «слово №2», если мы изменим его в $s1, то измениться и значение в $s2 и наоборот, изменив его в $s2 оно (значение) также измениться и в $s1. Замечу, что аналогия с С++ тут не пройдет, &$s2 – не содержит в явном виде адрес переменной $s2, так что делать что-то с адресами у вас не получиться. Для сброса ссылки используйте функцию unset(имя_переменной);
Пару слов о переменных с типом «string», объявить и инициализировать переменную с данным типом можно «классическим способом»:
1 |
$s1="слово №1"; |
а можно, используя синтаксис «here doc»:
1 2 3 |
$s1 = <<< EOD слово №1 EOD; |
Где EOD – произвольный идентификатор (т.е. любое слово — транслитом), обозначающий начало и конец текста, закрывающий идентификатор (в моем случае EOD) должен разделяться от последнего символа строки только знаком «переход на новую строку» (ни каких табов от левого края до закрывающего EOD быть не должно).
Преимущество данного способа объявление переменной типа «string» в том, что не надо экранировать кавычки, текст как пишется, так и выводиться. Так же, в тексте можно указывать имя переменных, в результате печати будет выводиться их содержимое.
Важно заметить, что в отличие от С/С++, в PHP глобальные переменные (которые объявлены выше вне функции) в теле функции по умолчанию не видны. Для того чтобы они стали видны и с ними можно было работать, необходимо их пометить что они глобальные, с помощью ключевого слова global, пример:
1 2 3 4 5 6 |
$i=1; function f() { global $i; $i=2; } |
Если мы вызовем f(), значение глобальной переменной $i измениться с 1 на 2.
Также есть еще вариант, работать с глобальными переменными можно через специальный массив $GLOBALS, например:
1 2 3 4 5 |
$i=1; function f() { $GLOBALS['i']=2; } |
все также, вызов f() изменит значение глобальной переменной $i с 1 на 2.
Переменная $GLOBALS является суперглобальной, её видно во всех областях видимости. Посмотреть список суперглобальных переменных вы можете на этой страницы документации
Переменная объявленная в теле функции, живет только во время исполнения функции, если мы хотим сохранить значение переменной до момента нового вызова той же функции, то её необходимо сделать «статической», используя зарезервированное слово «static», пример:
1 2 3 4 5 |
function f() { $i=1; $i++; echo $i; } |
любое кол-во раз вызвав функцию f() вы получите «2».
Объявим переменную $i как статичную:
1 2 3 4 5 |
function f() { static $i=1; $i++; echo $i; } |
теперь вызывая f(), вы каждый раз будете получать число больше на единицу, тут важно три момента:
- статическая переменная инициализируется только при первом вызове функции (т.е. ей не будет присваиваться значение 1-цы при каждом запуске функции ).
- значение переменной $i сохраняется в памяти до нового вызова f()
- статическая переменная может хранить только константные значения (не ссылки на переменные и не объекты, а также нельзя приравнивать выражения, например static $i=1+1, все эти случаи интерпретатор будет считать ошибкой)
В PHP есть такая интересная штука как «переменные переменных» (или динамическая переменная), это переменная, которая хранит значение другой переменной и считает его именем, на примере должно быть более понятно:
1 2 |
$i="name1"; $$i="2"; |
Что это значит?
С помощью двойного знака «$» мы создали переменную с именем «name_1» и присвоили ей цифру 2. Еще раз, конструкция $$i=2 обозначает, что PHP интерпретатору нужно создать переменную с именем указанным в переменной $i и присвоить этой переменной значение 2.
1 |
echo $name1; //выведет 2 |
одно и тоже
1 |
echo $$i; //выведет 2 |
5. Константы
Константы это неизменяемые значения или «имя какого либо значения». Например константа Pi (пи) равна 3,14… .
Определяют константу в PHP так:
1 |
define("Pi", "3.14"); |
или так
1 |
const Pi=3.14; |
Обращаются к константе просто по имени, без знака «$», например:
1 |
echo Pi //выведет число 3.14 |
Если константа не объявлена и к ней происходит обращение, то интерпретатор PHP в качестве значения будет использовать имя константы, пример:
1 2 3 |
// я не объявляю ни каких констант echo Pi //выведет Pi |
6. Операторы условия
Синтаксис оператора IF
1 2 3 4 5 |
if (выражение) { команда1; } else { команда2; } |
Пару слов о понятие «выражение» …
Под выражением понимается «все что угодно» в языке PHP, главное чтобы оно возвращало значение. А т.к. оператор IF (и все условные операторы) требует от выражения значения типа boolean, то все значения иного типа будут автоматически приведены к типы boolean.
В значение FALSE типа boolean преобразуются значение 0-ля типа int, значение 0.0 типа double, пустая строка и строка «0» типа string и массив без элементов, все остальное преобразуются в значение TRUE типа boolean.
Пример выражений и что они возвращают TRUE или FALSE при преобразование в тип boolean:
- выражение «1» в if() возвращает TRUE
- выражение «-1» в if() возвращает TRUE
- выражение «123456» в if() возвращает TRUE
- выражение «0» в if() возвращает FALSE
- выражение «0.0» в if() возвращает FALSE
- выражение «0.00000001» в if() возвращает TRUE
- выражение «””» (пустая строка) в if() возвращает FALSE
- выражение «” ”» (строка с символом пробела) в if() возвращает TRUE
- выражение «”0”» (строка с символом 0) в if() возвращает FALSE
- выражение «”1”» (строка с символом 1) в if() возвращает TRUE
- выражение «”123456”» (строка с символами 123456) в if() возвращает TRUE
- выражение «”FALSE”» (строка с символами FALSE) в if() возвращает TRUE (!)
- выражение «”TRUE”» (строка с символами FALSE) в if() возвращает TRUE
- выражение «array(1,2,3,4)» в if() возвращает TRUE
- выражение «array()» в if() возвращает FALSE
- выражение «f()» (функция которая возвращает 1-цу) в if() возвращает TRUE
- выражение «$x» (переменная $x содержит 1-цу) в if() возвращает TRUE
Обычно выражения это условные операторы:
выражение «2>1» возвращает TRUE
выражение «2<1» возвращает FALSE
P.S. Объект всегда возвращает TRUE (кроме PHP версии 4), даже если он не имеет свойств и методов.
Итак оператор IF…
Оператор IF имеет следующий синтаксис:
1 2 3 4 5 |
if (выражение) { команда1; } else { команда2; } |
Если выражение возвращает «истина» (TRUE), то выполняется команда1, если «ложь» (FALSE) то команда2.
Синтаксис оператора IF c elseif:
1 2 3 4 5 6 7 |
if (выражение1) { команда1; } elseif (выражение2) { команда2; } elseif (выражениие3) { команда3; } |
Если выражение1 «истина», то выполняется команда1, если выражение2 «истина» а все выше выражения «ложь» (выражение1 «ложь») то выполняется команда2, если выражение3 «истина» а все выше выражения «ложь» (выражение1 и выражение2 «ложь») то выполняется команда3. Т.е. выполняется всегда код первого истинного выражения.
В PHP есть альтернативный синтаксис для IF
1 2 3 4 5 |
if (выражение): команда1; else: команда2; endif; |
и для IF с elseif
1 2 3 4 5 |
if (выражение1): команда1; elseif (выражение2): команда2; endif; |
Также есть еще одна альтернативная запись IF c помощью тернарного условного оператора:
1 |
выражение ? команда1 : команда2; |
Если выражение TRUE выполняется команда1, если FALSE то команда2.
Синтаксис оператора switch
Оператор имеет следующий синтаксис:
1 2 3 4 5 6 7 8 9 |
switch ($i) { case 0: команда1; break; case 1: команда2; break; default: команда3; |
Если $i равно 0, то выполняется команда1 и break (выход из условия), если $i равно 1, то выполняется команда2 и break (выход из условия), если $i не попадает не под одно из условий (не равно 0 и не равно 1) то выполняется то, что под default, т.е. команда3.
В том случаем, если после команд вы не напишите break, то выполняться будут все нижестоящие команды до конца switch, например:
1 2 3 4 5 6 7 8 |
switch ($i) { case 0: команда1; case 1: команда2; default: команда3; } |
Если $i равно 0, то выполниться команда1 потом команда2 и далее команда3, если $i равно 1, то выполниться команда2 и команда3.
Альтернативный синтаксис switch:
1 2 3 4 5 6 7 8 9 10 |
switch ($i): case 0: команда1; break; case 1: команда2; break; default: команда3; endswitch; |
7. Операторы цикла
Синтаксис оператора FOR
Сначала, я продемонстрирую классическое применение оператора FOR, обычно люди всегда ищут что то вроде этого:
1 2 3 |
for ($i = 1; $i <= 10; $i++) { команда; } |
Цикл выполнит команду 10 раз.
Интересующимся я расскажу про синтаксис цикла for более подробно, итак синтаксис:
1 2 3 |
for (выражение1, выражение2, выражение3) { … } |
До начала цикла выполняется выражение1, далее проверяется что возвращает выражение2, если истина, то выполняется код заключенный в { }, если ложь то работа цикла завершается. После исполнения всех команд в {} (одна итерация) выполняется выражение3. Если вместо одного выражения вы хотите записать не сколько, пишите их через запятую.
Тогда «классический пример» выше, можно записать в следующем непопулярном, но в интересном сокращенном виде:
1 |
for ($i = 1; $i <= 10; команда,$i++); |
У FOR также есть альтернативный синтаксис:
1 2 3 |
for ($i = 1; $i <= 10; $i++): команда; endfor; |
Синтаксис оператора WHILE и DO…WHILE
Оператор while имеет следующий синтаксис:
1 2 3 |
while (выражение) { команда; } |
Первым делом выполняется выражение, если оно возвращает TRUE, то исполняется команда, если выражение возвращает FALSE то работа цикла завершается. После исполнение команды в {} опять выполняется выражение, если оно возвращает TRUE, то вновь исполняются команды в {} если FALSE, то цикл завершается. Далее все по аналогии.
Альтернативный синтаксис WHILE:
1 2 3 |
while (выражение): команда; endwhile; |
Оператор do … while имеет следующий синтаксис:
1 2 3 |
do { команда; } while (выражение); |
Оператор цикла do … while сначала исполняет команду в {}, а потом проверяет, что возвратит выражение, если TRUE, то команда в {} выполниться еще раз, если FALSE то работа цикла завершиться. Получается, что команда исполниться в любом случае хотя бы один раз.
Синтаксис оператора foreach
foreach – цикл перебора массивов (и объектов).
У данного оператора как и у всех в PHP есть два синтаксиса, первый:
1 2 3 |
foreach (массив as переменная) { команда; } |
На каждой итерации, значение текущего элемента присваивается переменной, далее выполняется команда, в которой мы можем работать с данной переменной. Тут важно заметить, что цикл foreach работает с копией массива, поэтому, изменять элементы массива через переменную мы не можем. Чтобы изменять элементы массива внутри цикла через переменную, нам необходимо после «as» и перед переменной поставить знак «&»:
1 2 3 4 |
foreach (массив as &переменная) { команда; } unset($value); // разорвать ссылку на последний элемент |
Альтернативный синтаксис foreach:
1 2 3 |
foreach (массив as переменная1 => переменная2) { команда; } |
На каждой итерации, значение текущего ключа присваивается переменной1, а текущего элемента переменной2. Чтобы изменять элементы массива внутри цикла через переменную, нам необходимо после «=>» и перед переменной2 поставить «&»:
1 2 3 |
foreach (массив as переменная1 => &переменная2) { команда; } |
С версии PHP 5.5 появилась возможность распаковывать вложенный массив с помощью функции list(), пример:
1 2 3 4 5 |
$arr =array(array(1,2), array(3,4)); foreach ($array as list(переменная1, переменная2)) { команда; } |
В данном случае, на каждой итерации, переменная1 получит значение первого элемента текущего вложенного массива, а переменная2 второго элемента текущего вложенного массива. Т.е. на первой итерации переменная1=1, а переменная2=2, на второй итерация переменная1=3, переменная2=4;
Операторы break и continue:
- break – прерывает выполнение циклов (for,while,foreach)
- continue – прекращает текущею итерацию, после чего проверятся выражение и в случае TRUE выполняется следующая итерация.
8. Директивы интерпретатора PHP
Все нижеуказанные директивы, заменяются интерпретатором на содержимое файла, имя которого указывается в качестве параметра. Подключаемый файл считается HTML – файлом, поэтому php-код, в нем обязательно обрамляется тегом <?php … ?> (или <? … ?>). Путь до подключаемого файла указывается относительного выполняемого сценария.
8.1. include ‘имя_файла.php’ – Подключает файл, в случае его отсутствия интерпретатор выведет ошибку, но выполнение скрипта продолжиться. Также include может возвращать значения (return в подключаемом файле), пример:
1 |
$var=include 'имя_файла.php'; |
В данном примере, подключиться файл и переменной $var присвоится значение, которое возвращает подключаемый файл с помощью return. В том случае, если подключаемый файл ничего не возвращает, include вернет «1» при удачном подключение или «FALSE» при не удачном.
8.2. require ‘имя_файла.php’ – Подключает файл, в случае его отсутствия, выполнение текущего скрипта прекратиться.
P.S. Также есть:
- require_once
- include_once
Они аналогичны include и require по функциональности, отличие в том, что файл подключиться только один раз, в не зависимости от того сколько вы раз вызвали данные директивы.
9. Функции
В интерпретатор PHP по умолчанию встроено большое количество функций, список их можно увидеть по ссылке
Разберемся, как создавать пользовательские функции
Описывать функцию можно даже после её вызова, приведу синтаксис описания функции:
1 2 3 4 |
function имя_функции ($переменная1, $переменная2, … ) { команда; return $переменная; } |
Вызывается функция таким образом:
1 |
$переменная_с_результатом_работы_функции=имя_функции($переменная1, $переменная2, …); |
В качестве аргументов функции, передается «переменная1», «переменная2» и т.д. Функция в результате вызова по имени «имя_функции(переменная1, переменная2, …)» выполняет команду и возвращает значение переменной с помощью return, последнее не обязательное и ни кто не обязывает возвращать результат через return. Получить результат работы функции можно и иным способом, если передать аргументы не по значению как выше (в данном случае функция работает с копиями переменных), а по ссылке, пример:
1 2 3 |
function имя_функции (&переменная1, переменная2, … ) { команда; } |
Переменная с именем «$переменная1» передана в функцию по ссылке, а это значит, что все изменения, которые произойдут с ней в теле функции будут видны и вне функции, выходит «$переменная1» можно использовать как результат работы функции. Таких переменных может быть любое кол-во.
В PHP как и в С++ есть возможность задавать значение аргументов по умолчанию:
1 2 3 |
function имя_функции (переменная1, … , переменнаяN=значение_по_умолчанию) { команда; } |
P.S. Аргументы функции с значениями по умолчанию должны всегда следовать за «простыми» аргументами
Выше указанное обозначает, что если мы вызовем данную функцию не указав в качестве ее аргументов переменнуюN, то ее значение будет равно значению_по_умолчанию, которое может быть любого типа (число, строка и т.п.).
Полезно повторить (о чем я уже говорил в разделе «3. Типы данных»):
а) Что с PHP 5 стало возможно явно указывать тип аргументов функции, делается это как и в С/C++, перед аргументам указываем его тип.
Пример №1 «аргумент должен быть массивом»:
1 2 3 |
function f(array $x) { … }; |
Если мы вызовем функцию f с аргументом отличного типа от array (массив), то интерпретатор выведет ошибку:
«Catchable fatal error: Argument 1 passed to f() must be an array, тип_аргумента_который_вы_использовали given, called in …»
Пример №2 «аргумент должен быть экземпляр класса myClass»:
1 2 3 |
function f(myClass $x) { … }; |
Если мы вызовем функцию f с аргументом отличного типа от объекта унаследованного от класса myClass, то интерпретатор выведет ошибку
«Catchable fatal error: Argument 1 passed to f() must be an instance of myClass, тип_аргумента_который_вы_использовали given, called in …»
б) Отличительной чертой PHP от C++ является то, что в теле функции по умолчанию не видно глобальных переменных, как я уже писал в разделе «4. Переменные» для исправления данного исключения необходимо либо использовать ключевое слово «global», либо обращаться к массиву глобальных переменных — $GLOBALS.
Применение ключевого слова «global»:
1 2 3 4 5 6 |
$i=1; //глобальная переменная function f() { global $i; //после данной строки, мы можем работать с глобальной переменной $i $i=2; } |
Применение массива «$GLOBALS»:
1 2 3 4 5 |
$i=1; //глобальная переменная function f() { $GLOBALS['i']=2; //обращаемся к глобальной переменной через массив $GLOBALS } |
Если мы вызовем f() в любом из двух случаев, значение глобальной переменной $i измениться с 1 на 2.
Идем дальше…
В PHP есть такая интересная штука как «переменные-функции», это когда переменной присваивается строка с именем уже объявленной функции и далее данная функция вызывается, с помощью переменной приписав к ней две скобки, пример:
1 2 3 4 5 6 7 8 9 10 |
//объявим функцию «имя_функции» function имя_функции ($переменная1, $переменная2, … ) { команда; } //объявим переменную и инициализируем её строкой «имя_функции» $var="имя_функции"; //вызовем функцию «имя_функции» с помощью переменной $var $var($переменная1, $переменная2, …); |
И последнее о функциях…
Есть такой тип функций «анонимные» (их также называют «замыкания» или «closures»), появились они в PHP начиная с версии 5.3.0. Объяснить что такое анонимные функции не трудно, труднее дать представление, где они применяются.
Итак, анонимные функции это функции без имени, объявляются они так:
1 2 3 |
function() { команда; }; |
Если просто записать данную функцию в коде, то ничего не произойдет, объявить то объявили, но вызвать ее мы не сможем, имени нет.
При объявление, анонимные функции можно присваивать переменным:
1 2 3 |
$f=function() { команда; }; |
Тогда вызов функции, будет таким:
1 |
$f(); // не забываем символ $ |
Возникает вопрос, зачем нужны функции без имени? Анонимные функции довольно часто применяются в качестве callback-параметров или функций обратного вызова..
Callback – параметр, это аргумент функции, значение которого и есть анонимная функция (в таком случае анонимную функцию называют функцию обратного вызова)
В PHP имеется множество стандартных функций, аргументы которых являются callback, т.е. принимают в качестве аргументов — анонимную функцию. Самые популярные из них:
- array_filter – применяет фильтр к массиву, логика фильтра передается в качестве функции обратного вызова (описание в документации )
- array_map – применяет функцию обратного вызова ко всех элементам массива (описание в документации )
- array_reduce – итеративно уменьшает массив к единственному значению, используя функцию обратного вызова (описание в документации )
Пример:
1 2 3 4 5 6 |
$a = array(1, 2, 3); //объявим и инициализируем массив $res=array_map(function($var) {return ($var+1);}, $a); //вызовем функцию array_map с //анонимной функцией в качестве //аргумента, которая будет применяться //к каждому элементу массива print_r($res); //печать результата |
Результат: массив с элементами 2,3,4.
10. Пространство имён
(данная возможность добавлена с PHP 5.3.0)
Пространство имен можно представлять как некую оболочку для кода, которая защитит нас от конфликта имен. Все имена функций, классов и констант что находятся в одном пространстве имён, могут пересекаться с именами функций, классов и констант другого пространства имен, это не вызовет ошибки.
Зачем нужно пространство имен, объясню на примере:
Допустим в вашем php-скрипте вы подключили с помощью include некоторое количество сторонних php-файлов (библиотек), вы пишете код и описываете свою пользовательскую функцию, придумывайте ей имя, но вы не знаете (точнее не держите в голове) какие имена у функций в подключаемых файлах, если имя совпадет, то интерпритатор PHP выведет фатальную ошибку. «Fatal error: Cannot redeclare … ».
Вы можете сказать, я могу переименовать свою функцию и проблем нет, но на какое имя? Ведь название может опять совпасть… придется гадать. Чтобы не заниматься глупостями, правильнее, размещать свой код в пространстве имён, тогда мы можем не забивать себе голову — о проблеме совпадений имен. Заметьте, мы говорим о конфликте имен функций, классов и констант, про переменные (!) я не говорил. При конфликте имени переменной, PHP интерпретатор ошибку не вызовет, он просто посчитает, что вы хотите данную переменную переинициализировать (придать ей новое значение).
Пример:
файл script.php:
1 2 3 4 5 |
<?php function f() { echo "функция сторонней библиотеки<br>"; } ?> |
файл index.php:
1 2 3 4 5 6 7 8 9 |
<? include "script.php"; //подключаем «сторонний файл» function f() { //такое имя функции уже объявлено в script.php echo "моя функция<br>"; } f(); ?> |
Результат – ошибка:
Fatal error: Cannot redeclare f() (previously declared in Z:\home\s-engineer.ru\www\index.php:11) in Z:\home\s-engineer.ru\www\script.php on line 4
Решение проблемы – использовать пространство имен, достаточно объявить все, что в файле index.php в одно пространство имен:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<? namespace mySpace; //весь код данного скрипта находится в // пространстве имен с именем mySpace include "script.php"; function f() { echo "моя функция<br>"; } f(); //вызываем свою функцию \f(); //вызываем функцию из «глобального» пространства имен, т.е. f() - файла script.php ?> |
Результат:
моя функция
функция сторонней библиотеки
Знак слеша (\) обозначает что данная функция описана в «глобальном пространстве имён», т.е. где угодно кроме этого пространства имен или этого файла.
P.S. Ключевое слово «namespace» должно быть первой строкой в php файле (строка «<?php» или «<?» за первую не считается). Следующий код вызовет ошибку:
<html>
<?
namespace mySpace;
….
?>
</html>
т.к. до «namespace» есть строка с тегом <html>
Тут важно заметить, что f() вызовет функцию, если она описана в данном пространстве имен, если нет, то ошибки не будет, интерпретатор вызовет f() из «глобального пространства имен».
Пример, удалим из index.php описание функции f():
1 2 3 4 5 6 7 8 |
<? namespace mySpace; include "script.php"; f(); //вызываем свою функцию, но т.к. она тут не описана, то вызываться будет f() из «глобального» п.и. \f(); //вызываем функцию из «глобального» пространства имён ?> |
Результат:
функция сторонней библиотеки
функция сторонней библиотеки
Правило «замены несуществующей функции из глобального пространства имён» работает также и для констант, но не работает для классов. Если у вас есть описания класса в глобальном пространстве имён, но нет в вашем, то при создание его экземпляра, PHP интерпретатор выведет ошибку, т.е. «замены» из глобального пространства имён как для функции и констант осуществляться не будет.
Если вы хотите быть уверенным, что обращаетесь к функциям и константам своего пространства имён, тогда нужно писать так:
1 2 3 4 5 6 7 8 9 10 11 |
<? namespace mySpace; include "script.php"; function f() { echo "моя функция<br>"; } \mySpace\f(); //вызываем функцию f() из своего пространства имен mySpace ?> |
11. Классы и объекты
Про классы и объекты рассказано в следующем посте
Вам будет интересно:
Буду признателен если вы поделитесь данным постом