PHP_CodeSniffer にクラス名のキャメルケースをチェックさせようとしていますが、キャメルケースのチェックは不可能なようです (専門用語を含む辞書がなければ)。
私はインターネットをかき集めましたが、これまでに見た唯一のオプションは、文字列に爆発する一般的な区切り文字があるかどうかです-つまり、アンダースコア、単語間のスペースなど.
また、名前が正確に/常に各単語の間に区切り文字を含んでいる場合にのみ、チェックが正確になる可能性があるため、これでも役に立ちません。
「チェック」のポイントは、名前が正しくフォーマットされていないかどうかを判断することであり、これには正しく区切られていないことも含まれます。
また、PHP_CodeSniffer のリソースはまれであるか、ライター/開発者だけが理解できるほど基本的で専門的です。
現在の標準スニフ チェック
現在の Sniff の一部 (つまり、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.
これらの基本的なチェックは、実際にはキャメルケースをまったくチェックしないため、意図された目的にはほぼ間違いなく役に立たないものの、何もないよりはましです。
質問
Sniff (または PHP スクリプト) は、文字列が 100% camelCase であるかどうかを識別するために、特定の文字列をチェックインする「単語」をどのように知ることができますか?
編集
例
正しいキャメルケース:class calculateAdminLoginCount
// Not camelCase
class calculateadminlogincount
// Partially camelCase
class calculateadminLogincount
isCamelCaps()
上記の 2 つの例を関数 (または任意の PHP スクリプト) でキャッチするには どうすればよいでしょうか?
「単語」の概念がない場合、関数または PHP スクリプトは、その情報を (つまり、辞書から) フィードせずに、文字列から「個別の単語」をどのように識別できますか?
どこで爆発するか台本だとしても、何を元に爆発するのでしょうか?
PHP スクリプトは、その文字列内の異なる単語をどのように識別して、次のことを確認できます かclass calculateadminLogincount
?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
これが価値があるかどうか、または私が単に「いじって」「楽しんでいる」だけなのかどうか疑問に思っている人のための小さな情報:
オートローダが確実に動作するためには、ファイル/フォルダ構造と名前とクラス名が一致する必要があるため、クラス名は全体を通して正しく命名することが不可欠です。
スクリプトやクラスなどをロードできない場合 (もちろん)、そのような問題をチェックして処理するために Core コード自体をチェックしていますが、追加のスクリプト (PHP_CodeSniffer) を使用してすべてのファイルを実行し、潜在的な可能性がある場所を教えても問題はありません。問題は嘘かもしれません。
特に、コードベースが整頓され、正しく構造化され、全体に継続性があることも保証されるため、2 回目のチェックだけでも構いません。