Klasszikus ::class

Klasszikus ::class

Az a csodálatos feladat hárult rám, hogy értesítsem az itt egybegyűlteket a PHP-s hírekről, újdonságokról, és egyéb finomságokról. És valljuk be, ez számomra nem esik túl távol.

Mivel ez az első ilyen jellegű – és amúgy globálisan is első – bejegyzésem, ezért engedjetek meg egy átfogó bemutatást, majd csapjunk is bele a lecsóba.

Kétféle feladatot érzek feladatomnak téma keretein belül. Egyrészt, hogy a lehető legfrissebben tartsam a Kedves Olvasók ismereteit a PHP újdonságait illetőleg, másrészt, egyfajta evangelizáció jelleggel, a nem túl új, de mégis a nyelv történetéből fakadóan esetleg szokatlan, vagy jelentős újításokat is megfelelően bemutassam.

Mivel éppen egy főverzió előkészületei folynak a PHP háza táján, ezért egész ütemesen érkeznek a kisebb-nagyobb újdonságok, így először ezekkel kezdeném bemelegítés gyanánt.

::class

A PHP5.5 óta használható a ::class nevű konstans. A használata a következő:``

1
echo NAMESPACE\CLASS::class;

Ami szimplán kiírja az osztály “fully qualified”, azaz a gyökér névtértől kezdve felbontott, teljesen egyedi nevét.

Előnye, hogy mivel egy osztály konstans akkor is tökéletesen használható, ha “beuse-olt”, vagy névtéren belüli osztályoknál alkalmazzuk:

1
2
3
4
5
6
7
8
<?php

namespace App;

use App\Repository\User as UserRepository;

echo User::class . PHP_EOL; // kiírja az "App\User" stringet
echo UserRepository::class . PHP_EOL; // kiírja az "App\Repository\User" stringet

3v4l.org

A szintaktika teljesen megegyezik az osztály konstansok elérésével, így sokakban felmerült az igény, hogy a többi konstanshoz hasonlóan az osztály példányain keresztül, az objektumokon keresztül is elérhető legyen.

1
2
3
4
5
6
7
8
9
10
11
<?php

class Foo {

    public const Bar = 'baz';

}

$object = new Foo();

echo Foo::Bar . ' - ' . $object::Bar . PHP_EOL; // Kiírja: "baz - baz"

3v4l.org

Viszont, ha a következő sort hozzátesszük a kódhoz:

1
echo $object::class;

Akkor már a következő hibaüzenetet kapjuk:

1
Fatal error: Cannot use ::class with dynamic class name

Ebből két dolog következik:

  • Ha eddig nem tudtuk volna: a konstansokat compile time kezeli a PHP is – mint a nyelvek többsége –, így az egész szkriptünk hibára fut, mielőtt megkezdődne a futás (Ez egyébként nem 100%-ban igaz, erről majd beszélünk később)
  • Az objektumokon keresztül nem érhető el ez a – nevezzük így – “pszeudo konstans”

$object::class

Egy minap elfogadott RFC alapján a PHP 8.0-ban ez a fenti hibaüzenet eltűnik, és használhatóvá válik ez a rövid megoldás.

Gyakorlatilag felcserélhető lesz a

1
get_class($object);

hívással.

A funkcionalitás bővítése mögötti indokok:

  • egyrészt, ahogy azt zárójelesen megjegyeztem, már eleve voltak esetek, amikor nem compile time kellett feloldani a konstansokra való hivatkozást, így megvolt a helye az implementációnak
  • másrészt szintaktikailag egységesebb, konzisztensebb képet mutat ennek a funkciónak a megjelenése.

A kezdeményezés egyhangú igen szavazással kerül be a következő verzióba.

comments powered by Disqus