亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

讀取當前正在運行的 PHP 文件的內容是不好的做法還是可能容易出錯?

讀取當前正在運行的 PHP 文件的內容是不好的做法還是可能容易出錯?

PHP
Qyouu 2021-10-15 15:43:35
我已經使用這種方法多年了,從來沒有遇到過問題;然而,對于這是否是一種好的做法,我總是有點嘮叨。我將首先介紹我正在做的具體工作,然后提供推理的背景,因為我確信它會受到質疑。問題/問題 我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();   


?>


查看完整回答
反對 回復 2021-10-15
?
一只名叫tom的貓

TA貢獻1906條經驗 獲得超3個贊

只要它是開放式問題,只是一些想法:

  1. 對于某些項目,必須對 php 文件進行編碼,例如使用zend guard,這將完全破壞此方案

  2. 讀取整個文件并不理想,您可以只讀取它的前 100-200 個字節

  3. 上傳到服務器之前的預處理怎么樣?一些腳本,它讀取所有文件、注釋并將變量 $version 放入類中?


查看完整回答
反對 回復 2021-10-15
  • 2 回答
  • 0 關注
  • 180 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

<form id="pndnd"></form>
  • <code id="pndnd"><label id="pndnd"><strike id="pndnd"></strike></label></code>
    <form id="pndnd"><em id="pndnd"><abbr id="pndnd"></abbr></em></form><var id="pndnd"><input id="pndnd"><s id="pndnd"></s></input></var>
    <span id="pndnd"><thead id="pndnd"></thead></span>
    <table id="pndnd"><em id="pndnd"><s id="pndnd"></s></em></table>