如何终止PHP脚本由于不支持的PHP版本?

ulydmbyx  于 2023-08-02  发布在  PHP
关注(0)|答案(2)|浏览(106)

有没有人知道如何在同一个脚本中发生错误(由于调用了不支持的函数/特性)之前终止版本过低的PHP脚本?
下面是PHP 8.2中引入的readonly class示例:

#!/usr/bin/env php
<?php

define("MIN_PHP_VER", 8.2);

if (version_compare(PHP_VERSION, MIN_PHP_VER, '<'))
{ 
    echo "This script requires at least PHP " . MIN_PHP_VER . "\n"; 
    die();
}

readonly class SomeClass
{
    
}

字符串
显然,这是行不通的,因为整个脚本是在开始时读取的,所以在PHP < 8.2中会抛出一个错误:

syntax error, unexpected token "readonly"


我希望脚本的执行依赖于给定环境中可用的PHP版本,而不必使用另一个脚本进行检查(所有内容都在一个脚本中执行),因此预期输出应为:

This script requires at least PHP 8.2


是不是以某种方式有可能实现呢?
我知道我可以使用composer或两个脚本(当PHP_VERSION符合要求时,第一个脚本将执行第二个脚本)。但我只想有一个脚本,将详细解释给用户为什么他不能使用它(或它只会执行,如果PHP版本是正确的)。

quhf5bfb

quhf5bfb1#

PSR 1是由PSR-2和PSR-12扩展的,它规定你可以让一个文件声明新的符号,比如函数和类,或者你可以有一个有副作用的符号。你不应该有一个文件,这两个。你的剧本两者都有!
你应该这样做:

<?php
define("MIN_PHP_VER", 8.2);
if (version_compare(PHP_VERSION, MIN_PHP_VER, '<'))
{ 
    echo "This script requires at least PHP " . MIN_PHP_VER . "\n"; 
    die();
}

require __DIR__ . "/vendor/autoload.php";
startMeUp($args);

字符串
所以现在你有多个文件,但有一个解决方案,使它成为一个executable phar archive。例如,composer就是这样一个应用程序的例子。

xiozqbni

xiozqbni2#

处理此问题的典型方法是在安装时使用Composer'sx 1 m0n1x配置来约束版本。这意味着要使用PSR-4命名约定,以支持使用自动加载器--无论如何都应该这样做。这样,你就可以在composer.json文件中指定你的版本要求,而不需要在代码中的任何地方进行任何显式的版本检查:

{
   "require": {
      "php": "^8.2"
   }
}

字符串
然后,当你运行composer installcomposer update时,你会得到一个错误:

Loading composer repositories with package information
Updating dependencies
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Root composer.json requires php ^8.2 but your php version (8.0.29) does not satisfy that requirement.

相关问题