我试图让 PHP_CodeSniffer 检查类名中的 camelCase,但在我看来,camelCase 检查是不可能的(没有字典,包括技术词)。
我已经在互联网上搜索过,但到目前为止,我看到的唯一选择是字符串是否有一些通用的分隔符可以从中分解——即下划线、单词之间的空格等。
甚至这也没有用,因为只有在名称准确/始终包含每个单词之间的分隔符时,检查才能准确。
“检查”的重点是确定名称是否格式不正确,这可能包括不正确分隔。
此外,PHP_CodeSniffer 上的资源要么很少见,要么非常基础和技术性强,只有作者/开发人员才能理解。
当前标准嗅探检查
我在一些当前的 Sniffs(即 Squiz 和 PEAR 标准)中找到了这段代码:
if (PHP_CodeSniffer::isCamelCaps($functionName, false, true, false) === false)
但是,我查看了 PHP_CodeSniffer 核心代码,该函数仅执行以下操作:
// Check the first character first.
// Check that the name only contains legal characters.
// Check that there are not two capital letters next to each other.
// The character is a number, so it cant be a capital.
这些基本检查总比没有好,尽管可以说对于它们的预期目的毫无用处,因为它们根本没有真正检查 camelCase。
问题
嗅探器(或即 PHP 脚本)如何知道在给定字符串中检查哪些“单词”以识别字符串是否为 100% 驼峰式?
编辑
例子
正确的驼峰式:class calculateAdminLoginCount
// Not camelCase
class calculateadminlogincount
// Partially camelCase
class calculateadminLogincount
该isCamelCaps()
函数(或任何 PHP 脚本)如何捕获上述两个示例?
函数或 PHP 脚本如何从字符串中识别“单独的单词”,当它没有“单词”的概念而不提供该信息(即来自字典)时?
即使一个脚本在哪里爆炸,它会根据什么爆炸?
采取class calculateadminLogincount
任何PHP脚本如何识别该calculate
admin
Login
count
字符串中的不同单词然后能够检查:第一个字母第一个单词是小写,然后所有后续单词第一个字母都是大写?
isCamelCaps()
功能
public static function isCamelCaps(
$string,
$classFormat=false,
$public=true,
$strict=true
) {
// Check the first character first.
if ($classFormat === false) {
$legalFirstChar = '';
if ($public === false) {
$legalFirstChar = '[_]';
}
if ($strict === false) {
// Can either start with a lowercase letter,
// or multiple uppercase
// in a row, representing an acronym.
$legalFirstChar .= '([A-Z]{2,}|[a-z])';
} else {
$legalFirstChar .= '[a-z]';
}
} else {
$legalFirstChar = '[A-Z]';
}
if (preg_match("/^$legalFirstChar/", $string) === 0) {
return false;
}
// Check that the name only contains legal characters.
$legalChars = 'a-zA-Z0-9';
if (preg_match("|[^$legalChars]|", substr($string, 1)) > 0) {
return false;
}
if ($strict === true) {
// Check that there are not two capital letters
// next to each other.
$length = strlen($string);
$lastCharWasCaps = $classFormat;
for ($i = 1; $i < $length; $i++) {
$ascii = ord($string{$i});
if ($ascii >= 48 && $ascii <= 57) {
// The character is a number, so it cant be a capital.
$isCaps = false;
} else {
if (strtoupper($string{$i}) === $string{$i}) {
$isCaps = true;
} else {
$isCaps = false;
}
}
if ($isCaps === true && $lastCharWasCaps === true) {
return false;
}
$lastCharWasCaps = $isCaps;
}
}//end if
return true;
}//end isCamelCaps()
编辑 2
对于那些想知道这是否值得,或者我只是在“玩弄”和“玩得开心”的人的一些信息:
必须在整个过程中正确命名类名,因为文件/文件夹结构以及名称和类名必须匹配才能使自动加载器可靠地工作。
虽然我检查了核心代码本身以检查和处理无法加载脚本、类等的此类问题(当然),但附加脚本(PHP_CodeSniffer)运行所有文件并告诉我潜在的位置并没有错问题可能在于。
即使只是为了进行第二次检查,尤其是因为它还可以确保代码库整洁、结构正确并且始终具有连续性。