文件中沒有明確說明,但在程式碼中需要 __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 例外。
此方法用於將 PHP 啟動載入器程式碼段新增至新的 Phar 封存,或替換現有 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 區塊,它會出錯,並且不會用我想要的內容寫入程式碼。