php fwrite & append to PHP function


php fwrite & append to PHP function

我正在使用fopen访问我的PHP文件:

$readFd = @fopen($file, 'r+');

我想在这个文件中搜索函数调用parent::process();如果它存在,我会在它之后插入一个新的函数调用。

我尝试过使用preg_replace,但它似乎与parent::process();不匹配例如,我需要的结果是这样的。

public function process() {
  parent::process();
  $this->newFunction();
}

然后将写入我正在使用的文件:

fwrite($readFd, $content);

我想我一定错过了regex的一些重要内容。希望有人能给我指明正确的方向。

我会使用php函数fgets逐个读取文件中的每一个,直到到达所需的行。然后你的指针会在那一行之后,在那里你可以写自己的一行。

编辑

我错了,当你在某个特定的点上向文件写入一些东西时,该点之后的所有东西都会丢失。所以我做了一个小测试,得出了这个:

$handle = fopen($file,"r+");
$lines = array();
while(($line = fgets($handle)) !== false) {
    $lines[] = $line;
    if(strpos($line, 'parent::process()')) {
        $lines[] = '$this->newFunction();';
    }
 }
 fseek($handle, 0); // reset pointer
 foreach($lines as $line) {
    fwrite($handle, $line);
 }
 fclose($handle);

我希望这能解决你的问题。

我提出了解决方案,但您的代码似乎要短得多,所以我明天会尝试您的解决方案。

if(! $readFd = @fopen($file, "r+"))
  return FALSE;
$buffer = fread($readFd, 120000);
fclose($readFd);
$onDuplicate = FALSE;
$lines = explode("'n", $buffer);
foreach($lines AS $key => $line) {
  if(strpos($line, "newFunction()")) {
    $onDuplicate = TRUE;
  }
  if(strpos($line, "parent::process()")) {
    $lines[$key] = "'t'tparent::process();'n't't//'$this->newFunction();'n";
  }
}
if(! $onDuplicate) {
  $readFd = fopen($file, "w");
  $buffer = implode("'n", $lines)."'n";
  fwrite($readFd, $buffer);
  fclose($readFd);
} else {
  var_dump('changes are already applied');
}

谢谢你的帮助!