gpt4 book ai didi

php - 什么是 stream_wrapper_register() 端口范围?

转载 作者:行者123 更新时间:2023-12-04 06:37:02 24 4
gpt4 key购买 nike

你好
我想知道这个函数 stream_wrapper_register() 创建的自定义包装器的范围是什么。我问的原因是因为我创建了一个自定义包装器,但是每当我尝试在函数中包含内容时,它们都不会显示。

这是我的代码:

<?php

class VariableStream {
var $position;
var $varname;

function stream_open($path, $mode, $options, &$opened_path)
{
$url = parse_url($path);
$this->varname = $url["host"];
$this->position = 0;

return true;
}

function stream_read($count)
{
$ret = substr($GLOBALS[$this->varname], $this->position, $count);
$this->position += strlen($ret);
return $ret;
}

function stream_write($data)
{
$left = substr($GLOBALS[$this->varname], 0, $this->position);
$right = substr($GLOBALS[$this->varname], $this->position + strlen($data));
$GLOBALS[$this->varname] = $left . $data . $right;
$this->position += strlen($data);
return strlen($data);
}

function stream_tell()
{
return $this->position;
}


function stream_eof()
{
return $this->position >= strlen($GLOBALS[$this->varname]);
}

function stream_seek($offset, $whence)
{
switch ($whence) {
case SEEK_SET:
if ($offset < strlen($GLOBALS[$this->varname]) && $offset >= 0) {
$this->position = $offset;
return true;
} else {
return false;
}
break;

case SEEK_CUR:
if ($offset >= 0) {
$this->position += $offset;
return true;
} else {
return false;
}
break;

case SEEK_END:
if (strlen($GLOBALS[$this->varname]) + $offset >= 0) {
$this->position = strlen($GLOBALS[$this->varname]) + $offset;
return true;
} else {
return false;
}
break;

default:
return false;
}
}
}

stream_wrapper_register("var", "VariableStream")
or die("Failed to register protocol");

$myvar = "Test contents";
include("var://myvar");
?>

这段代码工作正常,但是当我将最后一部分更改为:
function test()
{
$myvar = "Test contents";
include("var://myvar");
}

test();

不显示内容。

最佳答案

此流包装器在全局范围内运行。

$GLOBALS[$this->varname]

使用这种语法,它只能访问命名变量作为全局变量。因此,它不能像您的 test() 函数那样访问任何局部变量。

我看不到立即选择使此流包装器访问,例如get_defined_vars()。您必须分配一个唯一的名称并使其 global .

关于php - 什么是 stream_wrapper_register() 端口范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4755565/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com