簡體   English   中英

如何將 SplFileObject::fpassthru output 分配給變量

[英]How to assign SplFileObject::fpassthru output to variable

我目前正在向這樣的SplFileObject寫入一些數據:

$fileObj = new SplFileObject('php://text/plain,', "w+");

foreach($data as $row) {

    $fileObj->fputcsv($row);
}

現在,我想將整個 output (字符串)轉儲到一個變量中。

我知道SplFileObject::fgets獲取 output (需要循環),但我想在一個 go 中獲取它,理想情況下是這樣的:

$fileObj->rewind();
$output = $fileObj->fpassthru();

但是,這不起作用,因為它只是打印到標准 output。

我正在嘗試使用stream_get_contents()實現的解決方案:

將 fpassthru 內容傳遞給變量

但是,該方法要求您可以直接訪問文件句柄。

SplFileObject將文件句柄隱藏在私有屬性中,因此無法訪問。

還有什么我可以嘗試的嗎?

寫完后,做一個 rewind() 然后你可以閱讀所有內容。 這個例子是為了理解:

$fileObj = new SplFileObject('php://memory', "w+");
    
$row = [1,2,'test'];  //Test Data
    
$fileObj->fputcsv($row);
$fileObj->rewind();
    
//now Read
$rowCopy = $fileObj->fgetcsv();
    
var_dump($row == $rowCopy);//bool(true)

$fileObj->rewind();
$strLine = $fileObj->fgets();  //read as string
$expected = "1,2,test\n";

var_dump($strLine === $expected);  //bool(true)

//several lines
$fileObj->rewind();
$fileObj->fputcsv(['test2',3,4]);
$fileObj->fputcsv(['test3',5,6]);

$fileObj->rewind();
for($content = ""; $row = $fileObj->fgets(); $content .= $row);

var_dump($content === "test2,3,4\ntest3,5,6\n");  //bool(true)

如果您絕對必須只使用一個命令來獲取您的內容,那么您也可以這樣做

// :
$length = $fileObj->ftell(); 
$fileObj->rewind();
$content = $fileObj->fread($length);

getSize() 在這里不起作用。

在沒有內置 function 的情況下,我決定按照@CBroe 的建議進行 php output 緩沖。

...

$fileObj->rewind();

ob_start();

$fileObj->fpassthru();

$buffer = ob_get_clean();

有關使用SplFileObject的內置函數的更好方法,請參閱@jsplit 的答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM