我已經使用這種方法多年了,從來沒有遇到過問題;然而,對于這是否是一種好的做法,我總是有點嘮叨。我將首先介紹我正在做的具體工作,然后提供推理的背景,因為我確信它會受到質疑。問題/問題 我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 關注
- 180 瀏覽
添加回答
舉報
0/150
提交
取消