如何将 SplFileObject::fpassthru 输出分配给变量
How to assign SplFileObject::fpassthru output to variable
我目前正在像这样将一些数据写入 SplFileObject
:
$fileObj = new SplFileObject('php://text/plain,', "w+");
foreach($data as $row) {
$fileObj->fputcsv($row);
}
现在,我想将整个输出(字符串)转储到一个变量。
我知道 SplFileObject::fgets
逐行获取输出(这需要一个循环)但我想一次性获取它,理想情况下是这样的:
$fileObj->rewind();
$output = $fileObj->fpassthru();
但是,这不起作用,因为它只是打印到标准输出。
我正在尝试使用 stream_get_contents()
实现的解决方案:
pass fpassthru contents to variable
但是,该方法要求您可以直接访问文件句柄。
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() 在这里不起作用。
在没有内置函数的情况下,我决定按照@CBroe 的建议进行php 输出缓冲。
...
$fileObj->rewind();
ob_start();
$fileObj->fpassthru();
$buffer = ob_get_clean();
请参阅@jsplit 的回答,了解使用 SplFileObject
s 内置函数的更好方法
我目前正在像这样将一些数据写入 SplFileObject
:
$fileObj = new SplFileObject('php://text/plain,', "w+");
foreach($data as $row) {
$fileObj->fputcsv($row);
}
现在,我想将整个输出(字符串)转储到一个变量。
我知道 SplFileObject::fgets
逐行获取输出(这需要一个循环)但我想一次性获取它,理想情况下是这样的:
$fileObj->rewind();
$output = $fileObj->fpassthru();
但是,这不起作用,因为它只是打印到标准输出。
我正在尝试使用 stream_get_contents()
实现的解决方案:
pass fpassthru contents to variable
但是,该方法要求您可以直接访问文件句柄。
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() 在这里不起作用。
在没有内置函数的情况下,我决定按照@CBroe 的建议进行php 输出缓冲。
...
$fileObj->rewind();
ob_start();
$fileObj->fpassthru();
$buffer = ob_get_clean();
请参阅@jsplit 的回答,了解使用 SplFileObject
s 内置函数的更好方法