
https://www.youtube.com/watch?v=48_IHA8DKBS
Salah satu fitur yang lebih menarik yang ditambahkan ke PHP 8.4 adalah membuat objek malas. Objek malas memungkinkan kita untuk menunda inisialisasi objek sampai salah satu atributnya. Untuk aplikasi CRUD rata -rata, ini mungkin bukan orang yang mengubah aturan permainan, tetapi ini dapat membuat kita beberapa perubahan luar biasa pada kode.
Dalam artikel ini, kita akan membahas objek malas mana dan cara menggunakannya di PHP 8.4.
Apa itu objek malas/inisialisasi kemalasan
Inisialisasi malas objek adalah strategi, di mana inisialisasi objek ditunda untuk kebutuhan pertama, tidak seperti normal seperti itu. Ini mungkin membantu dalam beberapa kasus, tetapi contoh favorit saya adalah bahwa ketika kita memiliki sejumlah besar objek inisialisasi mahal, kita mungkin tidak selalu menggunakan semua objek dalam set.
Misalnya, kami memiliki kelas yang terhubung ke layanan, sehingga kami dapat mengambil beberapa nilai. Kami mungkin beredar melalui koleksi semacam itu untuk menemukan objek “benar” sesuai dengan nilai. Jika ada 100 proyek dalam array kami, kami akan melakukan 100 operasi lambat, tetapi kami hanya akan membuang jumlah besar tanpa benar -benar menggunakannya.
class InternetItems
{
public function __construct()
{
echo "Making connection to external service", PHP_EOL;
}
public function getValueFromService(): int
{
// this "mocks" the call to the service
return rand(1, 100);
}
}
$items = InternetItems::get();
foreach ($items as $item) {
if ($item->getValueFromService() == 50) {
return $item;
}
}
Yang ingin kami lakukan adalah menunda koneksi dengan layanan eksternal, karena mungkin sangat lambat.
Sebelum 8.4, Anda dapat mengimplementasikan fungsi ini dalam kode Userland secara tipis atau tidak. __construct()
Metode ini kemudian ditambahkan ke kelas kami untuk menginisialisasi koneksi sebelum penggunaan pertama.
// No
class UserlandLazy
{
public function initConnection():void
{
echo "Making connection to external service", PHP_EOL;
}
public function getValueFromService(): int
{
$this->initConnection();
return rand(1, 100);
}
}
Ini tidak apa -apa, tetapi kita harus dengan hati -hati memastikan bahwa nilai -nilai ini selalu diinisialisasi sebelum menggunakannya, dan dapat mencapai tarif karena kita dapat menelepon initConnection()
berulang-kali. Ini layak, tetapi ini jauh dari solusi yang baik. Untungnya, jika kami menggunakan PHP 8.4 atau versi yang lebih tinggi, kami memiliki pilihan yang lebih baik.
Apa itu objek malas PHP?
Objek Lazy muncul di PHP 8.4 dirilis pada November 2024.
PHP 8.4 memberikan dukungan untuk dua strategi objek malas: objek hantu dan agen virtual.
Dalam dua strategi ini, objek kemalasan melekat pada perangkat inisialisasi. Objek hantu yang malas tidak berbeda dari objek yang tidak berbau. Agen malas juga transparan, kecuali fakta bahwa agen dan contoh -contoh sebenarnya memiliki identitas yang berbeda. Kami akan menunjukkan contoh nanti.
Perubahan bahasa yang sebenarnya menambahkan metode baru ke metode baru ReflectionClass
Dan ReflectionProperty
Dapat membuat kami membuat kelas yang tidak menyebut objeknya __construct()
Metode sampai atribut akses. Ini termasuk atribut yang tidak ada, yang seharusnya tidak menjadi masalah, tetapi mungkin kembali menggigit Anda.
Contoh hantu
Untuk menggunakan fungsi ini, pertama -tama kita perlu mendefinisikan kursus kita dengan cara yang ingin kita gunakan. Ini termasuk konstruktor yang dapat menghubungkan layanan eksternal dan kemudian memuat minat yang menarik. Untuk membuat contohnya sederhana, saya akan memalsukannya dan menghasilkan nomor acak.
class PhpLazy
{
public string $valueFromService;
public function __construct()
{
echo "Making connection to external service", PHP_EOL;
$this->valueFromService = rand(1, 100);
}
}
Selanjutnya, kami akan menggunakan ReflectionClass
Cara menggunakan definisi newLazyGhost()
Fungsi.
$reflectionClass = new ReflectionClass(PhpLazy::class);
$phpLazyObject = $reflectionClass->newLazyGhost(function (PhpLazy $object) {
// Initialize object here
$object->__construct();
});
Kemudian kita dapat menggunakannya seperti contoh ruang kelas lainnya.
// This doesn't trigger initialization
var_dump($phpLazyObject);
var_dump(get_class($phpLazyObject));
// Accessing property triggers initialization
var_dump($phpLazyObject->valueFromService);
var_dump($phpLazyObject);
Outputnya adalah sebagai berikut (fungsi “Run Code” baru dari php.net) 🙂
lazy ghost object(PhpLazy)#3 (0) {
["valueFromService"]=>
uninitialized(string)
}
string(7) "PhpLazy"
Making connection to external service
string(2) "86"
object(PhpLazy)#3 (1) {
["valueFromService"]=>
string(2) "45"
}
Harap dicatat bahwa sebelum memicu inisialisasi var_dump($phpLazyObject)
Tunjukkan “objek hantu malas” sebagai tipe, tetapi kemudian ditampilkan PhpLazy
Sebagai tipe.
Contoh proxy
Agen penciptaan sangat mirip dengan contoh hantu kita, kecuali untuk kita gunakan newLazyProxy()
Fungsi dan instance baru kelas.
$reflectionClass = new ReflectionClass(PhpLazy::class);
$phpLazyObject = $reflectionClass->newLazyProxy(function (PhpLazy $object) {
// Create and return the real instance
return new PhpLazy();
});
Kemudian, kita bisa menggunakannya seperti sebelumnya.
var_dump($phpLazyObject);
var_dump(get_class($phpLazyObject));
// Triggers initialization
var_dump($phpLazyObject->valueFromService);
var_dump($phpLazyObject);
Dan dapatkan output.
lazy proxy object(PhpLazy)#3 (0) {
["valueFromService"]=>
uninitialized(string)
}
string(7) "PhpLazy"
Making connection to external service
string(1) "4"
lazy proxy object(PhpLazy)#3 (1) {
["instance"]=>
object(PhpLazy)#4 (1) {
["valueFromService"]=>
string(1) "4"
}
}
Harap dicatat bahwa sebelum memicu inisialisasi var_dump($phpLazyObject)
Tunjukkan “objek yang dipercayakan malas” sebagai jenisnya, tetapi setelah kami memicu inisialisasi, itu masih menggunakan “objek agen malas” sebagai jenisnya, tetapi ini PhpLazy
Menghadiri kelas instance
milik. Di sini, kita perlu menyadari perbedaan antara hantu dan versi agen.
Apa yang Perlu Anda Ketahui
- PHP 8.4 telah menambahkan dukungan untuk membuat objek malas
- Objek kemalasan hantu tidak berbeda dengan objek yang tidak berbau
- Agen malas memiliki identitas yang berbeda dengan objek yang tidak berbau