Phar::setStub

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Phar::setStub用于设置 Phar 归档文件的 PHP 加载器或引导程序存根

描述

public Phar::setStub(resource|string $stub, int $length = -1): bool

注意:

此方法需要 php.ini 设置 phar.readonly 设置为 0 才能对 Phar 对象起作用。否则,将抛出 PharException

此方法用于向新的 Phar 归档文件添加 PHP 引导加载器存根,或替换现有 Phar 归档文件中的加载器存根。

当直接包含归档文件(如以下示例所示)时,将使用 Phar 归档文件的加载器存根。

<?php
include 'myphar.phar';
?>

当通过 phar 流包装器包含文件时,不会访问加载器,如下所示。

<?php
include 'phar://myphar.phar/somefile.php';
?>

参数

stub

用作此 phar 归档文件的可执行存根的字符串或打开的流句柄。

length

返回值

成功时返回 true,失败时返回 false

错误/异常

如果在 php.ini 中启用了 phar.readonly,则会抛出 UnexpectedValueException。如果在将更改刷新到磁盘时遇到任何问题,则会抛出 PharException

变更日志

版本 描述
8.3.0 使用 resourcelength 调用 Phar::setStub() 现在已弃用。此类调用应替换为:$phar->setStub(stream_get_contents($resource));

示例

示例 #1 一个 Phar::setStub() 示例

<?php
try {
$p = new Phar(dirname(__FILE__) . '/brandnewphar.phar', 0, 'brandnewphar.phar');
$p['a.php'] = '<?php var_dump("Hello");';
$p->setStub('<?php var_dump("First"); Phar::mapPhar("brandnewphar.phar"); __HALT_COMPILER(); ?>');
include
'phar://brandnewphar.phar/a.php';
var_dump($p->getStub());
$p['b.php'] = '<?php var_dump("World");';
$p->setStub('<?php var_dump("Second"); Phar::mapPhar("brandnewphar.phar"); __HALT_COMPILER(); ?>');
include
'phar://brandnewphar.phar/b.php';
var_dump($p->getStub());
} catch (
Exception $e) {
echo
'Write operations failed on brandnewphar.phar: ', $e;
}
?>

上面的示例将输出

string(5) "Hello"
string(82) "<?php var_dump("First"); Phar::mapPhar("brandnewphar.phar"); __HALT_COMPILER(); ?>"
string(5) "World"
string(83) "<?php var_dump("Second"); Phar::mapPhar("brandnewphar.phar"); __HALT_COMPILER(); ?>"

参见

添加注释

用户贡献的注释 3 个注释

1
Scott Dutton
6 年前
文档中没有明确说明,但存根中需要 __HALT_COMPILER()。
1
jaimz22 at gmail dot com
16 年前
我遇到过很多问题,其中之一是我无法设置存根,除非将整个操作放在 try/catch 块中!

如果我删除 try/catch 块,它会出错,并且不会使用我想要的内容写入存根。
0
Olivier Laviale
13 年前
如果您的存根有命名空间,它将用于每个没有定义命名空间的 include。
To Top