BASEã®ã¹ãã³ãµãŒããŒã¹ã®æ§å ããã«ã¡ã¯ïŒãã£ããç§ããããªããæ¶Œãããªã£ãŠããŸããããçããããããéããã§ããããã ããŠããã®åºŠã¯ã2023/10/08(æ¥)ã«éå¬ããã PHP Conference Japan 2023 ã«ãŽãŒã«ãã¹ãã³ãµãŒãšããŠåè³ããBASEã®ãšã³ãžãã¢ãç»å£ããŸããã ä»åã¯ãç»å£è
ããã³ã¡ã³ããšãäŒå Žãã¹ãã³ãµãŒããŒã¹ã®æ§åã«ã€ããŠãå±ãããŸãïŒ PHP Conference Japan 2023ãšã¯ PHP Conference Japan 2023ã¯ã2023/10/08(æ¥)ã«éå¬ãããåœå
æå€§çŽã®PHPã«ã³ãã¡ã¬ã³ã¹ã§ãã BASE ã¯ãããŸã§ã«ãéå¬ãããŠãã PHP ã«ã³ãã¡ã¬ã³ã¹ãžã®ç»å£äžŠã³ã«ã¹ãã³ãµãŒãã³ãã¥ããã£è²¢ç®æŽ»åãšããŠè¡ã£ãŠåããŸãããä»åã¯ãŽãŒã«ãã¹ãã³ãµãŒãšããŠåœã«ã³ãã¡ã¬ã³ã¹ã«åè³ããŠããŸãã ç»é¢å·ŠåŽã«BASEã®ã³ãŒãã¬ãŒãã㎠ç»å£è
ã®ã³ã¡ã³ã glassmonkey ( @glassmonekey ) ã€ãã³ããç²ãæ§ã§ãããæ°žéã§ãã PHPãšããããŒãã顿ã«ã¿ãªãããšäº€æµã§ããŠæé«ã«æ¥œãã1æ¥ã§ããã åæã«èŠããã»ãã·ã§ã³ãè€æ°ãã£ããã§äœãè€æ°ãã£ãã!!ãšæã1æ¥ã§ããã ç»å£å
容èªäœã¯æ¥åã§ã¯çŸç¶äœ¿ã£ãŠãªããã®ã®ãä»åŸäœ¿ãå¯èœæ§ãé«ãWasmã«ã€ããŠã話ããããŠããã ããŸããã ãããã§ããã§ãããã? ç§èªèº«ãWasmã¯ãã©ãŠã¶äžã®æè¡ãšããåºå®èŠ³å¿µããã£ãã®ã§ããã åŠç¿ããŠãããã¡ã«ããã¯ãšã³ããšã³ãžãã¢ãšããŠãã£ããã¢ããããŠãããã»ããè¯ãæè¡ã§ãããšããåŠã³ããããŸããã ä»åã®ããŒã¯ã§ããã®äžç«¯ãçããã«å°ãã§ããäŒãåºæ¥ãã®ãªãå¬ããæããŸãã ãã²ãè¯ãWasmã©ã€ãã!! speakerdeck.com ã¹ãã³ãµãŒããŒã¹ã®æ§å ããããã¯ã¹ãã³ãµãŒããŒã¹ã®æ§åããå±ãããŸãïŒ ä»å¹Žã¯ãBASEããã®PHPerãžã®ææŠç¶ããšããã¯ã€ãºäŒç»ãéå¬ããŸããã ãBASEããã®PHPerãžã®ææŠç¶ããè§£ããŠããåå è
ã®æ§å ã¹ãã³ãµãŒããŒã¹ã«æ¥ãŠé ããæ¹ã«ããããã·ã§ããäœæãµãŒãã¹ãBASEãããå©çšããã ããŠãã COZY COFFEE ããã®ã³ãŒããŒããã¯ãé
åžããŸããã cozycoffee.thebase.in ã³ãŒããŒããã¯ãšBASEããŽã«ãããtipi ãBASEããã®PHPerãžã®ææŠç¶ãã®è§£èª¬ ããããã¯ãBASEããã®PHPerãžã®ææŠç¶ãã«ãŠåºé¡ããã¯ã€ãºã®æ£è§£ãšãæ£è§£çã解説ãããŸãã åé¡1 (æ£è§£ç: 71.4%) PHP8.0.xã®ã»ãã¥ãªãã£ãµããŒãã®çµäºæ¥ã¯ãã€ã§ãããã? 次ã®éžæè¢ãã1ã€éžãã§ãã ããã 2022幎11æ28æ¥ 2023幎11æ26æ¥ 2024幎11æ25æ¥ 2025幎12æ8æ¥ æ£è§£ãšè§£èª¬ã¯ãã¡ã 2. 2023幎11æ26æ¥ è§£èª¬ ã¡ãžã£ãŒããŒãžã§ã³ããã€ããŒããŒãžã§ã³ã®ã»ãã¥ãªãã£ãµããŒãçµäºæ¥ã¯ä»¥äžã®ããŒãžã§ç¥ãããšãã§ããŸãã PHP: Supported Versions (ãµããŒãäžã®ãã®) PHP: Unsupported Branches (ãµããŒãçµäºãããã®) ãã¡ãã«ããã°åæ¥ä»ã¯ä»¥äžã®PHPããŒãžã§ã³ã®ã»ãã¥ãªãã£ãµããŒãçµäºæ¥ã«ãªããŸãã 2022幎11æ28æ¥ã¯PHP7.4 2023幎11æ26æ¥ã¯PHP8.0.x 2024幎11æ25æ¥ã¯PHP8.1.x 2025幎12æ8æ¥ã¯PHP8.2.x åé¡2 (åºé¡ãã¹ããããŸããã詳ããã¯ãæ£è§£ãšè§£èª¬ã¯ãã¡ããã«èšèŒ) (åèæ£è§£ç: 54.3%) empty ã®æåã§æ£ããã®ã¯ã©ãã§ããã? æ£ãã説æã ãšæãã®ã1ã€éžãã§ãã ããã 倿°ãååšãããã€ç©ºæååãŸãã¯ãŒããŸãã¯falseã®å Žåã«trueãè¿ããŸãã 倿°ãååšãããã€ç©ºã§ãªãæååãŸãã¯ãŒããŸãã¯falseã®å Žåã«trueãè¿ããŸãã 倿°ãååšãããã©ããã確èªãã倿°ãååšããªãå Žåã«trueãè¿ããŸãã 倿°ãååšããªãå Žåã«trueãè¿ãããã以å€ã®å Žåã«falseãè¿ããŸãã æ£è§£ãšè§£èª¬ã¯ãã¡ã åºé¡åŽã§äºåã«æ³å®ããŠããæ£è§£ã¯ 2. 倿°ãååšãããã€ç©ºã§ãªãæååãŸãã¯ãŒããŸãã¯falseã®å Žåã«trueãè¿ããŸãã ã§ããã ãããã¯ã€ãºã«ææŠããã ããäœåãã®æ¹ããç°è°ããããŸããã®ã§å顿ãšçããèŠçŽãããšãããæ£è§£ãç°ãªã£ãŠãããã ãšãã話ã«ãªããŸããã ç³ãèš³ãããŸããã§ããã æ£ãã説æ1ã€ãéžæããåé¡ã§ããããæ£è§£ã¯ éžæè¢1. ãš éžæè¢3. ã«ãªããŸãã 解説 empty() ã§ã true ãè¿ããã¿ãŒã³ã¯ä»¥äžã®PHPããã¥ã¢ã«ã«è§£èª¬ããããŸãã PHP åã®æ¯èŒè¡š empty($x); ã true ãè¿ãã®ã¯ä»¥äžã®ãã¿ãŒã³ã§ãã ãã¿ãŒã³1. $x = ""; (空æåå) ãã¿ãŒã³2. $x = null; (null) ãã¿ãŒã³3. var $x; (PHP5.0æªæºã§ã䜿çšå¯èœãªãã¯ã©ã¹ã®ããããã£ã宣èšããæ¹æ³ã) ãã¿ãŒã³4. $x ãæªå®çŸ© ãã¿ãŒã³5. $x = []; (空ã®é
å) ãã¿ãŒã³6. $x = false; boolåã®false ãã¿ãŒã³7. $x = 0; æ°å€ã®0 ãã¿ãŒã³8. $x = "0"; æååã®0 ãã¡ããèžãŸããŠãããããã®éžæè¢ã empty ã®æ£ããæåãã©ããã¿ãŠãããŸãã éžæè¢1, 2, 3ã¯ã empty()ãtrueãè¿ãå Žå ã®èª¬æãéžæè¢4㯠empty()ãtrueãè¿ãå Žåãšfalseãè¿ãå Žå ã«ã€ããŠèª¬æããŠããŸããã éžæè¢1. 倿°ãååšãããã€ç©ºæååãŸãã¯ãŒããŸãã¯falseã®å Žåã«trueãè¿ããŸãã ãã¿ãŒã³1ã8 ãç¶²çŸ
ããŠã¯ããŸãããããã¿ãŒã³1, 7, 6 ã®å Žåã« true ãè¿ãããšã®ããšãªã®ã§ã éžæè¢1ã¯æ£è§£ ã éžæè¢2. 倿°ãååšãããã€ç©ºã§ãªãæååãŸãã¯ãŒããŸãã¯falseã®å Žåã«trueãè¿ããŸãã ãã¿ãŒã³7, 6ã«ã€ããŠã¯æ£ãã説æã«ãªã£ãŠããŸããã ãã¿ãŒã³8ã«é¢é£ãã説æã空ã§ãªãæååã§ true ãè¿ããã®ã¯ "0" ã®å Žåã®ã¿ã§ããã ãã以å€ã®æååã§ã¯ false ãè¿ãã®ã§ã éžæè¢2ã¯äžæ£è§£ ã éžæè¢3. 倿°ãååšãããã©ããã確èªãã倿°ãååšããªãå Žåã«trueãè¿ããŸãã https://www.php.net/manual/ja/function.empty.php ã«ã¯ä»¥äžã®èšè¿°ããããŸãã ã€ãŸãã empty() Â ã¯æ¬è³ªçã«Â !isset($var) || $var == false  ãšåãããšãç°¡æœã«èšè¿°ããŠããã ãã§ãã ãã¡ãã®èšè¿°ã«åèŽããŠãããã empty() ã¯ã倿°ã®ååšã確èªããŠããŸããã éžæè¢3ã¯æ£è§£ ãšèšããŸãã(ãã¿ãŒã³4ã®èª¬æãããŠãã) éžæè¢4. 倿°ãååšããªãå Žåã«trueãè¿ãããã以å€ã®å Žåã«falseãè¿ããŸãã ãã¡ãããã¿ãŒã³4ã«åèŽããŠããŸãããä»ã« true ãè¿ããã¿ãŒã³1ã3, 5~8ã«ã€ããŠééã£ã説æã«ãªã£ãŠããã®ã§ éžæè¢4ã¯äžæ£è§£ ã PHP: empty - Manual PHP: PHP åã®æ¯èŒè¡š - Manual åé¡3 (æ£è§£ç: 8.6%) PHP8.3ããã§ããããã«ãªã£ã Random\Randomizer ã¯ã©ã¹ã®æåã§æ£ããã®ã¯ã©ãã§ãããã? æ£ãã説æã ãšæãã®ã2ã€éžãã§ãã ããã echo $randomizer->getBytes(10); echo $randomizer->getInt(0, 100) echo $randomizer->getBytesFromString('abcdefghijklmnopqrstuvwxyz0123456789', 16); echo $randomizer->nextFloat(); echo implode(',', $randomizer->shuffleArray(['äœè€', 'éŽæš', '髿©'])); æ£è§£ãšè§£èª¬ã¯ãã¡ã 3. echo $randomizer->getBytesFromString('abcdefghijklmnopqrstuvwxyz0123456789', 16); 4. echo $randomizer->nextFloat(); éžæè¢1,2,5ã¯PHP 8.2ããã§ããã®ã§äžæ£è§£ã§ãã éžæè¢3,4ã¯PHP 8.3ããã§ããããã«ãªã£ãã®ã§æ£è§£ã§ãã PHP: Random\Randomizer - Manual PHP: Random\Randomizer::getBytesFromString - Manual PHP: Random\Randomizer::nextFloat - Manual åé¡4 (æ£è§£ç: 14.3%) PHP8.2ã§æžããããµã³ãã«ã³ãŒãããããŸããã€ã³ã¹ã¿ã³ã¹ã¡ãœãããã Sample::func() ãã®ä»®åŒæ°ã®åã«æå®ããŠãPHPãšã©ãŒãçºçããªããã®ã3ã€éžãã§ãã ããã (â»PHPããŒãžã§ã³ã¯8.2ã§ãPHPã³ãŒãã§å®çŸ©ãããŠããã¯ã©ã¹ã¯ Sample 以å€ã«ãªããã®ãšããŸã) int|string null namespace void self static never æ£è§£ãšè§£èª¬ã¯ãã¡ã 1. int|string 2. null 5. self 解説 æ£è§£ã®éžæè¢1, 2, 5 ã¯ä»®åŒæ°ã®åã«æå®ã§ããŸããéžæè¢3. ã¯åãšããŠæå®ã§ããŸããã éžæè¢4, 6, 7ã¯ãæ»ãå€åã«ã¯æå®ã§ããŸãããä»®åŒæ°ã®åã«ã¯æå®ã§ããŸããã PHP: å - Manual PHP: åå®£èš - Manual PHP: ã¯ã©ã¹å
ã§ã®é¢ä¿ã瀺ãçžå¯Ÿå - Manual åé¡5 (æ£è§£ç: 25.0%) ããªãã¯BASEã«å
¥ç€ŸããŠããããã¯ãã³ãŒããèªãã§ããŸãã 以äžã®ã³ãŒãããã£ããšããæçµçãªååã®éé¡ã¯ãããã«ãªãã§ããããïŒæ¬¡ã®éžæè¢ããéžãã§ãã ããã ãªãPHPããŒãžã§ã³ã¯8.2ã§ãä»åã®åé¡ã§è¡šç€ºãããŠããã¯ã©ã¹ä»¥å€ã¯ç¡ããã®ãšããŸãã ï¿¥1,045 ï¿¥1,815 ï¿¥2,035 ï¿¥2,145 ï¿¥2,585 https://gist.github.com/cocoeyes02/a51d1855d31d7b85f6b2ec9973b12c36 ïŒã³ãŒãã®è¡æ°ãé·ããããgistã«è¡šç€ºããŠããŸãïŒ æ£è§£ãšè§£èª¬ã¯ãã¡ã 4. ï¿¥2,145 以äžã®ãªã³ã¯ããã2145ãåºåãããŠããããšã確èªã§ããŸãã php-play.dev 解説 ãã®åé¡ã¯ãååããªãã·ã§ã³ãéæãã¯ãŒãã³ã䜿ã£ãŠçšèŸŒã®åèšéé¡ãç®åºããåé¡ã§ãã èšç®ã®é çªã¯ çšæã®åèšéé¡ãç®åºãã çšèŸŒã®åèšéé¡ãç®åºãã ãšããããã«ãªã£ãŠããŸãã çšæã®åèšéé¡ãç®åº ãŸãProductã¯ã©ã¹ã®totalã¡ãœãããèŠããšãçšæã®åèšéé¡ãååã®éé¡ ããªãã·ã§ã³æéã®åèšéé¡ ãéæãå²åŒé¡ã§æ§æãããŠããããšãããããŸãã <?php public function total () : Price { $ optionTotalPrice = $ this -> optionGroup -> total () ; $ discount = $ this -> coupon -> getDiscount () ; $ totalPrice = new Amount ( 0 ) ; $ totalPrice = $ totalPrice -> add ( $ this -> productPrice -> value ) // ååã®éé¡ -> add ( $ optionTotalPrice ) // ãªãã·ã§ã³æéã®åèšéé¡ -> add ( $ this -> fee -> value ) // éæ -> sub ( $ discount ) ; // å²åŒé¡ if ( $ totalPrice -> isNegative ()) { throw new Error ( 'total price is negative' ) ; } return ( new Price ( $ totalPrice )) -> calculateTaxIncluded ( ItemTax :: getTaxPercentageByItemType ( $ this -> itemType )) ; } äžã€ãã€ç®åºããŠã¿ãŸãããã ãŸãååã®éé¡ã¯ãProductã¯ã©ã¹ã®constructã§ä»£å
¥ããã $productPrice ããã®ãŸãŸäœ¿ã£ãŠããã ããªã®ã§1,000ã«ãªããŸãã <?php public function __construct ( public ProductName $ name , public Price $ productPrice , // ååã®éé¡ ... ) { } <?php $ price = Price :: fromInt ( 1000 ) ; ãªãã·ã§ã³æéã®åèšéé¡ã¯ãOptionGroupã¯ã©ã¹ã®totalã¡ãœãããããconstructã§ä»£å
¥ãããOptionã®éé¡ãåèšããŠããŸãã ä»åã¯ãªãã·ã§ã³ã2ã€è¿œå ããŠããã100 + 50 = 150ã«ãªããŸãã <?php public function total () : Amount { $ total = new Amount ( 0 ) ; foreach ( $ this -> options as $ option ) { $ total = $ total -> add ( $ option -> price -> value ) ; // åOptionã®éé¡ã®åèšå€ãç®åº } return $ total ; } <?php $ optionGroup = new OptionGroup ( [ new Option ( 'ã©ããã³ã°' , new Price ( new Amount ( 50 ))) , new Option ( 'ååå
¥ã' , new Price ( new Amount ( 100 ))) , ] , ) ; éæã¯ãFeeã¯ã©ã¹ã®createFromSubtotalã¡ãœãããããååã®éé¡ãšãªãã·ã§ã³ã®åèšéé¡ã®åèšå€ãããã¯ãŒãã³ã®å²åŒé¡ãå·®ãåŒããå°èšã䜿ã£ãŠç®åºããŠããŸãã ä»åã®å°èšã¯ã1,000 + 150 - 200 = 950 ã§ãã ãããããFeeTypeã¯ã©ã¹ã®createFromIntã¡ãœããã«ãã察å¿è¡šã«ç®åºããå°èšãããŠã¯ããŠãéæãç®åºããŠããŸãã ä»åã¯å°èšã1,000ãäžåãã®ã§ãéæã¯1,000ã§ãã <?php public static function createFromSubtotal ( Price $ price , OptionGroup $ optionGroup , Coupon $ coupon , ) : self { $ subtotal = new Amount ( 0 ) ; // å°èš $ subtotal -> add ( $ price -> value ) // ååã®éé¡ -> add ( $ optionGroup -> total ()) // ãªãã·ã§ã³ã®åèšéé¡ -> sub ( $ coupon -> getDiscount ()) ; // ã¯ãŒãã³ã®å²åŒé¡ $ fee = FeeType :: createFromInt ( $ subtotal -> toInt ()) ; return new self ( new Amount ( $ fee -> value )) ; } <?php enum FeeType : int { case Free = 0 ; case FiveHundred = 500 ; case OneThousand = 1000 ; public static function createFromInt ( int $ value ) : self { return match ( true ) { $ value >= 1500 => self :: Free, // éé¡ã1500å以äžã ã£ããéæç¡æ $ value >= 1000 => self :: FiveHundred, // éé¡ã1500åæªæºã1000å以äžã ã£ããéæ500å $ value >= 0 => self :: OneThousand, // éé¡ã1000åæªæºã ã£ããéæ1000å } ; } } å²åŒé¡ã¯ãã¯ãŒãã³ã®å²åŒé¡ããç®åºããŠããŸãã ãã ããItemTypeãããžã¿ã«ã³ã³ãã³ãã§ããå Žåã¯å²åŒãå¹ããŸããã ä»åã¯ãItemTypeãäºçŽååã§ããããå²åŒãå¹ããŸãã ãã£ãŠå²åŒé¡ã¯200ã§ãã <?php public function getDiscount () : Amount { if ( !$ this -> isAvailable ()) { return new Amount ( 0 ) ; // ã¯ãŒãã³ã䜿ããªãå Žåã¯å²åŒé¡ã¯0å } return new Amount ( $ this -> discountAmount -> toInt ()) ; } public function isAvailable () : bool { return match ( $ this -> itemType ) { ItemType :: Lottery, ItemType :: PreOrder => true , ItemType :: DigitalContent => false , } ; } <?php $ coupon = new Coupon ( $ itemType , new Amount ( 200 )) ; ããã§çšæã®åèšéé¡ãæ±ããäžã§å¿
èŠãªéé¡ãå
šãŠç®åºã§ããŸããã æ¹ããŠæžããš ååã®éé¡ïŒ1,000 ãªãã·ã§ã³æéã®åèšéé¡ïŒ150 éæïŒ1000 å²åŒé¡ïŒ200 ã§ãã ãã£ãŠèšç®ãããšã1000 + 150 + 1000 - 200 = 1,950ã«ãªããçšæã®åèšéé¡ã¯Â¥1,950ã§ãã çšèŸŒã®åèšéé¡ãç®åº çšæã®åèšéé¡ãç®åºããããçšèŸŒã®éé¡ãç®åºããŸãã çšèŸŒã®éé¡ã¯ãååã¿ã€ãã«ãã£ãŠçšçãæ±ºãŸã£ãŠããŸããä»åã¯äºçŽååãæ±ã£ãŠããã®ã§ãçšçã¯10%ã«ãªããŸãã <?php return ( new Price ( $ totalPrice )) -> calculateTaxIncluded ( ItemTax :: getTaxPercentageByItemType ( $ this -> itemType )) ; <?php public function calculateTaxIncluded ( TaxType $ taxType ) : self { $ amount = $ this -> value -> multiply ( $ taxType -> getPercentage ()) ; return new self ( $ amount ) ; } <?php class ItemTax { public static function getTaxPercentageByItemType ( ItemType $ itemType ) : TaxType { return match ( $ itemType ) { ItemType :: DigitalContent, ItemType :: PreOrder => TaxType :: Ten, // äºçŽååã®çšçã¯10% default => TaxType :: Eight, } ; } } çšæã®åèšéé¡ã¯1,950ãªã®ã§ãèšç®ãããš 1,950 à 1.1 = 2,145 çšèŸŒã®åèšéé¡ã¯Â¥2,145ã«ãªããŸãã ä»åã¯totalã¡ãœããã®å€ããã®ãŸãŸåºåããŠãããããtotalã¡ãœããã®è¿ãå€ã§ããçšèŸŒã®åèšéé¡ãçãã«ãªããŸãã ãã£ãŠçãã¯ãéžæè¢4ã®Â¥2,145ã§ãã <?php echo $product->total()->value->toInt(); è¬èŸ åè³ã»ç€Ÿå¡ã®ã¹ããŒã«ãŒåå ãéã㊠PHP ã³ãã¥ããã£ã®çãäžããã«è²¢ç®ã§ããåŒç€ŸãšããŠã倧倿æçŸ©ãªæéãšãªããŸããã ã¹ã¿ããã®æ¹ã
ã«ã¯æ¥åã§ãå¿ããã«ãé¢ããããå€ãã®æéãã«ã³ãã¡ã¬ã³ã¹æºåãžæ³šãã§ããã ããããšæããŸãããã®å ŽãåããŠåŸ¡ç€Œç³ãäžããŸãã ããã§ã¯ãæ¥å¹ŽããäŒãããŸãããïŒ