Composer va PSR standartlari: zamonaviy PHP loyihani sozlash
Amaliyot3 daqInnovialabs tahririyati
Qisqacha
Zamonaviy PHP loyiha composer.json’dan boshlanadi: Composer bog‘liqliklarni o‘rnatadi va PSR-4 autoload beradi, PHP-CS-Fixer va PHPStan esa PSR-12 uslubini saqlab, xatolarni ishga tushirishdan oldin topadi.
Zamonaviy PHP loyiha nimalardan iborat
Har qanday loyihani boshlashga arziydigan minimal to‘plam:
- Composer — bog‘liqliklar menejeri va klasslar autoloader’i.
- PSR-4 — klass nomini fayl yo‘liga moslashtiruvchi qoida.
- PSR-12 — umumiy kod uslubi, shunda istalgan dasturchi loyihani ko‘nikmasdan o‘qiydi.
- PHP-CS-Fixer — kodni avtomatik ravishda uslubga keltiradi.
- PHPStan — statik tahlil: kodni ishga tushirmasdan tip xatolari va imlo xatolarini topadi.
PSR — PHP-FIG guruhining tavsiyalari bo‘lib, ularni ko‘pchilik freymvork va kutubxonalar qo‘llab-quvvatlaydi.
1-qadam. composer.json
Loyihani composer init buyrug‘i bilan yarating yoki faylni qo‘lda yozing:
{
"name": "acme/shop",
"type": "project",
"require": {
"php": ">=8.2"
},
"require-dev": {
"phpstan/phpstan": "^2.0",
"friendsofphp/php-cs-fixer": "^3.0"
},
"autoload": {
"psr-4": { "Acme\\Shop\\": "src/" }
},
"autoload-dev": {
"psr-4": { "Acme\\Shop\\Tests\\": "tests/" }
},
"config": {
"sort-packages": true
}
}
Asosiy jihatlar:
- require — production uchun kerak bo‘lgan narsalar; require-dev — ishlab chiqish vositalari.
requireda PHP versiyasini ko‘rsating: Composer mos kelmaydigan paketlarni o‘rnatishga yo‘l qo‘ymaydi.- Ilovalar uchun composer.lockni repozitoriyga commit qiling. U aniq versiyalarni qayd etadi va hammada bir xil yig‘iladi.
- Serverda bog‘liqliklarni
composer install --no-dev --optimize-autoloaderbuyrug‘i bilan o‘rnating.
2-qadam. PSR-4 bo‘yicha autoload
PSR-4 namespace’ni papka bilan bog‘laydi. Yuqoridagi sozlamada Acme\Shop\Order\Invoice klassi src/Order/Invoice.phpda joylashishi kerak:
<?php
declare(strict_types=1);
namespace Acme\Shop\Order;
final class Invoice
{
public function __construct(
private readonly int $amount,
) {
}
}
Autoloader’ni kirish nuqtasida bir marta ulang:
require __DIR__ . '/../vendor/autoload.php';
autoload bo‘limini o‘zgartirgandan keyin composer dump-autoloadni bajaring. Fayl va papka nomlaridagi harf registri klass nomiga aynan mos kelishi kerak: Linux serverda invoice.php va Invoice.php — turli fayllar.
3-qadam. Kod uslubi: PSR-12 va PHP-CS-Fixer
PSR-12 chekinishlar, qavslar joylashuvi, use tartibi va tip e’lonlarini tavsiflaydi. Uni yodlash shart emas — buni PHP-CS-Fixer bajaradi. .php-cs-fixer.dist.php konfiguratsiyasi:
<?php
$finder = PhpCsFixer\Finder::create()
->in([__DIR__ . '/src', __DIR__ . '/tests']);
return (new PhpCsFixer\Config())
->setRules(['@PSR12' => true])
->setFinder($finder);
Buyruqlar:
vendor/bin/php-cs-fixer fix— kodni tuzatish;vendor/bin/php-cs-fixer fix --dry-run --diff— faqat buzilishlarni ko‘rsatish (CI uchun).
@PSR12 qoidalar to‘plamini PSR-12’ni rivojlantiruvchi yangiroq @PER-CS bilan almashtirish mumkin.
4-qadam. Statik tahlil: PHPStan
PHPStan tiplarni, mavjud bo‘lmagan metodlarni va noto‘g‘ri argumentlarni tekshiradi. phpstan.neon fayli:
parameters:
level: 6
paths:
- src
- tests
Ishga tushirish: vendor/bin/phpstan analyse.
Og‘riqsiz joriy qilish:
- Yangi loyihada yuqori qat’iylik darajasidan boshlang.
- Eski loyihada past darajadan boshlab, asta-sekin oshiring yoki joriy xatolarni baselinega saqlang (
--generate-baseline) va faqat yangilarini taqiqlang.
5-qadam. Skriptlar va CI
Buyruqlarni composer.json’ning scripts bo‘limiga yig‘ing:
"scripts": {
"cs": "php-cs-fixer fix --dry-run --diff",
"stan": "phpstan analyse",
"check": ["@cs", "@stan"]
}
Endi composer check dasturchida ham, CI’da ham bir xil ishga tushadi. Uslub buzilishi va tahlil xatolarida to‘xtaydigan pipeline har qanday kelishuvdan ishonchliroq.
Ko‘p uchraydigan xatolar
- composer.lock commit qilinmaydi — serverda paketlarning boshqa versiyalari o‘rnatiladi.
- vendor/ ichidagi kod tahrirlanadi — o‘zgarishlar keyingi o‘rnatishda yo‘qoladi.
- Namespace va yo‘l mos kelmaydi — klass faqat production’da topilmaydi.
- Eski kodda tahlil maksimal darajaga qo‘yiladi — minglab xatolar chiqadi va vosita o‘chirib qo‘yiladi.