Php dapatkan nama kelas saat ini

PHP memiliki konstanta ajaib ::class_ yang menyelesaikan nama kelas menjadi nama kelas yang sepenuhnya memenuhi syarat. Saat digunakan dengan nama kelas, pernyataan use dan use as akan diselesaikan, atau namespace saat ini akan diawali yang membuatnya menjadi nama kelas yang sepenuhnya memenuhi syarat

Contoh


namespace App\Demos;

use Foo\Bar;
use Bar\Baz as BBaz;

class Demo {}

// `use` statement is resolved:
echo Bar::class; // "Foo\Bar"

// `use` X `as` Y is resolved:
echo BBaz::class; // "Bar\Baz"

// Current namespace is resolved:
echo Demo::class; // "App\Demos\Demo"

Sampai PHP8. 0, konstanta ajaib ::class_ tidak diizinkan pada objek

$object = new Foo\Bar();
echo $object::class;

// Fatal error: Cannot use ::class with dynamic class name.
_

Dengan PHP8. 0, sekarang Anda dapat menggunakan ::class konstanta pada objek, dan itu akan diselesaikan dengan benar saat dijalankan

$object = new Foo\Bar();
echo $object::class;

// PHP 8.0+:
// "Foo\Bar"

Hasil yang sama seperti $object = new Foo\Bar(); echo $object::class; // Fatal error: Cannot use ::class with dynamic class name._1

Konstanta ::class pada objek instantiated akan mengembalikan nilai pengembalian yang sama persis dengan panggilan

$object = new Foo\Bar();
echo $object::class;

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

get_class($object) === $object::class;

Non-objek tidak diperbolehkan

Menggunakan ::class_ pada non-objek tidak diperbolehkan

$object = array();
$object::class;

// Fatal error: Uncaught TypeError: Cannot use ::class on value of type array in ...:...
_

Jika Anda perlu mendapatkan jenis variabel apa pun, PHP 8. 0 hadir dengan fungsi

$object = new Foo\Bar();
echo $object::class;

// Fatal error: Cannot use ::class with dynamic class name.
_5 baru yang dapat Anda panggil untuk mendapatkan nama kelas, tipe skalar, tipe sumber daya, dll semuanya dari satu fungsi praktis

Dampak kompatibilitas mundur

Dalam versi PHP sebelum 8. 0, menggunakan ::class_ pada objek memicu kesalahan fatal. Karena PHP8. 0 meredakan kesalahan ini, ini seharusnya tidak menimbulkan masalah BC baru. Namun, ini akan membuat kode Anda memerlukan PHP 8. 0 untuk dijalankan tanpa cara untuk mengisi fungsionalitas ini ke versi yang lebih lama

Terkadang Anda harus bisa mendapatkan nama kelas atau nama kelas induk dari suatu objek di PHP untuk melakukan sesuatu secara kondisional, dll. Posting ini melihat bagaimana melakukan ini

Fungsi yang relevan adalah get_class() dan get_parent_class() dan keduanya dapat diberikan instance objek. Fungsi get_parent_class() juga bisa diberikan nama kelas. Keduanya kemudian akan mengembalikan nama kelas sebagai string

Sebagai contoh, kita memiliki dua kelas berikut

class foo {
}

class bar extends foo {
}
_

Kemudian kita membuat sebuah instance dari bar

$bar = new bar;
_

Kita bisa mendapatkan nama kelas dan nama kelas induk seperti itu

echo get_class($bar); // will echo 'bar'
echo get_parent_class($bar); // will echo 'foo'
echo get_parent_class('bar'); // will also echo 'foo'

Perhatikan bahwa meneruskan nama kelas sebagai string ke get_class() tidak akan mengembalikan nama kelas. Anda sudah tahu nama kelasnya jika Anda meneruskannya sebagai string sehingga tidak ada gunanya memanggilnya

Jika Anda memanggil fungsi dari dalam kelas itu sendiri, Anda dapat meneruskannya $this. Misalnya, kami akan mendefinisikan ulang kelas di atas sebagai berikut

Saya harus menyebutkan bahwa jika saya menjalankan tes hanya sekali (tidak ada iterasi, tetapi beberapa kali berjalan dan menghasilkan rata-rata), solusi substring adalah pemenang dalam kecepatan. (Ini mungkin karena refleksi di-cache)

Kita bisa mendapatkan nama kelas namespace yang memenuhi syarat dari suatu objek dengan menggunakan fungsi get_class(). Dengan asumsi bahwa kelas objek kita setidaknya memiliki namespace. Jika kita ingin mendapatkan nama kelasnya saja, kita bisa menggunakan kelas refleksi untuk mendapatkan nama pendek dari kelas tersebut

>>> get_class($obj);
=> "App\Models\Project"
>>> (new \ReflectionClass($obj))->getShortName();
=> "Project"

Pilihan lain adalah untuk benar-benar mendapatkan nama kelas objek dengan spasi nama yang memenuhi syarat dan mendapatkan nama kelas melalui manipulasi string

>>> end(explode('\\', get_class($obj)));
=> "Project"

Perhatikan bahwa kita perlu menghindari garis miring terbalik

Fungsi get_class() mendapatkan nama kelas dari suatu objek. Mengembalikan FALSE jika objek bukan objek. Jika objek dikecualikan saat berada di dalam kelas, nama kelas tersebut dikembalikan

Sintaksis

get_class(object)

Parameter

  • objek  − Objek yang diuji. Anda dapat menghindari parameter ini di dalam cass

Kembali

Fungsi get_class() mengembalikan nama kelas dari suatu objek. Mengembalikan FALSE jika objek bukan objek. Jika objek dikecualikan saat berada di dalam kelas, nama kelas tersebut dikembalikan