Çoğu zaman üstünde anlaşılmış belli standartlar veya araçlar yoksa PHP kodları kişiden kişiye çok farklılık gösterebiliyor.

Bunun için PSR standartları gibi çalışmalar var. Kodumuzu daha okunur yapmak için bu standartları takip edebiliriz.

Composer ile aşağıdaki paketleri kuruyoruz.

composer require --dev "squizlabs/php_codesniffer=*"
composer require --dev opsway/psr12-strict-coding-standard

Kurmak elbette bir adım, fakat bu kurallar için bir de kural seti tanımlamamız gerekiyor.

Proje ana klasörümüzde phpcs.xml isimli bir dosya ekleyip aşağıdaki gibi kuralları belirtiyoruz.

WordPress kodları gösterebilsin diye < etiketleri sonrasına boşluklar koydum. O kısımları düzenlemeniz gerekecektir.

< ?xml version="1.0"? >
< ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="vendor/squizlabs/php_codesniffer/phpcs.xsd">

    < arg name="basepath" value="."/>
    < arg name="cache" value=".phpcs-cache"/>
    < arg name="warning-severity" value="0"/>
    < arg name="colors"/>
    < arg name="extensions" value="php"/>
    < arg name="parallel" value="80"/>

    < !-- İlerlemeyi göster -->
    < arg value="sp"/>

    < !-- Kontrol edilecek yollar -->
    < file>APP/Template
    < file>APP/setup
    < file>APP/lib
    < file>APP/CLASS
    < file>APP/ACP

    < !-- Kullanılacak kodlama standardı. Tercihen sadece 1 tane -->
     < rule ref="OpsWayStrictPSR12CodingStandard"/>
     < !--< rule ref="PSR12"/> –>
< /ruleset>

Kuralları tanımladık, artık phpcs çalıştırabiliriz.

Her seferinde kodu elle yazmak yerine .bashrc içine alias tanımlamak daha makul olabilir. Aşağıdaki gibi aliasları tanımlayabilirsiniz.

alias cs-check="./vendor/bin/phpcs"
alias cs-fix="./vendor/bin/phpcbf"
alias cs-lint="vendor/bin/parallel-lint --exclude vendor ."

Değişiklikleri uygulamadan önce sürüm takip sistemimizde yeni bir dal oluşturup oradan ilerlemek iyi olacaktır.

Neyse, kodumuzu çalıştıralım.

./vendor/bin/phpcs

Karşımıza pek çok öneri sunulacaktır. Bunlar henüz öneridir ve kod üzerinde henüz değişiklik yapılmadı.

Sürüm takibine güvenerek değişiklikleri uygulamaktan çekinmiyorum ve aşağıdaki kodu çalıştırıyorum.

./vendor/bin/phpcbf

Uygulanan değişikliklerden sonra phpcs komutunu yeniden çalıştırıyoruz.

./vendor/bin/phpcs

Artık kalan hatalar için düşünme sırası gelmiş olabilir.

Paralel Çalıştırma Testi

Composer ile aşağıdaki paketi kuruyoruz.

composer require --dev php-parallel-lint/php-parallel-lint
composer require --dev php-parallel-lint/php-console-highlighter

Artık kodlarımızı test edebiliriz. Burada vendor dizinini hariç tuttuk çünkü composer ile gelen kodlar orada tutuluyor.

vendor/bin/parallel-lint --exclude vendor .

İşin sonunda “No syntax error found” görüyorsanız hayırlı olsun. Kodunuz hatasız şekilde muhtemelen çalışıyordur.

Twig kullanıyorsanız şunu da listeye eklemekte yarar var. Twig şablonları için öneriler sunuyor. Otomatik düzeltme yapmıyor.

composer require --dev friendsoftwig/twigcs
./vendor/bin/twigcs APP/Template/

PHPMD kullanıyorsanız aşağıdaki komut ile kurulum yapabilirsiniz. PHPMD, PHP Mess Detector olarak geçiyor ve fonksiyon ve sınıflar için kimi öneriler sunabiliyor.

Kurulum yapıyoruz.

composer require --dev phpmd/phpmd

Sonrasında önerilerde kullanılacak kuralları belirlememiz gerekiyor ki bir hayli detaylı bir konu. Aşağıdaki içeriği phpmd.xml adıyla proje ana dizinine kaydediyoruz.

< ?xml version="1.0"?>
< ruleset name="kitaphaber"
        xmlns="http://pmd.sf.net/ruleset/1.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
        xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
    < description>Activate all PHPMD rules
    < rule ref="rulesets/cleancode.xml/BooleanArgumentFlag" />
    < rule ref="rulesets/cleancode.xml/ElseExpression" />
    < rule ref="rulesets/cleancode.xml/StaticAccess" />
    < rule ref="rulesets/cleancode.xml/IfStatementAssignment" />
    < rule ref="rulesets/cleancode.xml/DuplicatedArrayKey" />
    < rule ref="rulesets/cleancode.xml/MissingImport" />

    < rule ref="rulesets/codesize.xml/CyclomaticComplexity" />
    < rule ref="rulesets/codesize.xml/NPathComplexity" />
    < rule ref="rulesets/codesize.xml/ExcessiveMethodLength" />
    < rule ref="rulesets/codesize.xml/ExcessiveClassLength" />
    < rule ref="rulesets/codesize.xml/ExcessiveParameterList" />
    < rule ref="rulesets/codesize.xml/ExcessivePublicCount" />
    < rule ref="rulesets/codesize.xml/TooManyFields" />
    < rule ref="rulesets/codesize.xml/TooManyMethods" />
    < rule ref="rulesets/codesize.xml/TooManyPublicMethods" />
    < rule ref="rulesets/codesize.xml/ExcessiveClassComplexity" />

    < rule ref="rulesets/controversial.xml/Superglobals" />
    < rule ref="rulesets/controversial.xml/CamelCaseClassName" />
    < rule ref="rulesets/controversial.xml/CamelCasePropertyName" />
    < rule ref="rulesets/controversial.xml/CamelCaseMethodName" />
    < rule ref="rulesets/controversial.xml/CamelCaseParameterName" />
    < rule ref="rulesets/controversial.xml/CamelCaseVariableName" />

    < rule ref="rulesets/design.xml/ExitExpression" />
    < rule ref="rulesets/design.xml/EvalExpression" />
    < rule ref="rulesets/design.xml/GotoStatement" />
    < rule ref="rulesets/design.xml/NumberOfChildren" />
    < rule ref="rulesets/design.xml/DepthOfInheritance" />
    < rule ref="rulesets/design.xml/CouplingBetweenObjects" />
    < rule ref="rulesets/design.xml/DevelopmentCodeFragment" />
    < rule ref="rulesets/design.xml/EmptyCatchBlock" />
    < rule ref="rulesets/design.xml/CountInLoopExpression" />

    < rule ref="rulesets/naming.xml/LongClassName" />
    < rule ref="rulesets/naming.xml/ShortClassName" />
    < rule ref="rulesets/naming.xml/ShortVariable" />
    < rule ref="rulesets/naming.xml/LongVariable" />
    < rule ref="rulesets/naming.xml/ShortMethodName" />
    < rule ref="rulesets/naming.xml/ConstructorWithNameAsEnclosingClass" />
    < rule ref="rulesets/naming.xml/ConstantNamingConventions" />
    < rule ref="rulesets/naming.xml/BooleanGetMethodName" />

    < rule ref="rulesets/unusedcode.xml/UnusedPrivateField" />
    < rule ref="rulesets/unusedcode.xml/UnusedLocalVariable" />
    < rule ref="rulesets/unusedcode.xml/UnusedPrivateMethod" />
    < rule ref="rulesets/unusedcode.xml/UnusedFormalParameter" />
< /ruleset>

Sonrasında projelerinizi analiz ettirebilirsiniz. Ben kısa bir alias fonksiyon tanımlayıp .bashrc dosyasına kaydettim.

hardmd() {
./vendor/bin/phpmd -vvv index.php text phpmd.xml &&
./vendor/bin/phpmd -vvv APP/lib/ text phpmd.xml &&
./vendor/bin/phpmd -vvv APP/CLASS/ text phpmd.xml &&
./vendor/bin/phpmd -vvv APP/ACP/ text phpmd.xml
}

Buraya kadar yazıyı okuduysanız artık kodlamaya geri dönebilirsiniz.

İyi çalışmalar.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir