php.md

Личный сайт Go-разработчика из Казани

Этот документ описывает версию 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.