Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 27 additions & 26 deletions src/php/uncategorized.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,18 @@

## PSR-0 vs PSR-4

Here are the major differences,
Вот основные различия,

**1.** For example if you define that the `Acme\Foo\` namespace is anchored in `src/`,
- with PSR-0 it means it will look for `Acme\Foo\Bar` in `src/Acme/Foo/Bar.php`
- while in PSR-4 it will look for `Acme\Foo\Bar` in `src/Bar.php(where Bar class is)`.
**2.** PSR-4 does not convert underscores to directory separators
**3.** You would prefer using PSR-4 with namespaces
**4.** PSR-0 will not work even if the class name is different from file name, like considering above example:
**1.** Например, если определяем, что пространство имен `Acme\Foo\` привязано к `src/`, то класс Acme\Foo\Bar будет искаться:
- по PSR-0: в `src/Acme/Foo/Bar.php`
- по PSR-4: в `src/Bar.php`

- `Acme\Foo\Bar` ---> `src/Acme/Foo/Bar.php` (for Bar class) will work
- `Acme\Foo\Bar` ---> `src/Acme/Foo/Bar2.php` (for Bar class) will not work
**2.** PSR-4 не преобразует подчеркивания в разделители каталогов
**3.** Вы предпочтете использовать PSR-4 с пространствами имен
**4.** PSR-0 не будет работать, если имя класса отличается от имени файла, рассматривая вышеприведенный пример:

- `Acme\Foo\Bar` ---> `src/Acme/Foo/Bar.php` (для класса Bar) будет работать
- `Acme\Foo\Bar` ---> `src/Acme/Foo/Bar2.php` (для класса Bar) не будет работать


## Замыкания и лямда функции
Expand All @@ -39,7 +40,7 @@ Here are the major differences,

Анонимные функции реализуются с использованием класса [Closure](http://php.net/manual/ru/class.closure.php).

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

```php
$message = 'привет';
Expand Down Expand Up @@ -71,8 +72,8 @@ $example();
`composer install` делает следующее:

- Проверяет, существует ли `composer.lock`
- если нет, резолвит зависимости и создаёт его
- если `composer.lock` существует, устанавливает версии, указанные в нём
- Если нет, резолвит зависимости и создаёт его
- Если `composer.lock` существует, устанавливает версии, указанные в нём

`composer update`:

Expand All @@ -83,10 +84,10 @@ $example();

`composer require somePackage`:

For example if we want to add a dependency with the command line we will simply execute
Выполняем если хотим добавить зависимость через командную строку

- composer.json file will be modified automatically and the new dependency will be added
- the dependency will be downloaded to the project
- `composer.json` будет изменен автоматически, добавится новая зависимость
- Зависимость будет загружена в проект
- http://php.net/manual/ru/class.splsubject.php

### Варианты ограничений версий для composer.json
Expand Down Expand Up @@ -145,7 +146,7 @@ session.save_path = «tcp://192.1680.10:11211, tcp://192.168.0.20:11211»

## Как выполнить код после exit?

You can use [register_shutdown_function()](http://www.php.net/register_shutdown_function) to set a callback function which will be executed when PHP exits.
Мы можем использовать функцию [register_shutdown_function()](http://www.php.net/register_shutdown_function) для задания callback-функции, которая будет выполнена при завершении выполнения скрипта PHP.

## Отладка и профилировка

Expand All @@ -159,11 +160,11 @@ You can use [register_shutdown_function()](http://www.php.net/register_shutdown_
- [PHP-CS-Fixer](https://github.com/FriendsOfPHP/PHP-CS-Fixer)
- [phan](https://github.com/phan/phan)

## Сегфолт в пхп фпм, как поймать, как отловить трейс
## Сегфолт в php fpm, как поймать, как отловить трейс

**Ошибка сегментации** ([англ.](https://ru.wikipedia.org/wiki/%D0%90%D0%BD%D0%B3%D0%BB%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA) Segmentation fault, сокр. segfault, жарг. *сегфолт*) — ошибка, возникающая при попытке обращения к недоступным для записи участкам [памяти](https://ru.wikipedia.org/wiki/%D0%92%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D1%8C) либо при попытке изменить память запрещённым способом

## Список модулей пхп
## Список модулей php

`php -m`

Expand All @@ -183,7 +184,7 @@ SPL предоставляет ряд стандартных структур д

## declare(strict_types=1);

By default, PHP will cast values of the wrong type into the expected scalar type if possible. For example, a function that is given an integer for a parameter that expects a string will get a variable of type string.
По умолчанию PHP приводит значения неподходящего типа к ожидаемому скалярному типу, где это возможно. Например, если функция получает в качестве аргумента целое число, тогда как ожидается строка, это значение будет приведено к строковому типу.

В случае включенного строгого режима будут фаталы при несовпадении типов. Строгий режим действует ТОЛЬКО внутри того файла, где он был объявлен.

Expand Down Expand Up @@ -297,25 +298,25 @@ received signal 15

## Получить тело HTTP запроса в PHP

To access the entity body of a POST or PUT request (or any other HTTP method):
Для получения тела запроса при использовании POST, PUT или любого другого метода:

```php
$entityBody = file_get_contents('php://input');
```

Also, the `STDIN` constant is an already-open stream to `php://input`, so you can alternatively do:
Альтернативно, вместо `php://input` можно использовать уже открытый поток с помощью константы `STDIN`:

```php
$entityBody = stream_get_contents(STDIN);
```

From the [PHP manual entry on I/O streams*docs*](http://php.net/manual/en/wrappers.php.php):
Согласно официальной документации [PHP о потоках ввода/вывода](http://php.net/manual/en/wrappers.php.php):

> *php://input* is a read-only stream that allows you to read raw data from the request body. In the case of POST requests, it is preferable to use *php://input* instead of `$HTTP_RAW_POST_DATA` as it does not depend on special php.ini directives. Moreover, for those cases where`$HTTP_RAW_POST_DATA` is not populated by default, it is a potentially less memory intensive alternative to activating always_populate_raw_post_data. *php://input* is not available with enctype="multipart/form-data".
> `php://input` предоставляет доступ только для чтения к сырому телу запроса. В случае POST-запроса предпочтительнее использовать `php://input` вместо устаревшего `$HTTP_RAW_POST_DATA`, так как он не зависит от дополнительных директив в `php.ini`. Кроме того, если переменная `$HTTP_RAW_POST_DATA` не инициализируется по умолчанию, `php://input` предлагает более экономичный с точки зрения потребления памяти способ работы с телом запроса. Обратите внимание, что `php://input` недоступен, при использовании enctype="multipart/form-data".

Specifically you'll want to note that the `php://input` stream, regardless of how you access it in a web SAPI, *is not seekable*. This means that it can only be read once. If you're working in an environment where large HTTP entity bodies are routinely uploaded you may wish to maintain the input in its stream form (rather than buffering it like the first example above).
Поток `php://input` (независимо от способа обращения к нему в рамках web SAPI) — это неперематываемый (non-seekable) поток. Это означает, что он может быть прочитан только один раз. Если вы работаете в окружении, где часто загружаются большие тела HTTP-запросов, рекомендуется сохранить поток в его исходной форме (в виде stream ресурса), а не буферизовать его полностью, как это делается в первом примере.

To maintain the stream resource something like this can be helpful:
Для сохранения ресурса потока может быть полезно:

```php
<?php
Expand All @@ -330,7 +331,7 @@ function detectRequestBody() {
}
```

`php://temp` allows you to manage memory consumption because it will transparently switch to filesystem storage after a certain amount of data is stored (2M by default). This size can be manipulated in the php.ini file or by appending `/maxmemory:NN`, where `NN` is the maximum amount of data to keep in memory before using a temporary file, in bytes.
`php://temp` позволяет управлять потреблением памяти, поскольку при достижении определённого порога (по умолчанию 2 МБ) он автоматически начинает использовать временное хранилище на диске. Объём памяти, доступный до переключения на диск, можно задать в настройках php.ini или указать явно в пути: `/maxmemory:NN`, где `NN` — максимальный объём в байтах, сохраняемый в памяти перед переключением на файл.

## Трейты

Expand Down