2016-01-13 18 views
6
<?php 

$s = "foobar"; 

$t = $s; 

$u = $s; 

echo PHP_VERSION . "\n"; 

debug_zval_dump($s); 

xdebug_debug_zval('s'); 

Run trong PHP 5.6.16Lẫn lộn về PHP 7 refcount

php 5 refcount

Run trong PHP 7.0.2

php 7 refcount

Tôi nghĩ rằng kết quả (PHP 7) nên là:

string(6) "foobar" refcount(4) 
s: (refcount=3, is_ref=0)="foobar" 

Tôi tự hỏi điều gì tạo ra sự khác biệt? Cần một số lời giải thích. Cảm ơn rất nhiều.

------ cập nhật ------

Nikita Popov's - PHP 7 - Điều gì đã thay đổi bên trong? (P41)

http://www.slideshare.net/nikita_ppv/php-7-what-changed-internally

slideshare

+0

http://php.net/manual/en/features.gc.refcounting-basics.php – devpro

+0

@devpro Đó là php 5.x – Lynn

+0

không có gì thay đổi trong cả hai .. khái niệm – devpro

Trả lời

8

Trong PHP 7 một zval có thể được tham khảo tính hay không. Có một lá cờ trong cấu trúc zval xác định điều này.

Có một số loại không bao giờ được tính lại. Các loại này là null, bool, int và double.

Có các loại khác luôn được tính lại. Đây là các đối tượng, tài nguyên và tham chiếu.

Và sau đó có các loại, được đôi khi được đếm lại. Đó là những chuỗi và mảng.

Đối với chuỗi, biến thể không được tính lại được gọi là "chuỗi nội bộ". Nếu bạn đang sử dụng một bản xây dựng PHP 7 của NTS (không an toàn với chủ đề), thông thường, tất cả các chuỗi ký tự trong mã của bạn sẽ được thực thi. Các chuỗi nội bộ này được loại bỏ trùng lặp (nghĩa là chỉ có một chuỗi nội bộ có nội dung nhất định) và được bảo đảm tồn tại trong toàn bộ thời gian yêu cầu, do đó không cần sử dụng tính tham chiếu cho chúng. Nếu bạn sử dụng opcache, các chuỗi này sẽ tồn tại trong bộ nhớ dùng chung, trong trường hợp này bạn không thể sử dụng tính tham chiếu cho chúng (vì cơ chế truy vấn của chúng tôi không phải là nguyên tử). Các chuỗi được thực hiện có số lần truy cập giả là 1, đó là những gì bạn thấy ở đây.

Đối với mảng, biến thể không được tính lại được gọi là "mảng không thể thay đổi". Nếu bạn sử dụng opcache, thì các hằng số mảng liên tục trong mã của bạn sẽ được chuyển đổi thành các mảng bất biến. Một lần nữa, chúng sống trong bộ nhớ chia sẻ và như vậy không được sử dụng tính năng đếm ngược. Các mảng không thể thay đổi có một số đếm ngược giả định là 2, vì nó cho phép chúng ta tối ưu hóa các đường phân tách nhất định.

+0

Cảm ơn! Hiểu rồi! :) – Lynn