<? phpukraine ДОКУМЕНТАЦІЯ
⌕Пошук по платформі
Документація українською

Переклад офіційної документації українською. Кожен розділ показує стан готовності: недоперекладене позначене відкрито, а не приховане.

МОВА · ПЕРЕКЛАДЕНО оновлено 7 вересня 2026

Класи й обʼєкти · PHP Manual

class

Базове означення класу починається з ключового слова class, за яким іде назва класу, а далі пара фігурних дужок, що містить означення властивостей і методів, які належать класу.

Назвою класу може бути будь-яка коректна мітка, якщо вона не є зарезервованим словом PHP. Починаючи з PHP 8.4.0, використання одинарного підкреслення _ як назви класу є застарілим. Коректна назва класу починається з літери або підкреслення, за якими йде будь-яка кількість літер, цифр чи підкреслень. Регулярним виразом це записується так: ^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$.

Клас може містити власні константи, змінні (їх називають «властивостями») і функції (їх називають «методами»).

Приклад: просте означення класу

<?php
class SimpleClass
{
    // оголошення властивості
    public $var = 'a default value';

    // оголошення методу
    public function displayVar() {
        echo $this->var;
    }
}
?>

Псевдозмінна $this доступна тоді, коли метод викликано в контексті обʼєкта. $this - це значення обʼєкта, що викликає метод.

Попередження

Статичний виклик нестатичного методу викидає Error. До PHP 8.0.0 це породжувало повідомлення про застарілість, а $this була невизначеною.

Приклад: кілька прикладів із псевдозмінною $this

<?php
class A
{
    function foo()
    {
        if (isset($this)) {
            echo '$this is defined (';
            echo get_class($this);
            echo ")\n";
        } else {
            echo "\$this is not defined.\n";
        }
    }
}

class B
{
    function bar()
    {
        A::foo();
    }
}

$a = new A();
$a->foo();

A::foo();

$b = new B();
$b->bar();

B::bar();
?>

Результат виконання цього прикладу в PHP 7:

$this is defined (A)

Deprecated: Non-static method A::foo() should not be called statically in %s  on line 27
$this is not defined.

Deprecated: Non-static method A::foo() should not be called statically in %s  on line 20
$this is not defined.

Deprecated: Non-static method B::bar() should not be called statically in %s  on line 32

Deprecated: Non-static method A::foo() should not be called statically in %s  on line 20
$this is not defined.

Результат виконання цього прикладу в PHP 8:

$this is defined (A)

Fatal error: Uncaught Error: Non-static method A::foo() cannot be called statically in %s :27
Stack trace:
#0 {main}
  thrown in %s  on line 27

Класи readonly

Починаючи з PHP 8.2.0, клас можна позначити модифікатором readonly. Позначення класу як readonly додає модифікатор readonly до кожної оголошеної властивості та забороняє створення динамічних властивостей. Ба більше, підтримку динамічних властивостей не вдасться додати через атрибут AllowDynamicProperties. Спроба зробити це спричинить помилку на етапі компіляції.

<?php
#[\AllowDynamicProperties]
readonly class Foo {
}

// Fatal error: Cannot apply #[AllowDynamicProperties] to readonly class Foo
?>

Оскільки ні нетипізовані, ні статичні властивості не можна позначити модифікатором readonly, класи readonly теж не можуть їх оголошувати:

<?php
readonly class Foo
{
    public $bar;
}

// Fatal error: Readonly property Foo::$bar must have type
?>
<?php
readonly class Foo
{
    public static int $bar;
}

// Fatal error: Readonly class Foo cannot declare static properties
?>

Клас readonly можна розширити тоді й лише тоді, коли дочірній клас теж є класом readonly.

new

Щоб створити екземпляр класу, потрібне ключове слово new. Обʼєкт створюється завжди, окрім випадку, коли клас має означений конструктор, який у разі помилки викидає виняток. Класи слід означувати до створення екземплярів (а подекуди це обовʼязкова вимога).

Якщо разом із new використати змінну, що містить string із назвою класу, буде створено новий екземпляр цього класу. Якщо клас лежить у просторі імен, у такому разі треба вказувати його повне кваліфіковане імʼя.

Зверніть увагу

Якщо конструктору класу не передають аргументів, дужки після назви класу можна опустити.

Приклад: створення екземпляра

<?php
class SimpleClass {
}

$instance = new SimpleClass();
var_dump($instance);

// Те саме можна зробити через змінну:
$className = 'SimpleClass';
$instance = new $className(); // new SimpleClass()
var_dump($instance);
?>

Починаючи з PHP 8.0.0, підтримується використання new з довільними виразами. Це дозволяє складніше створення екземплярів, якщо вираз повертає string. Вирази мають бути взяті в дужки.

Приклад: створення екземпляра за допомогою довільного виразу

У наведеному прикладі показано кілька коректних довільних виразів, що дають назву класу: виклик функції, конкатенацію рядків і константу ::class.

<?php

class ClassA extends \stdClass {}
class ClassB extends \stdClass {}
class ClassC extends ClassB {}
class ClassD extends ClassA {}

function getSomeClass(): string
{
    return 'ClassA';
}

var_dump(new (getSomeClass()));
var_dump(new ('Class' . 'B'));
var_dump(new ('Class' . 'C'));
var_dump(new (ClassD::class));
?>

Результат виконання цього прикладу в PHP 8:

object(ClassA)#1 (0) {
}
object(ClassB)#1 (0) {
}
object(ClassC)#1 (0) {
}
object(ClassD)#1 (0) {
}

У контексті класу новий обʼєкт можна створити через new self і new parent.

Якщо присвоїти вже створений екземпляр класу новій змінній, ця змінна звертатиметься до того самого екземпляра, що й присвоєний обʼєкт. Так само поводиться передавання екземплярів у функцію. Копію вже створеного обʼєкта можна отримати клонуванням.

Приклад: присвоєння обʼєкта

<?php
class SimpleClass {
    public string $var;
}

$instance = new SimpleClass();

$assigned   =  $instance;
$reference  =& $instance;

$instance->var = '$assigned will have this value';

$instance = null; // $instance і $reference стають null

var_dump($instance);
var_dump($reference);
var_dump($assigned);
?>

Результат виконання цього прикладу:

NULL
NULL
object(SimpleClass)#1 (1) {
  ["var"]=>
  string(30) "$assigned will have this value"
}

Створити екземпляри обʼєкта можна кількома способами:

Приклад: створення нових обʼєктів

<?php

class Test
{
    public static function getNew()
    {
        return new static();
    }
}

class Child extends Test {}

$obj1 = new Test(); // За назвою класу
$obj2 = new $obj1(); // Через змінну, що містить обʼєкт
var_dump($obj1 !== $obj2);

$obj3 = Test::getNew(); // Через метод класу
var_dump($obj3 instanceof Test);

$obj4 = Child::getNew(); // Через метод дочірнього класу
var_dump($obj4 instanceof Child);

?>

Результат виконання цього прикладу:

bool(true)
bool(true)
bool(true)

До члена щойно створеного обʼєкта можна звернутися в одному виразі:

Приклад: доступ до члена щойно створеного обʼєкта

<?php
echo (new DateTime())->format('Y'), PHP_EOL;

// починаючи з PHP 8.4.0 зовнішні дужки необовʼязкові
echo new DateTime()->format('Y'), PHP_EOL;
?>

Результат виконання цього прикладу схожий на:

2025
2025

Зверніть увагу

До PHP 7.1 аргументи не обчислювалися, якщо функція-конструктор не була означена.

Властивості та методи

Властивості й методи класу живуть в окремих «просторах імен», тож можна мати властивість і метод з однаковою назвою. Звертання до властивості й до методу має однаковий запис, а от що саме відбудеться - доступ до властивості чи виклик методу - залежить винятково від контексту, тобто від того, чи це звертання до змінної, чи виклик функції.

Приклад: доступ до властивості проти виклику методу

<?php
class Foo
{
    public $bar = 'property';
    
    public function bar() {
        return 'method';
    }
}

$obj = new Foo();
echo $obj->bar, PHP_EOL, $obj->bar(), PHP_EOL;

Результат виконання цього прикладу:

property
method

Це означає, що напряму викликати анонімну функцію, присвоєну властивості, не вийде. Натомість властивість треба спершу присвоїти, наприклад, змінній. Викликати таку властивість безпосередньо можна, взявши її в дужки.

Приклад: виклик анонімної функції, збереженої у властивості

<?php
class Foo
{
    public $bar;
    
    public function __construct() {
        $this->bar = function() {
            return 42;
        };
    }
}

$obj = new Foo();

echo ($obj->bar)(), PHP_EOL;

Результат виконання цього прикладу:

42

extends

Клас може успадкувати константи, методи й властивості іншого класу за допомогою ключового слова extends в оголошенні класу. Успадкувати кілька класів неможливо; клас успадковується лише від одного базового класу.

Успадковані константи, методи й властивості можна перевизначити, оголосивши їх повторно з тією самою назвою, що й у батьківському класі. Проте якщо батьківський клас означив метод чи константу як final, перевизначити їх не можна. Доступ до перевизначених методів або статичних властивостей можливий через звертання parent::.

Зверніть увагу

Починаючи з PHP 8.1.0, константи можна оголошувати як final.

Приклад: просте успадкування класу

<?php
class SimpleClass
{
    function displayVar()
    {
        echo "Parent class\n";
    }
}

class ExtendClass extends SimpleClass
{
    // Перевизначаємо батьківський метод
    function displayVar()
    {
        echo "Extending class\n";
        parent::displayVar();
    }
}

$extended = new ExtendClass();
$extended->displayVar();
?>

Результат виконання цього прикладу:

Extending class
Parent class

Правила сумісності сигнатур

Коли метод перевизначають, його сигнатура має бути сумісною з батьківським методом. Інакше буде фатальна помилка, а до PHP 8.0.0 - помилка рівня E_WARNING. Сигнатура сумісна, якщо вона дотримується правил варіантності, робить обовʼязковий параметр необовʼязковим, додає лише нові необовʼязкові параметри й не звужує, а тільки послаблює видимість. Це відомо як принцип підстановки Лісков (Liskov Substitution Principle, або скорочено LSP). Конструктор і private-методи звільнені від цих правил сумісності сигнатур, тож у разі розбіжності сигнатур фатальної помилки не буде.

Приклад: сумісні дочірні методи

<?php

class Base
{
    public function foo(int $a) {
        echo "Valid\n";
    }
}

class Extend1 extends Base
{
    function foo(int $a = 5)
    {
        parent::foo($a);
    }
}

class Extend2 extends Base
{
    function foo(int $a, $b = 5)
    {
        parent::foo($a);
    }
}

$extended1 = new Extend1();
$extended1->foo();
$extended2 = new Extend2();
$extended2->foo(1);

Результат виконання цього прикладу:

Valid
Valid

Наступні приклади показують, що дочірній метод, який прибирає параметр або робить необовʼязковий параметр обовʼязковим, несумісний із батьківським методом.

Приклад: фатальна помилка, коли дочірній метод прибирає параметр

<?php

class Base
{
    public function foo(int $a = 5) {
        echo "Valid\n";
    }
}

class Extend extends Base
{
    function foo()
    {
        parent::foo(1);
    }
}

Результат виконання цього прикладу в PHP 8 схожий на:

Fatal error: Declaration of Extend::foo() must be compatible with Base::foo(int $a = 5) in /in/evtlq on line 13

Приклад: фатальна помилка, коли дочірній метод робить необовʼязковий параметр обовʼязковим

<?php

class Base
{
    public function foo(int $a = 5) {
        echo "Valid\n";
    }
}

class Extend extends Base
{
    function foo(int $a)
    {
        parent::foo($a);
    }
}

Результат виконання цього прикладу в PHP 8 схожий на:

Fatal error: Declaration of Extend::foo(int $a) must be compatible with Base::foo(int $a = 5) in /in/qJXVC on line 13

Попередження

Перейменування параметра методу в дочірньому класі не є несумісністю сигнатур. Проте так робити не варто, бо це призведе до Error під час виконання, якщо використовуються іменовані аргументи.

Приклад: помилка при використанні іменованих аргументів, коли параметри перейменовано в дочірньому класі

<?php

class A {
    public function test($foo, $bar) {}
}

class B extends A {
    public function test($a, $b) {}
}

$obj = new B;

// Передаємо параметри згідно з контрактом A::test()
$obj->test(foo: "foo", bar: "bar"); // ERROR!

Результат виконання цього прикладу схожий на:

Fatal error: Uncaught Error: Unknown named parameter $foo in /in/XaaeN:14
Stack trace:
#0 {main}
  thrown in /in/XaaeN on line 14

::class

Ключове слово class також використовується для розвʼязання назви класу. Щоб отримати повне кваліфіковане імʼя класу ClassName, використовуйте ClassName::class. Це особливо зручно з класами в просторах імен.

Приклад: розвʼязання назви класу

<?php
namespace NS {
    class ClassName {
    }
    
    echo ClassName::class;
}
?>

Результат виконання цього прикладу:

NS\ClassName

Зверніть увагу

Розвʼязання назви класу через ::class - це перетворення на етапі компіляції. Тобто на момент створення рядка з назвою класу автозавантаження ще не відбувалося. Як наслідок, назви класів розгортаються навіть тоді, коли класу не існує. Помилки в такому разі не буде.

Приклад: розвʼязання назви неіснуючого класу

<?php
print Does\Not\Exist::class;
?>

Результат виконання цього прикладу:

Does\Not\Exist

Починаючи з PHP 8.0.0, ::class можна застосовувати й до обʼєктів. Таке розвʼязання відбувається під час виконання, а не компіляції. Ефект такий самий, як від виклику get_class() для обʼєкта.

Приклад: розвʼязання назви обʼєкта

<?php
namespace NS {
    class ClassName {
    }

    $c = new ClassName();
    print $c::class;
}
?>

Результат виконання цього прикладу:

NS\ClassName

Nullsafe-методи та властивості

Починаючи з PHP 8.0.0, до властивостей і методів можна звертатися ще й «nullsafe»-оператором: ?->. Nullsafe-оператор працює так само, як доступ до властивості чи методу вище, з тією різницею, що коли обʼєкт, який розіменовують, дорівнює null, повернеться null, а не буде викинуто виняток. Якщо розіменування є частиною ланцюжка, решта ланцюжка пропускається.

Ефект схожий на те, якби кожне звертання спершу загорнули в перевірку is_null(), але запис компактніший.

Приклад: nullsafe-оператор

<?php

// Починаючи з PHP 8.0.0, цей рядок:
$result = $repository?->getUser(5)?->name;

// Еквівалентний такому блоку коду:
if (is_null($repository)) {
    $result = null;
} else {
    $user = $repository->getUser(5);
    if (is_null($user)) {
        $result = null;
    } else {
        $result = $user->name;
    }
}
?>

Зверніть увагу

Nullsafe-оператор найкраще підходить там, де null вважається допустимим і очікуваним значенням властивості або результату методу. Щоб сигналізувати про помилку, краще викинути виняток.

Стан перекладу

Перекладаємо з офіційної документації, розділ за розділом, і не ховаємо недоперекладене. Помітили неточність у терміні чи реченні: напишіть, виправимо.

48%
Готовності
1
У роботі
15
Ще не перекладено
Глосарій термінів