🀯 ΠŸΠ΅Ρ€Π΅ΡΡ‚Π°Π½ΡŒ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² PHP!



Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ??? Π”Π°! Π’Π΅ самыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠΎΠ³Π΄Π°-Ρ‚ΠΎ всС спокойно юзали, Π½ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·ΠΆΠ΅ Π·Π°ΠΌΠ΅Π½ΠΈΠ»ΠΈ класс-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ с Π½Π΅ΠΉΠΌΠΈΠ½Π³ΠΎΠΌ Π²ΠΈΠ΄Π° Utils, *Helper ΠΈ Ρ‚.Π΄.



Ѐункция β€” это Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π½Π΅ code smell, Π° удобная конструкция ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠ³ΠΎ программирования, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π΅ стоит ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ ΠΈ Π½Π΅Π΄ΠΎΠΎΡ†Π΅Π½ΠΈΠ²Π°Ρ‚ΡŒ. Если Ρ‚Ρ‹ ΡΡ‡ΠΈΡ‚Π°Π΅ΡˆΡŒ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, я ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΡŽ тСбя ΠΏΠ΅Ρ€Π΅ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒ!



Π‘Π½Π°Ρ‡Π°Π»Π° Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ Π΄Π²Π° Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… замСчания ΠΊ функциям. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π² PHP для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π΅ прСдусмотрСн Π°Π²Ρ‚ΠΎΠ»ΠΎΠ°Π΄ΠΈΠ½Π³. Π”Π°, Ρ„Π°ΠΉΠ»Ρ‹ с функциями Π½ΡƒΠΆΠ½ΠΎ явно ΠΏΡ€ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π² autoload.files, ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ…ΠΈΡ‚Π΅. Однако, этот ΠΎΠ²Π΅Ρ€Ρ…Π΅Π΄ ΠΏΡ€Π΅Π½Π΅Π±Ρ€Π΅ΠΆΠΈΠΌ Π² случаС "ΡƒΠΌΠΈΡ€Π°ΡŽΡ‰Π΅Π³ΠΎ" PHP ΠΈ отстутствуСт Π²ΠΎΠΎΠ±Ρ‰Π΅, Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ preloading ΠΈΠ»ΠΈ PHP "Π½Π΅ ΡƒΠΌΠΈΡ€Π°Π΅Ρ‚". ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρ‚ΡƒΡ‚ Π² минусы запишСм Ρ‚ΠΎΠ»ΡŒΠΊΠΎ возню с composer.json.



Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ нСльзя ΠΌΠΎΠΊΠ°Ρ‚ΡŒ. Π­Ρ‚ΠΎ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠ΅ мокистскоС заявлСниС, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ: "Π’Π°ΠΊ Π½Π΅ ΠΌΠΎΠΊΠ°ΠΉ!" ΠΈ ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ ΠΊ Π€Π°ΡƒΠ»Π΅Ρ€Ρƒ. Ѐункция β€” это имплСмСнтация, Π° Π½Π΅ интСрфСйс. "Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ" Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ time β€” это callΠ°ble Π² PHP ΠΈ callable(): int Π² Psalm/PHPStan. Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π°Π±ΡΡ‚Ρ€Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π΅Ρ‘ слСдуСт ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ callable ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΡŽ ΠΈΠ»ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ (см. пост #133), ΠΈ Ρ‚ΠΎΠ³Π΄Π° Π² тСстС ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ всё Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ. Если ΠΆΠ΅ ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΏΡ€ΠΎ "Π·Π°Ρ…Π°Ρ€Π΄ΠΊΠΎΠΆΠ΅Π½Π½ΠΎΠ΅" использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎ, Ссли ΠΎΠ½Π° Π½Π΅ Π±Π΅Ρ€Ρ‘Ρ‚ Π½Π° сСбя большС, Ρ‡Π΅ΠΌ Π΄ΠΎΠ»ΠΆΠ½Π°, это Π½Π΅ составит ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Никто ΠΆΠ΅ Π½Π΅ боится Π² ΠΊΠΎΠ΄Π΅ "Ρ…Π°Ρ€Π΄ΠΊΠΎΠ΄ΠΈΡ‚ΡŒ" array_map ΠΈΠ»ΠΈ trim. Π“Π»Π°Π²Π½ΠΎΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сами Π±Ρ‹Π»ΠΈ протСстированы.



А Π²ΠΎΡ‚ плюсов я насчитал ΠΊΡƒΠ΄Π° большС!

βž•Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ идСально подходят для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ состояния. Π‘ΠΎΠ³Π»Π°ΡΠΈΡ‚Π΅ΡΡŒ, класс с ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ конструктором Π±Π΅Π· состояния β€” это кастрат ΠΊΠΎΡΡ‚Ρ‹Π»ΡŒ.

βž•Π”Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Π΅Π΅ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ класса.

βž•Π’ ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ» ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, это Π½Π΅ Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ стандарты. ΠŸΡ€ΠΈ этом Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

βž•Π’Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ классы, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² нСймспСйсС, Π½ΠΈΡ‡Ρ‚ΠΎ Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Π²Π°ΠΌ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ свои Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ модуля.

βž•Π€ΡƒΠ½ΠΊΡ†ΠΈΡ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Π΅Π΅ выглядит Π² Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌ ΠΊΠΎΠ΄Π΅: myFunction() vs MyClass::myMethod().



ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ всё Ρ‚Π΅ ΠΆΠ΅: низкая цикломатичСская ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, нСбольшоС количСство ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², SRP. Если Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ "Ρ€Π°Π·Π΄ΡƒΠ»ΠΎ", Ρ‚ΠΎ Π»ΠΈΠ±ΠΎ Π΅Ρ‘ Π½Π°Π΄ΠΎ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ Π½Π° нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, Π»ΠΈΠ±ΠΎ Π·Π°Π΄Π°Ρ‡Ρƒ всё-Ρ‚Π°ΠΊΠΈ Π½Π°Π΄ΠΎ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ с использованиСм классов.



Π’ΠΎΡ‚ нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ· нашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°: https://gist.github.com/vudaltsov/eb53927894cb467588e67352e2d8f1d9.



И напослСдок ΡΡ‚Π°Ρ‚ΡŒΡ Никиты Попова, которая нСсколько Π»Π΅Ρ‚ Π½Π°Π·Π°Π΄ ΠΌΠΎΠ³Π»Π° ΠΌΠ½Π΅ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΊ функциям: https://www.npopov.com/2012/08/10/Are-PHP-developers-functophobic.html.



Пиши Π² коммСнтариях, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΡˆΡŒ Π»ΠΈ Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ Π½Π΅Ρ‚ ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ.