PHP Conference Japan 2024

Phar::setStub

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

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

描述

public Phar::setStub(资源|字符串 $stub, 整数 $length = -1): 布尔值

注意:

此方法需要 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 使用 资源length 调用 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 条注释

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

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