Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Jenis WeakReference dalam PHP8.0

Jenis WeakReference dalam PHP8.0

王林
王林asal
2023-05-14 08:07:35831semak imbas

Jenis WeakReference dalam PHP8.0

Dengan keluaran rasmi PHP8.0, kami telah membawa banyak ciri dan penambahbaikan baharu, salah satu peningkatan penting ialah penambahan jenis WeakReference. Bagi sesetengah pembangun PHP, jenis WeakReference mungkin masih merupakan konsep yang tidak dikenali Artikel ini akan memperkenalkan penggunaan dan kelebihan jenis baharu ini.

Apakah jenis WeakReference?

Pertama, kita perlu tahu apa itu rujukan. Dalam PHP, kita boleh menetapkan atau lulus pembolehubah dalam bentuk $var atau &$var, yang merupakan rujukan pembolehubah. Rujukan adalah berbeza daripada penyalinan Ia menunjuk kepada sekeping data yang sama dalam ingatan, iaitu, pembolehubah yang sama boleh mempunyai berbilang rujukan.

Sebagai contoh, pembolehubah $bar dalam kod berikut menunjukkan kepada pembolehubah $foo melalui rujukan:

$foo = 'Hello, world!';
$bar = &$foo;

Jika anda mengubah suai nilai $bar pada masa ini, anda akan mendapati bahawa nilai $foo juga berubah :

$bar = 'Goodbye, world!';
echo $foo; // 输出Goodbye, world!

Dalam PHP8.0, jenis baharu - WeakReference diperkenalkan. Perbezaan antara WeakReference dan rujukan biasa ialah ia adalah rujukan yang lemah dan tidak menghalang objek daripada dikitar semula oleh pemungut sampah. Maksudnya, apabila menggunakan WeakReference, walaupun objek telah dikitar semula, WeakReference tidak akan membuang pengecualian, tetapi mengembalikan null atau objek kosong.

Bagaimana untuk menggunakan jenis WeakReference?

Rujukan yang lemah biasanya digunakan dalam senario seperti caching dan pengurusan acara Di bawah kami menggunakan contoh untuk menggambarkan penggunaannya.

Pertama, kami mencipta kelas Pengguna untuk menyimpan maklumat id dan nama pengguna:

class User
{
    public $id;
    public $name;
    
    public function __construct($id, $name)
    {
        $this->id = $id;
        $this->name = $name;
    }
}

Seterusnya, kami mencipta kelas UserCache untuk menyimpan maklumat pengguna. Antaranya, kami menggunakan kelas SplObjectStorage untuk menyimpan WeakReference objek Pengguna:

class UserCache
{
    private SplObjectStorage $users;
    
    public function __construct()
    {
        $this->users = new SplObjectStorage();
    }
    
    public function addUser(User $user)
    {
        $this->users->attach(new WeakReference($user));
    }
    
    public function getUserById($id)
    {
        foreach ($this->users as $user) {
            if ($user->get()->id === $id) {
                return $user->get();
            }
        }
        
        return null;
    }
}

Dalam pembina, kami mencipta objek SplObjectStorage melalui SplObjectStorage() baharu untuk menyimpan WeakReference objek Pengguna. Dalam kaedah addUser, kami menukar objek Pengguna menjadi objek WeakReference melalui $newUser = new WeakReference($user) dan menambahnya ke SplObjectStorage. Dalam kaedah getUserById, kami merentasi semua objek WeakReference dalam SplObjectStorage dan menggunakan kaedah get() untuk mendapatkan objek Pengguna yang sepadan untuk menentukan sama ada ia sama dengan id sasaran.

Akhir sekali, mari kita uji penggunaan kelas UserCache:

$cache = new UserCache();

$user1 = new User(1, 'Alice');
$user2 = new User(2, 'Bob');

$cache->addUser($user1);
$cache->addUser($user2);

var_dump($cache->getUserById(1));
var_dump($cache->getUserById(2));

unset($user2);

var_dump($cache->getUserById(1));
var_dump($cache->getUserById(2));

Jalankan kod di atas dan anda akan mendapati bahawa selepas objek $user2 tidak ditetapkan, kaedah getUserById masih boleh berfungsi seperti biasa tanpa membuang pengecualian , sebaliknya mengembalikan nilai nol.

Ringkasan

Dalam PHP8.0, jenis WeakReference telah ditambahkan, yang merupakan rujukan yang lemah dan tidak akan menghalang objek daripada dikitar semula oleh pemungut sampah. Dengan menggunakan jenis WeakReference, kami boleh mengurus kitaran hayat objek dengan lebih baik dan meningkatkan kebolehpercayaan dan keteguhan kod. Jika anda ingin mengetahui lebih lanjut tentang jenis WeakReference, anda boleh menyemak penerangan terperinci dalam dokumentasi PHP rasmi.

Atas ialah kandungan terperinci Jenis WeakReference dalam PHP8.0. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn