文档中没有明确说明,但在存根中需要使用 __HALT_COMPILER()。
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)
Phar::setStub — 用于设置 Phar 归档文件的 PHP 加载器或引导程序存根
注意:
此方法需要 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
如果在 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(); ?>"
我遇到很多问题的一件事是,除非我将整个操作放在 try/catch 块中,否则我无法设置存根!
如果我删除 try/catch 块,它将出错并且不会以我想要的内容写入存根。