开始在现有存储库中使用 PHP 名称空间,所有文件都出现语法错误

Starting to use PHP namespaces in an existing repository, all files give syntax errors

在我的主要来源中的每个文件上用 <?php namespace foo; 替换了正常的 <?php 我收到了错误:

PHP Fatal error: Namespace declaration statement has to be the very first statement in the script in src/admin_house_videos.php on line 1

在大多数文件上。环顾互联网,人们建议归咎于名为 UTF8-BOM 的东西,但我怎样才能摆脱它?

事实证明,Sublime Text 能够在每个文件的基础上解决这个问题:

File -> Save with Encoding -> UTF8

然而,在大型存储库中,这将非常耗时。然后我发现 this guide 这表明可以使用 unix 工具 awk 来替换文件:

awk '{if(NR==1)sub(/^\xef\xbb\xbf/,"");print}' file.php

然而,尝试将此写回文件并在末尾附加 > file.php 会使文件空白,可能是某种 read/write 输出问题被发送到标准输出。

所以需要写一个bash脚本来解决这个问题;在我的例子中,它是来自根目录的 运行,文件位于 ./src/ 中,但更改 $dir 参数来改变它。 echo 行只是报告进度。

#!/bin/bash

dir="./src/"

for file in `find $dir -name "*.php"` ; do
    echo $file
    awk '{if(NR==1)sub(/^\xef\xbb\xbf/,"");print}' $file > $file.awk
    mv $file.awk $file
done