我已经使用这种方法多年了,从来没有遇到过问题;然而,对于这是否是一种好的做法,我总是有点唠叨。我将首先介绍我正在做的具体工作,然后提供推理的背景,因为我确信它会受到质疑。问题/问题 我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) 类必须从同一个文件中实例化。
2 回答
尚方宝剑之说
TA贡献1788条经验 获得超4个赞
有一个 PHP 函数可以只检索评论:ReflectionClass::getDocComment。您可以使用它而不是读取整个文件。我不确定当@Iłya Bursov 提到的代码被编码时它是如何工作的。
<?php
/**
* My PHP Script On Load
* Version: 1.0.0
*/
class MyClass {
public function __construct() {
$matches = array();
if (preg_match('/Version\: ([0-9\.]+)/s', (new ReflectionClass(__CLASS__))->getDocComment(), $matches)) {
$version = $matches[1];
}
}
}
$class = new MyClass();
?>
一只名叫tom的猫
TA贡献1906条经验 获得超3个赞
只要它是开放式问题,只是一些想法:
对于某些项目,必须对 php 文件进行编码,例如使用zend guard,这将完全破坏此方案
读取整个文件并不理想,您可以只读取它的前 100-200 个字节
上传到服务器之前的预处理怎么样?一些脚本,它读取所有文件、注释并将变量 $version 放入类中?
- 2 回答
- 0 关注
- 147 浏览
添加回答
举报
0/150
提交
取消