Its not clear in the docs but __HALT_COMPILER() is required in the stub.(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)
Phar::setStub — Устанавливает в Phar-архив заглушку, которая играет роль начального загрузчика PHP
Замечание: Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
Метод устанавливает заглушку — начальный загрузчик — в Phar-архив: в новый архив добавляет, а в текущем — заменяет.
Загрузочная заглушка срабатывает при каждом включении Phar-архива:
<?php
include 'myphar.phar';
При включении файла через потоковую обёртку phar
загрузчик не запускается:
<?php
include 'phar://myphar.phar/somefile.php';
stubСтрока или дескриптор открытого потока; при включении архива код заглушки выполняется как начальный загрузчик.
length
Функция возвращает логическое значение true.
При вызове метода с включённой в файле php.ini директивой phar.readonly выбрасывается исключение UnexpectedValueException. При ошибке сброса изменений на диск выбрасывается исключение PharException.
| Версия | Описание |
|---|---|
| 8.4.0 |
Значение возврата теперь принадлежит типу true; раньше возвращался тип bool.
|
| 8.3.0 |
Передача аргумента length при вызове метода Phar::setStub()
с типом resource в первом аргументе устарела.
Передачу ресурса с длиной заменяют вызовом: $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("Привет,");';
$p->setStub('<?php var_dump("Первый загрузчик"); Phar::mapPhar("brandnewphar.phar"); __HALT_COMPILER(); ?>');
include 'phar://brandnewphar.phar/a.php';
var_dump($p->getStub());
$p['b.php'] = '<?php var_dump(" мир!");';
$p->setStub('<?php var_dump("Второй загрузчик"); Phar::mapPhar("brandnewphar.phar"); __HALT_COMPILER(); ?>');
include 'phar://brandnewphar.phar/b.php';
var_dump($p->getStub());
} catch (Exception $e) {
echo 'При записи операций в архив brandnewphar.phar возникла ошибка: ', $e;
}Результат выполнения приведённого примера:
string(13) "Привет,"
string(108) "<?php var_dump("Первый загрузчик"); Phar::mapPhar("brandnewphar.phar"); __HALT_COMPILER(); ?>"
string(8) " мир!"
string(108) "<?php var_dump("Второй загрузчик"); Phar::mapPhar("brandnewphar.phar"); __HALT_COMPILER(); ?>"
One thing I had alot of problems with, is that i can't set the stub unless I put the whole operation inside of a try/catch block!
If i remove the try/catch block it will error our and not write the stub with the content i want it to have.If your stub has a namespace, it is used for each include that doesn't define one.