【发布时间】:2015-05-11 00:38:10
【问题描述】:
我正在尝试让 PHP_CodeSniffer 检查类名中的 camelCase,但在我看来,camelCase 检查是不可能的(没有字典,包括 techy 词)。
我已经在互联网上搜索过,但到目前为止,我看到的唯一选择是字符串是否有一些常见的分隔符可以从中分解 - 即下划线、单词之间的空格等。
即使这也没有用,因为只有在名称准确/始终在每个单词之间包含分隔符时,检查才能准确。
“检查”的重点是确定名称是否格式不正确,这可能包括不正确分隔。
此外,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.
这些基本检查总比没有好,尽管对于它们预期的目的来说可能毫无用处,因为它们根本不检查骆驼情况。
问题
嗅探器(或即 PHP 脚本)如何知道在给定字符串中检查哪些“单词”以识别字符串是否为 100% 驼峰式?
编辑
示例
正确的驼峰式:class calculateAdminLoginCount
// Not camelCase
class calculateadminlogincount
// Partially camelCase
class calculateadminLogincount
isCamelCaps() 函数(或与此相关的任何 PHP 脚本)如何捕获上述两个示例?
如果函数或 PHP 脚本没有“单词”的概念而不提供该信息(即来自字典),它如何从字符串中识别“单独的单词”?
即使脚本在哪里爆炸,它会根据什么爆炸?
参加class calculateadminLogincount
任何PHP脚本如何识别calculateadminLogincount是该字符串中的不同单词,然后能够检查:第一个字母第一个单词是小写,然后所有后续单词第一个字母是大写?
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) 运行所有文件并告诉我没有任何问题可能存在潜在问题的地方。
即使只是为了进行第二次检查,尤其是因为它还可以确保代码库整洁、结构正确并且始终具有连续性。
【问题讨论】:
-
您能否举一些导致问题的字符串示例,其中某些内容被识别为 camelCase 但不是,反之亦然?
-
我不明白
isCamelCaps测试是如何不足的。哪些示例未能通过这些测试? -
嗯,这非常棘手而且可能是不可能的。我能想到的最好的方法是“容忍”限制,以在可能失败时发出警告(但不是确定的)。例如,如果有 20 个字符且只有一个大写字母,那就是“可能失败”。跨度>
-
@sjagr char count 可能是一个有用的想法。不会是准确的,因为可以有长词,短词等,但再加上其他检查,它可能是我可以玩的东西。无论我最终完成什么检查,它们都只是一个可以忽略的警告/通知,或者有时可能最终有用。
-
正是我的意思!也许也可以将它与字典相结合。一般来说,如果你编程正确,你不会在 camelCase 变量或类名中有冗长的单词。
标签: php camelcasing phpcodesniffer