Slide 1

Slide 1 text

良い命名かを調べる リンターを作った 2024/09/25 第168回 PHP勉強会@東京

Slide 2

Slide 2 text

自己紹介  ちひろ  株式会社モリサワ  X: @chiroruxxxx

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

みなさんは コーディング中に命 名を気にしています か?

Slide 5

Slide 5 text

良い命名とは なにか  観点は色々とある  時間をかけ、一生懸命考えた命名は良い命名かもしれない  人生の中で、一番命名を気にしているタイミングがどこだろ う

Slide 6

Slide 6 text

良い命名とは なにか 子どもの名付け

Slide 7

Slide 7 text

子どもの 名付け  子どもの名づけも、色々な観点がある  言葉の意味  子どもがどうなってほしいか  よびやすさ・語感  周りから浮かないか  画数

Slide 8

Slide 8 text

画数占い 赤ちゃん命名ガイド

Slide 9

Slide 9 text

良い命名とは なにか  良い命名とは良い画数の命名・・・かもしれない?  みなさんは自分の変数名やクラス名の画数を気にしてます か?

Slide 10

Slide 10 text

ということでリン ターをつくりました

Slide 11

Slide 11 text

リンターを つくった  lucky-lint  https://github.com/chiroruxx/lucky-lint-php  PHP Code_Sniffer のルール  プログラムの命名のうち、悪い画数の命名を教えてくれる  以下の命名に対応  変数名  定数名(cont/define)  クラス・インターフェース・トレイト名  名前空間名  useインポートのエイリアス名

Slide 12

Slide 12 text

ドメイン部分  「ローマ字の姓名判断・商品名画数」を参考に  https://meimeimaker.com/articles/strokes-alphabet.php

Slide 13

Slide 13 text

こんな感じ  例えば Laravel の public/index.php にリントをかける  定数 “LARAVEL_START” は良い画数なのでエラーにならな い // Determine if the application is in maintenance mode... if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) { require $maintenance; } 8 | ERROR | "maintenance" is not lucky; level: BAD, stroke count: 22, lucky counts: 0,15,24,31,32

Slide 14

Slide 14 text

まとめ  良い画数の名前を選ぼう!  CIでリンターをまわしてチェックすれば安全だね!

Slide 15

Slide 15 text

・・・というネタは 置いといて

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

PHP Code_Sniffer のカスタムルールの つくりかた 2024/09/25 第168回 PHP勉強会@東京

Slide 18

Slide 18 text

概要  PHP Code_Sniffer は静的解析ツール  自分でルール(Sniff)を用意することもできる  lucky-lintを題材に、Sniffの作り方を説明する

Slide 19

Slide 19 text

静的解析の 流れ  PHP Code_Sniffer はプログラムをトークンに分解する  トークンはプログラムをキーワードに分解したもの  語弊あり  これらのトークンを検査するSniffを作り、静的解析を行う

Slide 20

Slide 20 text

トークン例 1. T_OPEN_TAG 2. T_WHITESPACE 3. T_VARIABLE 4. T_WHITESPACE 5. T_EQUAL 6. T_WHITESPACE 7. T_LNUMBER 8. T_SEMICOLON 9. T_WHITESPACE

Slide 21

Slide 21 text

Sniffの つくりかた  “PHP_CodeSniffer\Sniff\Sniff” インターフェースを満たす クラスを作る  クラス名の最後は Sniff で終わる必要がある  例: LuckyLintSniff.php interface Sniff { public function register(); public function process(File $phpcsFile, $stackPtr); }

Slide 22

Slide 22 text

register  リントで対象としたいトークンを指定する  例えば変数のトークンを対象にしたいなら以下のような感じ public function register(): array { return [T_VARIABLE]; }

Slide 23

Slide 23 text

process  検査する内容を書く  $phpcsFile->getTokens() でファイルすべてのトークンを取 得  $stackPtr には何番目のトークンを検査すべきかが入る  register() で登録した種類のトークンの順番  $phpcsFile->addError() でエラー出力 public function process(File $phpcsFile, $stackPtr) { $tokens = $phpcsFile->getTokens(); if ($tokens[$stackPtr]['content']{0} === '#') { $error = 'Hash comments are prohibited; found %s'; $data = array(trim($tokens[$stackPtr]['content'])); $phpcsFile->addError($error, $stackPtr, 'Found', $data); } }

Slide 24

Slide 24 text

具体例 lucky-lint の場合

Slide 25

Slide 25 text

変数名の チェック 1. T_OPEN_TAG 2. T_WHITESPACE 3. T_VARIABLE 4. T_WHITESPACE 5. T_EQUAL 6. T_WHITESPACE 7. T_LNUMBER 8. T_SEMICOLON 9. T_WHITESPACE • T_VARIABLE の値を調べる • 最初の$を削る

Slide 26

Slide 26 text

IF名の チェック 1. T_OPEN_TAG 2. T_WHITESPACE 3. T_INTERFACE 4. T_WHITESPACE 5. T_STRING 6. T_WHITESPACE 7. T_OPEN_CURLY_BRAC KET 8. T_WHITESPACE 9. T_CLOSE_CURLY_BRA CKET 10. T_WHITESPACE • T_STRING の値を調べたい • T_STRING は命名でない可能 性もある • T_INTERFACE の2つ先の T_STRINGのを調べる

Slide 27

Slide 27 text

定数の チェック 1. T_OPEN_TAG 2. T_WHITESPACE 3. T_CONST 4. T_WHITESPACE 5. T_STRING 6. T_WHITESPACE 7. T_EQUAL 8. T_WHITESPACE 9. T_LNUMBER 10. T_WHITESPACE

Slide 28

Slide 28 text

ポイント  指定のトークンを見るだけでは足りない  その前後にあるトークンを検査する必要がある  前後にあるトークンを読む構造があると便利

Slide 29

Slide 29 text

Reader class TokenReader { private int $seq = 0; public function __construct( private readonly File $file, ) { } public function read(int $seq): Token { // ... } public function next(int $step = 1): Token { return $this->read($this->seq + $step); } public function prev(int $step = 1): Token { return $this->read($this->seq - $step); } }

Slide 30

Slide 30 text

Tips

Slide 31

Slide 31 text

ディレクトリ 構成  以下のディレクトリ構成にする必要がある 1. (Project Root) 2. {$rulesetName} 3. Sniffs 4. {$category} 5. {$ruleName}Sniff.php

Slide 32

Slide 32 text

オートロード  PHP_CodeSniffer は composer の オートローダーを 使用していない  テストなどでオートロードする際は明示的にオートローダー を指定する必要がある require __DIR__ . '/../vendor/autoload.php'; require __DIR__ . '/../vendor/squizlabs/php_codesniffer/autoload.php';

Slide 33

Slide 33 text

ということで  オリジナルSniffを作って快適な静的解析ライフを!!