3

我有一个 php 脚本,它可以独立于命令行运行,所以它的第一行是#!/usr/bin/env php. 不过,我还有另一个脚本,可以自动运行第一个。它通过调用 来做到这一点include 'example.php',它可以工作,只是它将第一行输出为文本。

如何让 include 跳过第一行?到目前为止,我能想到的唯一选择是将整个内容包装在输出缓冲区中,然后修剪第一行,但这有很多问题。替代方案,例如exec()用于模拟从命令行运行第二个脚本,或读取整个文件并使用 评估它eval(),两者似乎都是非常糟糕的解决方案。

有没有办法告诉php,“包括这个文件但不输出第一行”?

我知道我可以删除shebang并在php script.php需要时运行脚本,这在这种特定情况下是可以的,但我仍然想知道是否有另一种一般的方法来让包含忽略第一个(或前 X)行。

4

5 回答 5

2

IMO 带有 shebang 的脚本非常明确地是命令行的“前端”,首先不应包含在其他脚本中,因为它包含特定于处理 CLI 交互的代码(解析传递的参数等)。将该脚本中的可重用代码分离到一个库文件中,然后从 shebang 脚本和其他脚本中包含该文件可能更有意义。

即,而不是:

foo.php

#!/usr/bin/php
// some code

bar.php

include 'foo.php';

你做:

lib.php

// some code

foo.php

#!/usr/bin/php
include 'lib.php';

bar.php

include 'lib.php';
于 2014-07-04T09:38:10.617 回答
2
ob_start();
include $file;
$stdout = ob_get_contents(); // shebang line will be there
ob_end_clean();
于 2015-07-08T21:06:07.727 回答
0

不。包括/要求技术上说,执行,没有(额外的)评估。

您的解决方案应该是另一种方式:

  • PHP 文件
  • 执行 PHP 文件的 Bashscript。
于 2014-07-04T09:36:00.410 回答
0

exec()是正确的解决方案。但更好的是改变您对脚本的理解。

您的命令行可执行文件基本上是一个控制器,它说明要执行什么。您的命令行脚本可能很简单:

#!/usr/bin/env php
<?php
require_once('classes/DoThing.php');

array_shift($argv);
DoThing::run($argv);

然后你不需要包含或exec()命令行脚本,只需使用类。

于 2014-07-04T09:41:25.087 回答
0

解决方案是评论标签:

在包含的文件中:

#!/usr/bin/env php
<!-- none -->    
<?php
 ...

在主文件中:

<?php
 ...
 echo '<!-- ';
 include x.php;
 ... 
于 2020-09-10T09:48:56.853 回答