2012-01-09 16 views
12

Đây là mã & sản lượng của nó tôi đã sử dụng để rút ra những kết luận dưới đây:# <some-number> bên cạnh đối tượng (someClass) trong var_dump của một đối tượng là gì? Tôi có suy luận. Tôi có đúng không?

class a { 
    public $var1; 
    public $var2; 
    } 

$obj0 = new a; 
var_dump($obj0); 

class b { 
    public $var1; 
    public $var2; 
    public $var3; 
    } 

$obj1 = new b; 
var_dump($obj1); 

$obj2 = new stdClass; 
var_dump($obj2); 

$obj3 = new stdClass; 
var_dump($obj3); 

$obj4 = new stdClass; 
var_dump($obj4); 

$obj5 = new stdClass; 
var_dump($obj5); 

var_dump(new stdClass); 

$obj6 = new stdClass; 
var_dump($obj6); 

Sản lượng:

object(a)#1 (2) { 
    ["var1"]=> NULL 
    ["var2"]=> NULL 
} 
object(b)#2 (3) { 
    ["var1"]=> NULL 
    ["var2"]=> NULL 
    ["var3"]=> NULL 
} 
object(stdClass)#3 (0) { 

} 
object(stdClass)#4 (0) { 

} 
object(stdClass)#5 (0) { 

} 
object(stdClass)#6 (0) { 

} 
object(stdClass)#7 (0) { 

} 
object(stdClass)#7 (0) { 

} 

Các #<some-number> bên cạnh dòng object(someClass) trong var_dump của một đối tượng thực sự là #<count>. Trong trường hợp,

đếm là số đối tượng/zval của các đối tượng không phân biệt trong đó lớp nó thuộc về đã được tạo ra cho đến bây giờ. Mà tiếp tục tăng dần cho mọi đối tượng được tạo ra & bị giảm đi 1 khi một lần truy cập của một giá trị bằng không, tức là Bộ sưu tập rác.

Tôi có đúng không?

+0

Bạn có nhớ [định danh đối tượng PHP có] (http://php.net/manual/en/language.oop5.references.php) từ một trong những câu hỏi trước đây của bạn về việc thu gom rác/bò? – hakre

+0

@hakre Có, tôi nhớ. Xin lỗi vì trả lời chậm trễ. Đi qua các câu trả lời ngay bây giờ. – ThinkingMonkey

Trả lời

16

Số điện thoại đó là số Z_OBJ_HANDLE_PP(struc) trong đó struczval dẫn đến Z_OBJVAL(zval).handle dẫn đến (zval).value.obj.

Xem cũng http://php.net/manual/en/internals2.variables.intro.php

Nói tóm lại tôi sẽ nói đó là object identifier viết ở dạng số thập phân (ref):

php_printf("%sobject(%s)#%d (%d) {\n", COMMON, class_name, Z_OBJ_HANDLE_PP(struc), myht ? zend_hash_num_elements(myht) : 0); 

Và không phải là đếm các đối tượng từng được tạo ra.

+0

yup định nghĩa dẫn đến '(zval) .value.obj'. 'Giá trị' là một thành viên của' struct _zval_struct' của kiểu 'zvalue_value' và' obj' là một thành viên của '_zvalue_value' (' zvalue_value') của kiểu 'zend_object_value'. – ThinkingMonkey

+0

từ ([ref] (http://lxr.php.net/opengrok/xref/PHP_5_3/Zend/zend_types.h)): zend_object_value: _zend_object_value ('zend_object_value') có' zend_object_handle handle; '&' zend_object_handlers * handlers; 'có typedefs là' ​​typedef unsigned int zend_object_handle; ' ' typedef struct _zend_object_handlers zend_object_handlers; 'tương ứng. Cảm ơn một lần nữa! – ThinkingMonkey

+0

Câu trả lời tuyệt vời, đã tự hỏi điều này trong một thời gian. – Mahn

8

Không, nó là một tài liệu tham khảo nội bộ để các trường hợp đối tượng, nếu bạn đã làm

var_dump($obj1); 

một lần nữa, nó vẫn sẽ là id # 2

EDIT

Trong trường hợp của bạn

var_dump(new stdClass); 

PHP đang tạo mới Ví dụ của stdClass và bán nó bằng var_dump, cho bạn thể hiện # 7. Tuy nhiên, bởi vì trường hợp này là thoáng qua (bạn không gán nó vào bất kỳ biến) nó bị phá hủy một lần nữa ngay sau đó, vì vậy đối tượng id # 7 có sẵn một lần nữa để phân bổ cho các đối tượng kế tiếp mà bạn tạo ra với

$obj6 = new stdClass;