2024 年 PHP 日本研討會

Phar::setStub

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

Phar::setStub用於設定 Phar 封存的 PHP 載入器或啟動程式碼

說明

公開 Phar::setStub(資源|字串 $stub, 整數 $length = -1): 布林

注意事項:

此方法需要將 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

回傳值

成功時回傳 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 則註解

1
Scott Dutton
6 年前
文件中沒有明確說明,但在程式碼中需要 __HALT_COMPILER()。
1
jaimz22 at gmail dot com
16 年前
我遇到很多問題,就是除非我把整個操作放在 try/catch 區塊內,否則我無法設定程式碼!

如果我移除 try/catch 區塊,它會出錯,並且不會用我想要的內容寫入程式碼。
0
Olivier Laviale
13 年前
如果您的程式碼有命名空間,則它會用於每個未定義命名空間的 include。
To Top