Этот документ описывает версию PHP 5 и выше.
1<?php // PHP код должен быть заключен в теги <?php
2
3// Если ваш файл содержит только PHP-код, то можно
4пропустить закрывающий ?>
5
6// А так начинаются комментарии
7
8# Это тоже комментарий но // предпочтительнее
9
10/*
11 Окруженный /* и */ текст превращается
12 в многострочный комментарий
13*/
14
15// Используйте "echo" или "print" для вывода.
16print('Hello '); // Напечатать "Hello " без перевода строки
17
18// () необязательно применять для print и echo
19echo "World\n"; // Напечатать "World" и перейти на новую строку.
20// (все утверждения должны заканчиваться точкой с запятой)
21
22// Любые символы за пределами закрывающего тега выводятся автоматически:
23?>
24Hello World Again!
25<?php
26
27
28/************************************
29 * Типы и Переменные
30 */
31
32// Переменные начинаются с символа $.
33// Правильное имя переменной начинается с буквы или символа подчеркивания,
34// за которым следует любое количество букв, цифр или символов подчеркивания.
35// Не рекомендуется использовать кириллические символы в именах (прим. пер.)
36
37// Логические значения нечувствительны к регистру
38$boolean = true; // или TRUE или True
39$boolean = false; // или FALSE или False
40
41// Целые числа
42$int1 = 12; // => 12
43$int2 = -12; // => -12
44$int3 = 012; // => 10 (ведущий 0 обозначает восьмеричное число)
45$int4 = 0x0F; // => 15 (ведущие символы 0x означают шестнадцатеричное число)
46
47// Двоичная запись integer доступна начиная с PHP 5.4.0.
48$int5 = 0b11111111; // 255 (0b в начале означает двоичное число)
49// Удаление переменной
50unset($int1);
51
52// Дробные числа
53$float = 1.234;
54$float = 1.2e3;
55$float = 7E-10;
56
57// Арифметика
58$sum = 1 + 1; // 2
59$difference = 2 - 1; // 1
60$product = 2 * 2; // 4
61$quotient = 2 / 1; // 2
62
63// Арифметические сокращения
64$number = 0;
65$number += 1; // Увеличивает $number на 1
66echo $number++; // Печатает 1 (инкрементируется после вывода)
67echo ++$number; // Печатает 3 (инкрементируется до вывода)
68$number /= $float; // Делится и результат присваивается $number
69
70// Строки должны быть заключены в одинарные кавычки;
71$sgl_quotes = '$String'; // => '$String'
72
73// Избегайте двойных кавычек за исключением случаев интерполирования переменной
74$dbl_quotes = "This is a $sgl_quotes."; // => 'This is a $String.'
75
76// Специальные (escape) символы работают только в двойных кавычках
77$escaped = "This contains a \t tab character.";
78$unescaped = 'This just contains a slash and a t: \t';
79
80// Заключайте переменные в фигурные скобки, если это необходимо
81$apples = "I have {$number} apples to eat.";
82$oranges = "I have ${number} oranges to eat.";
83$money = "I have $${number} in the bank.";
84
85// Начиная с PHP 5.3, синтаксис nowdocs может использоваться для
86// неинтерполированного многострочного текста
87$nowdoc = <<<'END'
88Multi line
89string
90END;
91
92// Heredocs поддерживает интерполяцию переменных
93$heredoc = <<<END
94Multi line
95$sgl_quotes
96END;
97
98// Строки соединяются при помощи .
99echo 'This string ' . 'is concatenated';
100
101// echo можно передавать строки как параметры
102echo 'Multiple', 'Parameters', 'Valid'; // печатает 'MultipleParametersValid'
103
104
105/********************************
106 * Константы
107 */
108
109// Константа определяется при помощи define()
110// и никогда не может быть изменена во время выполнения программы!
111
112// Правильное имя константы начинается с буквы или символа подчеркивания
113// и содержит любое количество букв, цифр или символов подчеркивания.
114define("FOO", "something");
115
116// Доступ к константе возможен через прямое указание её имени без знака $
117echo FOO; // печатает 'something'
118echo 'This outputs ' . FOO; // печатает 'This outputs something'
119
120/********************************
121 * Массивы
122 */
123
124// Все массивы в PHP - это ассоциативные массивы
125
126// Ассоциативные массивы, известные в других языках как HashMap.
127
128// Работает во всех версиях РHP
129$associative = array('One' => 1, 'Two' => 2, 'Three' => 3);
130
131// В PHP 5.4 появился новый синтаксис
132$associative = ['One' => 1, 'Two' => 2, 'Three' => 3];
133
134echo $associative['One']; // печатает 1
135// Добавить элемент в ассоциативный массив
136$associative['Four'] = 4;
137
138
139// Список тоже содержит целочисленные ключи
140$array = ['One', 'Two', 'Three'];
141echo $array[0]; // => "One"
142
143// Добавить элемент в конец массива
144$array[] = 'Four';
145// или
146array_push($array, 'Five');
147// удалить элемент из массива
148unset($array[3]);
149
150/********************************
151 * Вывод
152 */
153
154echo('Hello World!');
155// Печатает Hello World! на stdout.
156// Stdout это веб-страница запущенная в браузере.
157
158print('Hello World!'); // Аналогично echo
159
160// echo - это конструкция языка, вы можете опустить скобки.
161echo 'Hello World!';
162print 'Hello World!'; // Выводит Hello World!
163
164$paragraph = 'paragraph';
165
166echo 100; // Печать скалярной переменной напрямую
167echo $paragraph; // или печать переменной
168
169// Если короткие теги разрешены, или ваша версия PHP >= 5.4
170// вы можете использовать сокращенный синтаксис echo
171?>
172<p><?= $paragraph ?></p>
173<?php
174
175$x = 1;
176$y = 2;
177$x = $y; // $x теперь содержит значение переменной $y
178$z = &$y;
179// $z содержит ссылку на $y. Изменение значения $z затронет значение $y и наоборот.
180// Значение $x остается неизменным.
181
182echo $x; // => 2
183echo $z; // => 2
184$y = 0;
185echo $x; // => 2
186echo $z; // => 0
187
188// Вывести тип и значение переменной в stdout
189var_dump($z); // печатает int(0)
190// Напечатать переменную в stdout в удобочитаемом виде
191print_r($array); // печатает: Array ( [0] => One [1] => Two [2] => Three )
192
193/********************************
194 * Логические выражения
195 */
196$a = 0;
197$b = '0';
198$c = '1';
199$d = '1';
200
201// Утверждение (assert) выдает предупреждение, если его аргумент не true
202
203// Эти сравнения всегда будут истинными, даже если типы будут различаться
204assert($a == $b); // "равно"
205assert($c != $a); // "не равно"
206assert($c <> $a); // другое обозначение "не равно"
207assert($a < $c); // меньше
208assert($c > $b); // больше
209assert($a <= $b); // меньше или равно
210assert($c >= $d); // больше или равно
211
212// Следующие утверждения истинны, если переменные имеют одинаковый тип.
213assert($c === $d);
214assert($a !== $d);
215assert(1 == '1');
216assert(1 !== '1');
217
218// 'Spaceship' оператор (с PHP 7) используется для сравнения двух выражений.
219// Возвращает -1, 0 или 1, когда выражение слева меньше, равно или больше
220// выражения справа.
221$a = 100;
222$b = 1000;
223
224echo $a <=> $a; // 0, выражения равны
225echo $a <=> $b; // -1, $a < $b
226echo $b <=> $a; // 1, $b > $a
227// Переменные могут изменять тип в зависимости от их использования.
228$integer = 1;
229echo $integer + $integer; // => 2
230
231$string = '1';
232echo $string + $string; // => 2 (строка превращается в число)
233
234// Выводится 0 по той причине, что оператор + не может привести строку 'one' к
235// числовому типу
236$string = 'one';
237echo $string + $string; // => 0
238
239// Приведение типов (type casting) может быть использовано для преобразования
240// переменной в другой тип
241$boolean = (boolean) 1; // => true
242
243$zero = 0;
244$boolean = (boolean) $zero; // => false
245
246// Также существуют функции выполняющие приведение типов
247$integer = 5;
248$string = strval($integer);
249$float = floatval($integer);
250
251$var = null; // Null
252
253// И похожая по действию функция
254$integer = 10;
255$boolen = settype($integer, "string") // теперь $integer имеет строковый тип
256
257// settype возвращает true, если преобразование удалось и false в противном случае
258
259/********************************
260 * Управляющие структуры
261 */
262
263if (true) {
264 print 'I get printed';
265}
266
267if (false) {
268 print 'I don\'t';
269} else {
270 print 'I get printed';
271}
272
273if (false) {
274 print 'Does not get printed';
275} elseif(true) {
276 print 'Does';
277}
278
279// Тернарный оператор
280print (false ? 'Does not get printed' : 'Does');
281
282// сокращенная запись тернарного оператора с PHP 5.3
283// эквивалентно "$x ? $x : 'Does'"
284$x = false;
285print($x ?: 'Does');
286
287$x = 0;
288if ($x === '0') {
289 print 'Does not print';
290} elseif($x == '1') {
291 print 'Does not print';
292} else {
293 print 'Does print';
294}
295
296// Альтернативный синтаксис полезный для шаблонов
297?>
298
299<?php if ($x): ?>
300This is displayed if the test is truthy.
301<?php else: ?>
302This is displayed otherwise.
303<?php endif; ?>
304
305<?php
306
307// Использование switch.
308switch ($x) {
309 case '0':
310 print 'Switch использует неточное сравнение';
311 break; // вы должны использовать break, иначе PHP будет продолжать
312 // исполнять команды следующих секций case 'two' и 'three'
313 case 'two':
314 case 'three':
315 // делаем что-то, если $x == 'two' или $x == 'three'
316 break;
317 default:
318 // делаем что-то по умолчанию
319}
320
321// Циклы: while, do...while и for
322$i = 0;
323while ($i < 5) {
324 echo $i++;
325}; // печатает "01234"
326
327echo "\n";
328
329$i = 0;
330do {
331 echo $i++;
332} while ($i < 5); // печатает "01234"
333
334echo "\n";
335
336for ($x = 0; $x < 10; $x++) {
337 echo $x;
338} // печатает "0123456789"
339
340echo "\n";
341
342$wheels = ['bicycle' => 2, 'car' => 4];
343
344// Циклы foreach могут обходить массивы
345foreach ($wheels as $wheel_count) {
346 echo $wheel_count;
347} // Напечатает "24"
348
349echo "\n";
350
351// Вы можете обходить как ключи, так и их значения
352foreach ($wheels as $vehicle => $wheel_count) {
353 echo "A $vehicle has $wheel_count wheels";
354}
355
356echo "\n";
357
358$i = 0;
359while ($i < 5) {
360 if ($i === 3) {
361 break; // выйти из цикла while
362 }
363 echo $i++;
364} // Напечатает "012"
365
366for ($i = 0; $i < 5; $i++) {
367 if ($i === 3) {
368 continue; // пропустить текущую итерацию цикла
369 }
370 echo $i;
371} // печатает "0124"
372
373
374/********************************
375 * Функции
376 */
377
378// Определение функции:
379function my_function () {
380 return 'Hello';
381}
382
383echo my_function(); // => "Hello"
384
385// Правильное имя функции начинается с буквы или символа подчеркивания
386// и состоит из букв, цифр или символов подчеркивания.
387
388function add ($x, $y = 1) { // $y по умолчанию равно 1
389 $result = $x + $y;
390 return $result;
391}
392
393echo add(4); // => 5
394echo add(4, 2); // => 6
395
396// $result недоступен за пределами функции
397// print $result; // Выдает предупреждение
398
399// Начиная с PHP 5.3 вы можете объявлять анонимные функции:
400$inc = function ($x) {
401 return $x + 1;
402};
403
404echo $inc(2); // => 3
405
406function foo ($x, $y, $z) {
407 echo "$x - $y - $z";
408}
409
410// Функции могут возвращать функции
411function bar ($x, $y) {
412 // Используйте 'use' для передачи внешних переменных
413 return function ($z) use ($x, $y) {
414 foo($x, $y, $z);
415 };
416}
417
418$bar = bar('A', 'B');
419$bar('C'); // Prints "A - B - C"
420
421// Вы можете вызывать именованные функции используя строки
422$function_name = 'add';
423echo $function_name(1, 2); // => 3
424// Полезно для программного определения запущенной функции.
425// Или используйте call_user_func(callable $callback [, $parameter [, ... ]]);
426
427
428/********************************
429 * Включения
430 */
431
432<?php
433// PHP код внутри включаемого файла должен начинаться с тега PHP.
434
435include 'my-file.php';
436// Код в файле my-file.php теперь доступен в текущем пространстве имен.
437// Если файл не удалось подключить, то будет выдано предупреждение.
438
439include_once 'my-file.php';
440// Если код в файле my-file.php уже был подключен, он не будет подключен повторно.
441// Это предотвращает ошибку повторного подключения файла.
442
443require 'my-file.php';
444require_once 'my-file.php';
445
446// Действует так же как и include(), но если файл не удалось подключить,
447// функция выдает фатальную ошибку
448
449// Содержимое файла my-include.php:
450<?php
451
452return 'Anything you like.';
453// Конец файла
454
455// Эти функции могут также возвращать значения.
456$value = include 'my-include.php';
457
458// Имена файлов содержат их путь в файловой системе, или если передано просто
459// имя файла, PHP обращается к директиве include_path. Если файл не найден в
460// include_path, предпринимается попытка поиска в папке, где выполняется скрипт
461// или в текущей рабочей директории. Если не в одном из этих мест файл не
462// найден - выдается ошибка
463/* */
464
465/********************************
466 * Классы
467 */
468
469// Классы определяются при помощи ключевого слова "class"
470
471class MyClass
472{
473 const MY_CONST = 'value'; // Константа
474
475 static $staticVar = 'static';
476
477 // Свойства объявляются с указанием их видимости
478 public $property = 'public';
479 public $instanceProp;
480 protected $prot = 'protected'; // Свойство доступно только потомкам и самому классу
481 private $priv = 'private'; // Свойство доступно только самому классу
482
483 // Конструктор описывается с помощью __construct
484 public function __construct($instanceProp) {
485 // Доступ к экземпляру класса с помощью $this
486 $this->instanceProp = $instanceProp;
487 }
488
489 // Методы объявляются как функции принадлежащие классу
490 public function myMethod()
491 {
492 print 'MyClass';
493 }
494
495 final function youCannotOverrideMe()
496 {
497 }
498
499 public static function myStaticMethod()
500 {
501 print 'I am static';
502 }
503}
504
505echo MyClass::MY_CONST; // Выведет 'value';
506echo MyClass::$staticVar; // Выведет 'static';
507MyClass::myStaticMethod(); // Выведет 'I am static';
508
509// Создание нового экземпляра класса используя new
510$my_class = new MyClass('An instance property');
511
512// Если аргументы отсутствуют, можно не ставить круглые скобки
513
514// Доступ к членам класса используя ->
515echo $my_class->property; // => "public"
516echo $my_class->instanceProp; // => "An instance property"
517$my_class->myMethod(); // => "MyClass"
518
519// Наследование классов используя "extends"
520class MyOtherClass extends MyClass
521{
522 function printProtectedProperty()
523 {
524 echo $this->prot;
525 }
526
527 // Переопределение родительского метода
528 function myMethod()
529 {
530 parent::myMethod();
531 print ' > MyOtherClass';
532 }
533}
534
535$my_other_class = new MyOtherClass('Instance prop');
536$my_other_class->printProtectedProperty(); // => Выведет "protected"
537$my_other_class->myMethod(); // Выведет "MyClass > MyOtherClass"
538
539final class YouCannotExtendMe
540{
541}
542
543// Вы можете использовать "магические методы" для создания геттеров и сеттеров
544class MyMapClass
545{
546 private $property;
547
548 public function __get($key)
549 {
550 return $this->$key;
551 }
552
553 public function __set($key, $value)
554 {
555 $this->$key = $value;
556 }
557}
558
559$x = new MyMapClass();
560echo $x->property; // Будет использован метод __get()
561$x->property = 'Something'; // Будет использован метод __set()
562
563// Классы могут быть абстрактными (используя ключевое слово abstract)
564// или реализовывать интерфейсы (используя ключевое слово implements).
565// Интерфейсы определяются при помощи ключевого слова interface
566
567interface InterfaceOne
568{
569 public function doSomething();
570}
571
572interface InterfaceTwo
573{
574 public function doSomethingElse();
575}
576
577// Интерфейсы могут быть расширены
578interface InterfaceThree extends InterfaceTwo
579{
580 public function doAnotherContract();
581}
582
583abstract class MyAbstractClass implements InterfaceOne
584{
585 public $x = 'doSomething';
586}
587
588class MyConcreteClass extends MyAbstractClass implements InterfaceTwo
589{
590 public function doSomething()
591 {
592 echo $x;
593 }
594
595 public function doSomethingElse()
596 {
597 echo 'doSomethingElse';
598 }
599}
600
601// Классы могут реализовывать более одного интерфейса
602class SomeOtherClass implements InterfaceOne, InterfaceTwo
603{
604 public function doSomething()
605 {
606 echo 'doSomething';
607 }
608
609 public function doSomethingElse()
610 {
611 echo 'doSomethingElse';
612 }
613}
614
615
616/********************************
617 * Трейты
618 */
619
620// Трейты появились в PHP 5.4 и объявляются при помощи ключевого слова trait
621
622trait MyTrait
623{
624 public function myTraitMethod()
625 {
626 print 'I have MyTrait';
627 }
628}
629
630class MyTraitfulClass
631{
632 use MyTrait;
633}
634
635$cls = new MyTraitfulClass();
636$cls->myTraitMethod(); // Напечатает "I have MyTrait"
637
638
639/********************************
640 * Пространства имен
641 */
642
643// Это секция особая, ведь объявление пространства имен
644// должно быть самым первым в файле. Позвольте сделать вид, что это не так
645
646<?php
647
648// По умолчанию, классы существуют в глобальном пространстве имен и могут быть
649// вызваны с обратным слэшем.
650
651$cls = new \MyClass();
652
653// Задание пространства имен файла
654namespace My\Namespace;
655
656class MyClass
657{
658}
659
660// (из другого файла)
661$cls = new My\Namespace\MyClass;
662
663// Или внутри другого пространства имен.
664namespace My\Other\Namespace;
665
666use My\Namespace\MyClass;
667
668$cls = new MyClass();
669
670// Или вы можете создать псевдоним для пространства имен:
671namespace My\Other\Namespace;
672
673use My\Namespace as SomeOtherNamespace;
674
675$cls = new SomeOtherNamespace\MyClass();
676
677
678/**********************
679* Позднее статическое связывание.
680*
681*/
682
683class ParentClass
684{
685 public static function who()
686 {
687 echo "I'm a " . __CLASS__ . "\n";
688 }
689
690 public static function test()
691 {
692 // self ссылается на класс в котором определен метод.
693 self::who();
694 // static ссылается на класс в котором метод вызван.
695 static::who();
696 }
697}
698
699ParentClass::test();
700/*
701I'm a ParentClass
702I'm a ParentClass
703*/
704
705class ChildClass extends ParentClass
706{
707 public static function who()
708 {
709 echo "But I'm " . __CLASS__ . "\n";
710 }
711}
712
713ChildClass::test();
714/*
715I'm a ParentClass
716But I'm ChildClass
717*/
718
719
720/**********************
721* Магические константы
722*
723*/
724
725// Возвращает имя текущего класса. Должно быть использовано внутри класса.
726echo "Current class name is " . __CLASS__;
727
728// Возвращает полный путь текущей папки из которой вызван файл.
729echo "Current directory is " . __DIR__;
730
731 // Обычно используют в таких случаях:
732 require __DIR__ . '/vendor/autoload.php';
733
734// Возвращает полный путь к текущему файлу.
735echo "Current file path is " . __FILE__;
736
737// Возвращает имя текущей функции.
738echo "Current function name is " . __FUNCTION__;
739
740// Возвращает номер текущей линии.
741echo "Current line number is " . __LINE__;
742
743// Возвращает имя текущего метода. Возвращает только если вызван внутри метода.
744echo "Current method is " . __METHOD__;
745
746// Возвращает имя текущего пространства имен.
747echo "Current namespace is " . __NAMESPACE__;
748
749// Возвращает имя текущего трейта.
750// Возвращает только если используется внутри трейта.
751echo "Current namespace is " . __TRAIT__;
752
753
754/**********************
755* Обработка ошибок
756*
757*/
758
759// Простую обработку ошибок можно произвести с помощью try catch блока.
760
761try {
762 // Выполняем что-то
763} catch (Exception $e) {
764 // Обработка исключения
765}
766
767// При использовании try catch блока в области видимости, стоит использовать
768// следующий подход:
769
770try {
771 // Do something
772} catch (\Exception $e) {
773 // Обработка исключения
774}
775
776// Специальное (кастомное) исключение - exceptions
777
778class MyException extends Exception {}
779
780try {
781
782 $condition = true;
783
784 if ($condition) {
785 throw new MyException('Something just happened');
786 }
787
788} catch (MyException $e) {
789 // Обработка исключения
790}
Смотрите также: ¶
Посетите страницу официальной документации PHP для справки.
Если вас интересуют полезные приемы использования PHP посетите PHP The Right Way.
Если вы раньше пользовались языком с хорошей организацией пакетов, посмотрите Composer.
Для изучения стандартов использования языка посетите PHP Framework Interoperability Group’s PSR standards.