2008-10-19 42 views
8

Tôi có một vấn đề rất lạ, khi tôi cố gắng var_dump (hoặc print_r) một đối tượng Doctrine, phản hồi Apache của tôi với một trang trống rỗng (200 tiêu đề OK). Tôi có thể var_dump một php bình thường var như:Tại sao var_dump một Doctrine Objects giết Apache của tôi?

$dummy = array("a" => 1, "b" =>2); 

Và nó hoạt động tốt. Nhưng tôi không thể với bất kỳ đối tượng nào từ bất kỳ lớp Doctrine nào, (như kết quả từ $connection->query() hoặc một cá thể của một lớp từ mô hình đối tượng của tôi với Doctrine).

Mọi người đều biết tại sao điều này xảy ra?

+4

Đây là kết quả số một của google cho "doctrine var_dum p ". Xin vui lòng bạn có thể chấp nhận câu trả lời đúng (http://stackoverflow.com/a/8646048/3408) không phải là "tăng giới hạn bộ nhớ", mà không thực sự giải quyết vấn đề. – rjmunro

Trả lời

1

Tôi đã có đôi khi khi cố gắng print_r() một đối tượng tự tham chiếu - nó được đưa vào vòng lặp và hết bộ nhớ. Có thể đó là những gì đang xảy ra với bạn.

Thử tăng giới hạn bộ nhớ (ini_set('memory_limit', '256M');) và xem có khắc phục được không.

Chỉnh sửa: Tôi không nghĩ rằng có một sửa chữa thực tế cho điều này - đó là nội bộ của PHP var_dump/print_r không giới hạn độ sâu khi đệ quy (hoặc không thực hiện đúng, ít nhất). Nếu bạn cài đặt phần mở rộng XDebug, điều này có thể thay thế được xây dựng trong var_dump với một phiên bản xử lý đệ quy tốt hơn nhiều.

+11

bạn sẽ không nhận được đầu ra hữu ích, do đó tốt hơn nên sử dụng lệnh doctrine dump \ Doctrine \ Common \ Util \ Debug :: dump() được mô tả trong câu trả lời khác – Gigala

+2

Giới hạn bộ nhớ tăng không bao giờ được coi là câu trả lời hay. Nó giống như giới thiệu 'chmod 777'. – renoirb

8

Sử dụng phương pháp toArray của lớp Doctrine_Record

var_dump($doctrine_record->toArray()); 

sẽ chỉ hiển thị các lĩnh vực DB và tránh đổ internals Học thuyết đầy đủ (trong đó có tự tham khảo/đệ quy btw)

49

Lazy tải proxy luôn chứa một thể hiện của EntityManager của Doctrine và tất cả các phụ thuộc của nó.

Do đó, var_dump có thể sẽ kết xuất một cấu trúc đệ quy rất lớn không thể hiển thị và đọc. Bạn phải sử dụng \Doctrine\Common\Util\Debug::dump() để hạn chế việc bán phá giá ở mức có thể đọc được của con người. Lưu ý rằng độ sâu mặc định cho hàm này được đặt thành 2 (đó là tham số thứ hai)

+0

cảm ơn rất nhiều cho mẹo này! – Besnik

+0

Một cách để giải quyết vấn đề này, ngoài việc tăng giới hạn bộ nhớ, sẽ sử dụng [xdebug] (http://xdebug.org/) và tận dụng 'xdebug.var_display_max_depth' của nó để chỉ đổ đến một độ sâu nhất định sự đệ quy đó. – ficuscr

+0

là bất kỳ cách nào khác –

0

Bạn có thể sử dụng toArray nếu bạn chắc chắn đối tượng là một cá thể của Doctrine_Collection. Xdebug không giúp đỡ với hồ sơ học thuyết.

Con đường tôi đề nghị được thực hiện một chức năng tùy chỉnh đệ quy để in đối tượng, sử dụng Doctrine_Record :: toArray() khi neeeded

function var_dump_improved() 
{ 
    foreach (func_get_args() as $arg) { 
     if ($args instanceof Doctrine_Collection) { 
      print_r($arg); 
     } else if ($arg instanceof Traversable || is_array($arg)) { 
      // do a foreach and recall var_dump_improved on subelements 
     } else if (...) { 
      // other types 
     } 
    } 
} 

Một số hàm đệ quy để gỡ lỗi với mức độ làm tổ max đang ở đây

http://php.net/manual/en/function.var-dump.php

Xem nhận xét, tìm "đệ quy"

Các vấn đề liên quan