读取当前正在运行的 PHP 文件的内容是不好的做法还是可能容易出错?

我已经使用这种方法多年了,从来没有遇到过问题;然而,对于这是否是一种好的做法,我总是有点唠叨。我将首先介绍我正在做的具体工作,然后提供推理的背景,因为我确信它会受到质疑。


问题/问题 我file_get_contents用来检索正在运行的脚本的内容。在本质上:


<?php

/**

 * My PHP Script On Load

 * Version: 1.0.0

 */


class MyClass {


    public function __construct() {

        $matches = array();

        if (preg_match('Version\: ([0-9\.]+)/s', file_get_contents(__FILE__), $matches)) {

            $version = $matches[1];

        }

    }


}


$class = new MyClass();

上述工作,以及在我自己使用的数千个页面加载中(以及数万个从未听说过可能源于此的错误),我在这样做时从未遇到过问题。我一直想知道是 a) 这是不好的做法,还是 b) 它有可能导致错误。


背景/用例 自然,第一个问题将是“你为什么不把版本放在构造函数中?” 当然,我可以,但我必须将插件版本放在文件顶部的注释中,如图所示,我不这样做的唯一原因是我不会忘记更新一个或其他。通过将它放在一个地方,我永远不必担心搞砸了,如果它进入发布版本,可能会导致我正在使用的平台的更新系统出现重大问题。


除了使用部署/CI 自动放置版本号之外,我对如何解决这个问题持开放态度,我已经考虑过并且可能会在某个时候实施。但是三件事必须是正确的:1) 必须以示例中显示的相同格式在文件顶部注释掉版本,2) 我必须能够在同一个文件中为 PHP 代码提供版本, 3) 类必须从同一个文件中实例化。


Qyouu
浏览 148回答 2
2回答

尚方宝剑之说

有一个 PHP 函数可以只检索评论:ReflectionClass::getDocComment。您可以使用它而不是读取整个文件。我不确定当@Iłya Bursov 提到的代码被编码时它是如何工作的。<?php/**&nbsp;* My PHP Script On Load&nbsp;* Version: 1.0.0&nbsp;*/class MyClass {&nbsp; &nbsp; public function __construct() {&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; $matches = array();&nbsp; &nbsp; &nbsp; &nbsp; if (preg_match('/Version\: ([0-9\.]+)/s', (new ReflectionClass(__CLASS__))->getDocComment(), $matches)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $version = $matches[1];&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}$class = new MyClass();&nbsp; &nbsp;?>

一只名叫tom的猫

只要它是开放式问题,只是一些想法:对于某些项目,必须对 php 文件进行编码,例如使用zend guard,这将完全破坏此方案读取整个文件并不理想,您可以只读取它的前 100-200 个字节上传到服务器之前的预处理怎么样?一些脚本,它读取所有文件、注释并将变量 $version 放入类中?
打开App,查看更多内容
随时随地看视频慕课网APP