文档中没有明确说明,但存根中需要 __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 | 使用 resource 和 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 块,它会出错,并且不会使用我想要的内容写入存根。