æä»£é ãã®æ å ±ããŠã§ãäžã«ããµããŠããããããªæ å ±ãèŠãPHPåå¿è ã¯æžæã£ãŠããŸãã ããããããŠããŸããææ³ããŸããã³ãŒããåºãŸã£ãŠããŸãã ãããªã®ã¯ãããããããPHP: The Right Way ã¯æ°è»œã«èªããã¯ã€ãã¯ãªãã¡ã¬ã³ã¹ã ãPHPã®äžè¬çãªã³ãŒãã£ã³ã°èŠçŽã ãŠã§ãäžã®ããã§ãããã¥ãŒããªã¢ã«ãžã®ãªã³ã¯ããããŠçŸæç¹ã§ã®ãã¹ããã©ã¯ãã£ã¹ã ãšå·çè ãèããŠããããšããŸãšããã
倧äºãªã®ã¯ã PHPã䜿ãããã®æ£åŒãªãäœæ³ãªã©ååšããªã ã£ãŠããšã ãã®ãµã€ãã®çãã¯ãã¯ãã㊠PHP ã䜿ãããšã«ãªã£ãéçºè ã«ãããããªãããã¯ã玹ä»ããããšã çµéšè±å¯ãªããã®äººã«ãšã£ãŠãããããŸã§æ·±ãèããããšãªã䜿ã£ãŠããå 容ã«ã€ããŠãæ°é®®ãªèŠæ¹ãäŒããããã ããã ãã®ãµã€ãã¯ã決ããŠãã©ã®ããŒã«ã䜿ãã°ããã®ãããæãããã®ãããªãã ããã€ãã®éžæè¢ã瀺ããŠãããããã®éãã䜿ãéãã§ããéã玹ä»ããã
ãã®ãµã€ãã¯ä»ãæé·äžãªã®ã§ãæçšãªæ å ±ããµã³ãã«ãªã©ãèŠã€ããã°ã©ãã©ãæŽæ°ããŠããã€ããã ã
PHP: The Right Way ã¯ãä»ã®èšèªã«ã翻蚳ãããŠããã
ææ°çã® PHP: The Right Way ïŒè±èªçïŒã¯PDFãEPUBãMOBIã§ãå ¬éãããŠããã Leanpubã§ã²ãããããã
ã¿ããªã§ãã®ãµã€ãããã£ãšãããã®ã«ããããPHPãå匷ããã人ãã¡ã®ããã«è¯è³ªãªæ å ±ãéãããã ! GitHubã§ãã
ãšãããã PHP ã詊ãããã£ãŠããã®ãªããææ°ã®å®å®çã§ãã PHP 8.3 ã䜿ããã PHP 8.x ã§ã¯ãPHP 7.x ã 5.x ç³»ã«ã¯ãªãæ°ã ã®åŒ·åãªæ°æ©èœã远å ãããã ãšã³ãžã³ãå€§å¹ ã«æžãçŽãããä»ãŸã§ã®ããŒãžã§ã³ããããã£ãšé«éã«ãªã£ãŠããã PHP 8 ã¯èšèªã®ã¡ãžã£ãŒã¢ããããŒãã§ãããããããã®æ°æ©èœãæé©åãå«ãŸããŠããã
ææ°çãã§ããã ãæ©ãã«è©ŠããŠã¿ãã¹ãã ã PHP 7.4 㯠ãã§ã«ãµããŒããçµäºããŠããã ã¢ããã°ã¬ãŒãã¯ãšãŠãç°¡åã ããšããã®ããéå»ãšã®äºææ§ãæãªããããªå€æŽ(PHP 8.3), (PHP 8.2), (PHP 8.1), (PHP 8.0) ããããªã«å€ããªãããã ã äœãã®é¢æ°ãæ©èœãã©ã®ããŒãžã§ã³ã«å«ãŸããŠããã®ããç¥ããããã°ãphp.net ã«ããããã¥ã¢ã«ã調ã¹ããã
PHPã®å匷ãå§ãããšãã«ãããããæ¬æ ŒçãªãŠã§ããµãŒããŒãã€ã³ã¹ããŒã«ããå¿ èŠã¯ãªãããããPHP 5.4以éãªããããµãŒããŒãç«ã¡äžãããã£ãããã¿ãŒããã«ã§ãããžã§ã¯ãã®ã«ãŒããã£ã¬ã¯ããªã«è¡ã£ãŠããããªã³ãã³ããå®è¡ããã ãã§ãããã ã
> php -S localhost:8000macOS ã«ã¯ PHP ãæåããã€ã³ã¹ããŒã«ãããŠãããã©ãææ°ã®å®å®çããã¯åŸ®åŠã«é ããŠããã ææ°ã® PHP ã macOS ã«ã€ã³ã¹ããŒã«ããã«ã¯ãããã€ãã®æ¹æ³ãããã
Homebrew 㯠macOS çšã®åŒ·åãªããã±ãŒãžç®¡çããŒã«ã§ã PHP ããã®æ¡åŒµã¢ãžã¥ãŒã«ãç°¡åã«ã€ã³ã¹ããŒã«ã§ããã Homebrew ã®ã³ã¢ãªããžããªã§ãPHP 7.4ã8.0ã8.1ã8.2ããã㊠PHP 8.3 çšã® âformulaeâ ãå ¬éãããŠããã
ææ°çã® PHP ãã€ã³ã¹ããŒã«ããã«ã¯ããããªã³ãã³ããå®è¡ããã°ããã
brew install php@8.3
Homebrew ã® PHP ã®ããŒãžã§ã³ãåãæ¿ããã«ã¯ãç°å¢å€æ° PATH ãèšå®ããã°ããã
brew-php-switcher ã䜿ãã°ããã®ãžããèªåçã«ãã£ãŠãããã
æåã§ãªã³ã¯ãæ¶ãããã远å ãããããããšã§ã䜿ããã PHP ã®ããŒãžã§ã³ã«æåã§åãæ¿ããããšãã§ããã
brew unlink php
brew link --overwrite php@8.2
brew unlink php
brew link --overwrite php@8.3
MacPorts ãããžã§ã¯ãã¯ãªãŒãã³ãœãŒã¹ã®ã³ãã¥ããã£ã«ããåãçµã¿ã§ã macOS äžã®ãªãŒãã³ãœãŒã¹ãœãããŠã§ã¢ã®ã³ã³ãã€ã«ãã€ã³ã¹ããŒã«ãããŠã¢ããã°ã¬ãŒããç°¡åã«ã§ããããã«ããä»çµã¿ã ã ã³ãã³ãã©ã€ã³ã®ãœããããX11ãAquaããŒã¹ã®ãœããã«ãŸã§å¯Ÿå¿ããŠããã
MacPorts ã¯ã³ã³ãã€ã«æžã¿ã®ãã€ããªã«ã察å¿ããŠããã®ã§ãé¢é£ããã©ã€ãã©ãªãªã©ãæ¯åãœãŒã¹ããã³ã³ãã€ã«ããªããå¿ èŠã¯ãªãã ãªã®ã§ããŸã äœãããã±ãŒãžãã€ã³ã¹ããŒã«ããŠããªãç¶æ ã§ããæéã®å¿é ãããå¿ èŠã¯ãªãã
çŸæç¹ã§ã€ã³ã¹ããŒã«ã§ããã®ã¯ php54ãphp55ãphp56ãphp70ãphp71ãphp72ãphp73ãphp74ãphp80ãphp81ãphp82ãphp83 ã®ããããã§ãport install ã³ãã³ãã䜿ã£ãŠãã®ããã«ã€ã³ã¹ããŒã«ããã
sudo port install php74
sudo port install php83
ãããŠãselect ã³ãã³ãã䜿ã£ãŠãã¢ã¯ãã£ã㪠PHP ãåãæ¿ããã
sudo port select --set php php83
phpbrew ã¯ãè€æ°ã®ããŒãžã§ã³ã® PHP ãã€ã³ã¹ããŒã«ããŠç®¡çããããã®ããŒã«ã ã 䜿ã£ãŠããã¢ããªã±ãŒã·ã§ã³ããããžã§ã¯ãã«ãã£ãŠãPHP ã®ããŒãžã§ã³ãç°ãªãå Žåã«ç¹ã«äŸ¿å©ã§ã ä»®æ³ãã·ã³ãçšæããå¿ èŠããªããªãã
php-osx.liip.ch ã¯ããã£ãäžè¡ã§ PHP ãã€ã³ã¹ããŒã«ã§ããæ¹æ³ã ãããŒãžã§ã³ 5.3 ãã 7.3 ã«å¯Ÿå¿ããŠããã Apple ãã€ã³ã¹ããŒã«ãã php ã®ãã€ããªã¯äžæžãããããŸã£ããå¥ã®å Žæ (/usr/local/php5) ã«ãã¹ãŠãã€ã³ã¹ããŒã«ããã
ããã²ãšã€ã®éžæè¢ãããã èªåã§ã³ã³ãã€ã« ããããšã ããã®æ¹æ³ãªãã€ã³ã¹ããŒã«ãã PHP ã®ããŒãžã§ã³ãå®å šã«ã³ã³ãããŒã«ã§ããã ãã®å Žåã¯ãXcode ãããã¯ãã®ä»£çšããŒã« âCommand Line Tools for XCodeâ ãã€ã³ã¹ããŒã«ããå¿ èŠãããããããã¯ã Apple ã® Developer Center ããããŠã³ããŒãã§ããã
ãããŸã§ã§èª¬æããæ¹æ³ã¯ PHP ãã®ãã®ã«é¢ãããã®ã°ããã§ããã以å€ã®ããšãã° ApacheãNginxãSQL server ãªã©ã¯æ±ã£ãŠããªãã MAMP ã XAMPP ã¿ãããªãå šéšå ¥ããã®ã€ã³ã¹ããŒã©ãŒã䜿ãã°ããã®ãããã®ãœãããäžç·ã«å ¥ãããããèšå®ãããŠããããããããã ã§ããã€ã³ã¹ããŒã©ãŒã«çžãããŠããŸã£ãŠèªç±ã«ããããªããªããšãã匱ç¹ãããã
windows.php.net/download ãããã€ããªãããŠã³ããŒããããããããå±éãããã PHPãã©ã«ãã®ã«ãŒã (php.exe ãããå Žæ) ã« PATH ãéããŠãããšãããããããã°ãã©ãããã§ã PHP ãå®è¡ã§ããããã«ãªãã
åŠç¿çšã«ããŒã«ã«ã§éçºããå Žå㯠PHP 5.4 以éã®ãã«ãã€ã³ãŠã§ããµãŒããŒã䜿ãã°ããã®ã§ã现ããèšå®ãæ°ã«ããå¿ èŠã¯ãªãã ãããŠã§ããµãŒããŒãšãMySQLãšããå«ãããå šéšå ¥ããã䜿ããããã°ãXAMPPãEasyPHPãOpenServerããããŠWAMPãªã©ããå§ãã ããããã䜿ãã° Windows çšã®éçºç°å¢ãææ©ãæ§ç¯ã§ããã
ãšã¯ãããã®ã®ããããã®ããŒã«ã¯å®éã®éçšç°å¢ãšåŸ®åŠã«ç°ãªãããªã®ã§ãããšãã°ãWindows ã§éçºã㊠Linux ã«ãããã€ã ãšãããå Žåã¯ç°å¢ã®éãã«æ°ãã€ããå¿ èŠãããã
Windows äžã§ã·ã¹ãã ãå®éçšããå Žåã¯ãIIS 7 ã䜿ããšããããããäžçªå®å®ããŠããããã€ããã©ãŒãã³ã¹ãåªããŠããã phpmanager (IIS 7 çšã® GUI ãã©ã°ã€ã³) ã䜿ãã° PHP ã®èšå®ã¯ç®¡çãã·ã³ãã«ã«ã§ããã IIS 7 ã«ã¯ FastCGI ãçµã¿èŸŒãŸããŠãããããã«äœ¿ããã åã« PHP ããã³ãã©ãšããŠèšå®ããã ãã§ããã ãã®å€ã®è©³ããæ å ±ã¯ãdedicated area on iis.netã« PHP å°çšã®ãšãªã¢ãããã
éçºç°å¢ãšéçšç°å¢ãéã£ãŠãããšãããåããããšãã«ããããªãã°ãçºçããã¡ã ã Windowsã§éçºããã¢ããªã±ãŒã·ã§ã³ãLinuxïŒãªã©ã®éWindowsç°å¢ïŒã§åãããŠããã®ãªããä»®æ³ãã·ã³ã䜿ãã¹ãã ã
Chris Tankersleyã¯åœŒãWindowsã§ã®PHPéçºã«ãããŠäœ¿ããããŒã«ã«ã€ããŠã®åœ¹ã«ç«ã€èšäºãæ®ããŠãããŠãããŠããã
webããã°ã©ãã³ã°ãå§ããããšããŠãã人ãã¡ããããæ¥ã質åã®ã²ãšã€ã¯ãåã¯ã©ãã«èªåã®ããã°ã©ãã³ã°ãããã¡ã€ã«ã眮ãã°ãããã ãïŒããšãããã®ã ã
äœå¹Žãã®éããã®çãã¯äžè²«ããŠã ããã¥ã¡ã³ãã«ãŒã ã«çœ®ãããšãããã®ã ã£ãããã®çãã¯å®ç§ã§ã¯ãªãããããã¥ã¡ã³ãã«ãŒãã¯ãããžã§ã¯ããå§ããã«ã¯ããå Žæã ã
ã»ãã¥ãªãã£äžã®çç±ãããèšå®ãã¡ã€ã«ã¯ãµã€ã蚪åè ãã¢ã¯ã»ã¹ã§ããå Žæã«çœ®ããŠã¯ãããªããå ¬éã¹ã¯ãªããã¯å ¬éãã£ã¬ã¯ããªã«çœ®ããéå ¬éã®èšå®ãããŒã¿ã¯å ¬éãã£ã¬ã¯ããªã®å€ã«çœ®ããŠããã®ãããã ããã
ããŒã ãCMSããã¬ãŒã ã¯ãŒã¯ã«ãã£ãŠãã£ã¬ã¯ããªæ§é ã¯ããããã®äœ¿ããæ¹ãããããåºæ¬ã¯ããã«åŸãã®ãããã ããããããããããã£ããã®ãªãã«ãããžã§ã¯ããã²ãšãã§å§ããå Žåã¯ãã©ã®ãããªãã¡ã€ã«ã·ã¹ãã æ§é ã䜿ãããšã決ãããã¯å°é£ã ããã
Paul M. Jonesã¯PHPé¢é£ã®äœäžãã®githubãããžã§ã¯ãã«å
±éããäœæ³ã«ã€ããŠçŽ æŽããã調æ»ãè¡ã£ãŠããã圌ã¯èª¿æ»ã«åºã¥ããŠããã¡ã€ã«ãšãã£ã¬ã¯ããªæ§é ã«ã€ããŠStandard PHP Package Skeletonã«ãŸãšããŠããã
ãã£ã¬ã¯ããªæ§é 㯠ããã¥ã¡ã³ãã«ãŒã 㯠public/ ãã£ã¬ã¯ããªãšããã¹ãã§ããããŠããããã¹ã㯠tests/ ãã£ã¬ã¯ããªãcomposerã§ã€ã³ã¹ããŒã«ãããããªãµãŒãããŒãã£ã®ã©ã€ãã©ãªã¯ vendor/ ãã£ã¬ã¯ããªãšããã®ãããã ããããã®ä»ã®ãã¡ã€ã«ããã£ã¬ã¯ããªã«ã€ããŠããStandard PHP Package Skeletonã«åŸãããšããããžã§ã¯ãã®ã¡ã³ããŒã«ãšã£ãŠæãçã«å¶ãã ããã
PHP ã®ã³ãã¥ããã£ã¯ãšãŠãã§ã£ãããŠãããããªäººãã¡ãããã ãããŠãæ°ãåããªãã»ã©ã®ã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ãããŠã³ã³ããŒãã³ããååšããã ãããªäžããããã€ãéžãã§ããããçµã¿åãããŠã²ãšã€ã®ãããžã§ã¯ãã§äœ¿ãã£ãŠããã®ãããããããšã ã 倧åãªã®ã¯ãPHP ã®ã³ãŒããæžããšãã«ã(ã§ããã ã) æšæºçãªã¹ã¿ã€ã«ã«åŸãããšã ã ããããã°ãããããªã©ã€ãã©ãªãçµã¿åãããŠäœ¿ãã®ãç°¡åã«ãªãã
Framework Interop Group ã£ãŠãããšãã ããããããã®ã¹ã¿ã€ã«ãææ¡ããŠããã ã³ãŒãã£ã³ã°ã¹ã¿ã€ã«ãšã¯é¢ä¿ãªããã®ãããããã©ãPSR-1ãPSR-12ãPSR-4ããã㊠PER Coding Style ã¯ã³ãŒãã£ã³ã°ã¹ã¿ã€ã«ãæ±ã£ãŠããã ããã£ãŠèŠããã«ã Drupal ã ZendãSymfonyãLaravelãCakePHPãphpBBãAWS SDKãFuelPHPãLithium ãªã©ã®ãããžã§ã¯ããæ¡çšãã€ã€ããèŠçŽããŸãšããã ãã®ãã®ãªãã ã èªåã®ãããžã§ã¯ãã§ããã䜿ã£ãŠãããããä»ãŸã§ã®èªåã®ã¹ã¿ã€ã«ã䜿ãç¶ããŠãããã
çæ³ãèšãã°ãPHP ã®ã³ãŒããæžããšãã«ã¯ãããç¥ãããäœããã®æšæºèŠçŽã«åŸãã¹ãã ã ãã£ã説æããPSRã®çµã¿åããã§ãããããPEARãšãZendã®ãã€ã§ãããŸããªãã ããããã°ãä»ã®äººã«ãã³ãŒããèªãã§ãããããããªãããæå©ããåŸããããªãã ããã ãŸããã³ã³ããŒãã³ããå®è£ ããã¢ããªã±ãŒã·ã§ã³ãããããªãµãŒãããŒãã£ã®ã³ãŒããçµã¿åãããŠããäžè²«æ§ãä¿ãŠãã
PHP_CodeSnifferã䜿ãã°ã èªåã®ã³ãŒãããããã®æšæºã®ã©ããã²ãšã€ã«æºæ ããŠãããã©ããã確èªã§ããã ããšãSublime Textã¿ãããªããã¹ããšãã£ã¿ã®ãã©ã°ã€ã³ã䜿ãã°ã æžããŠãããã®å Žã§ãªã¢ã«ã¿ã€ã ã®ãã£ãŒãããã¯ãåŸãããã
ã³ãŒãã®ã¬ã€ã¢ãŠããèªåçã«ä¿®æ£ããããŒã«ãšããŠã¯ãäºã€ã®éžæè¢ãããã
phpcs ãã·ã§ã«ããæåã§å®è¡ããããšãã§ããã
phpcs -sw --standard=PSR1 file.php
ããã¯ããšã©ãŒã®å 容ãšãã®ä¿®æ£æ¹æ³ã衚瀺ããŠãããã ãã®ã³ãã³ããgit hookã«ä»èŸŒãã§ããã°äŸ¿å©ã ããã ããããã°ãæšæºèŠçŽã«åãã倿Žãå«ããã©ã³ãã¯ããããä¿®æ£ãããŸã§ãªããžããªã«æå ¥ã§ããªããªãã
PHP_CodeSnifferã䜿ã£ãŠããå Žåã¯ãææãããã³ãŒãã¬ã€ã¢ãŠãã®åé¡ãèªåçã«ä¿®æ£ããããšãã§ããããã®ããã«ã¯PHP Code Beautifier and Fixerã䜿ãã°ããã
phpcbf -w --standard=PSR1 file.php
ããã²ãšã€ã®éžæè¢ã¯PHP Coding Standards Fixerã§ã ããã¯ãå®éã«ä¿®æ£ãããŸãã«ã³ãŒãã«ã©ããªåé¡ããã£ãã®ãã衚瀺ããŠãããã
php-cs-fixer fix -v --rules=@PSR1 file.php
倿°ã颿°ãªã©ã®ã·ã³ãã«åããããŠãã£ã¬ã¯ããªåãªã©ã®ã³ãŒãåºç€ãªããã¯ãè±èªã«ããŠããããšãããããããã ã³ãŒãã®ã³ã¡ã³ãã«é¢ããŠã¯ãå¥ã«è±èªã«ãã ãããªããŠãããŸããªãã ãã®ã³ãŒããæ±ã(å°æ¥æ±ãå¯èœæ§ããã)ãã¹ãŠã®äººãèªã¿ããããã®ã§ããã°ãäœèªã§ãããŸããªãã
PHPã§ã¯ãªãŒã³ãªã³ãŒããæžãããã®è³æãšããŠãããããªã®ã Clean Code PHP ã ã
PHP ã¯æè»æ§ã®ããåçèšèªã§ãããããªããã°ã©ãã³ã°ãã¯ããã¯ã«å¯Ÿå¿ããŠããã é·å¹Žã®éã«åçã«æé·ããŠãããPHP 5.0 ã§ã®ãªããžã§ã¯ãæåã¢ãã«ã®è¿œå (2004 幎)ã PHP 5.3 ã§ã®ç¡å颿°ãåå空éã®è¿œå (2009 幎)ããã㊠PHP 5.4 ã§ã®ãã¬ã€ãã®è¿œå (2012 幎) ãªã©ãç¹çãã¹ããšããã ããã
PHP ã«ã¯å®å šãªãªããžã§ã¯ãæåããã°ã©ãã³ã°ã®æ©èœãæèŒãããŠããã ã¯ã©ã¹ãæœè±¡ã¯ã©ã¹ãã€ã³ã¿ãŒãã§ã€ã¹ãç¶æ¿ãã³ã³ã¹ãã©ã¯ã¿ãã¯ããŒã³ã äŸå€ãªã©ãªã©ãšãã£ãæ©èœããåœç¶äœ¿ããã
PHP ã¯ããã¡ãŒã¹ãã¯ã©ã¹ã®é¢æ°ããµããŒãããŠããã ã€ãŸãã颿°ã倿°ã«ä»£å ¥ã§ããã£ãŠããšã ã èªåã§å®çŸ©ãã颿°ã ãããããšããšçµã¿èŸŒãŸããŠãã颿°ã ãããã 倿°ã§åç §ãããåçã«å®è¡ãããã§ããã äœãã®é¢æ°ãå¥ã®é¢æ°ã®åŒæ°ãšããŠæž¡ãããš ( é«é颿° ã£ãŠããæ©èœ) ãã§ãããã颿°ã®è¿ãå€ãå¥ã®é¢æ°ã«ããããšãã§ããã
ååž° (ãã颿°ã®äžããèªåèªèº«ãåŒã¶ããš) ã PHP ã®æ©èœãšããŠãµããŒãããŠããã ãããããããŠãã® PHP ã³ãŒãã¯ããããã鿬¡åŠçãéèŠããŠããã
æ°åã®ç¡å颿° (ã¯ããŒãžã£ã«ã察å¿ãããã®) ã䜿ããããã«ãªã£ãã®ã¯ãPHP 5.3 (2009 幎) 以éã ã
PHP 5.4 ããã¯ãã¯ããŒãžã£ããªããžã§ã¯ãã®ã¹ã³ãŒãã«ãã€ã³ãã§ããããã«ãªã£ãã ãŸã callable ã®ãµããŒãã匷åãããã»ãšãã©ã®å Žåã§ç¡å颿°ãšäºææ§ãæã€ããã«ãªã£ãã
call_user_func_array()ã«ããåçãªé¢æ°å®è¡PHP ã¯ããããªåœ¢åŒã®ã¡ã¿ããã°ã©ãã³ã°ã«å¯Ÿå¿ããŠããããªãã¬ã¯ã·ã§ã³ API ãããžãã¯ã¡ãœããã䜿ããã
ããžãã¯ã¡ãœããã«ã¯ __get() ã __set()ã__clone()ã__toString()ããã㊠__invoke()
ãªã©ããããããããæŽ»çšããã°ã¯ã©ã¹ã®æ¯ãèããããã¯ã§ããã
Ruby ã®äººããããPHP ã«ã¯ method_missing ããªããŠããããšãèšããã©ãã¡ãããš
__call() ãšã __callStatic() ããããã
ãã£ããèšã£ããšãããPHP ã®ã³ãã¥ããã£ã§ã¯å€ãã®äººãã¡ãããããªã³ãŒããæžããŠããã ã£ãŠããšã¯ã誰ããæžããã©ã€ãã©ãªãšå¥ã®äººãæžããã©ã€ãã©ãªã§ã¯ã©ã¹åãããã£ãŠããŸãå¯èœæ§ããããšããããšã ã äž¡è ãåãåå空éã䜿ã£ãŠããããè¡çªããŠåé¡ã®åå ãšãªã£ãŠããŸãã
ãããªåé¡ã解決ããã®ã åå空é ã ã ããã¥ã¢ã«ã«ãããšãããåå空éã£ãŠããã®ã¯ OS ã®ãã¡ã€ã«ã·ã¹ãã ã®ãã£ã¬ã¯ããªãšäŒŒãŠãã åãååã®ãµãã€ã®ãã¡ã€ã«ãåäžãã£ã¬ã¯ããªã«çœ®ãããšã¯ã§ããªããã©ã å¥ã ã®ãã£ã¬ã¯ããªã«åããã°å ±åã§ãããšããããã ã åæ§ã«ãå¥ã ã®åå空éã«åããã°åãååã®ã¯ã©ã¹ããµãã€ãã£ãŠãå ±åã§ãããç°¡åã«èšããšãããããããšã
èªåã®æžãã³ãŒãã«ããåå空éãæå®ããããšã倧åã ã ããããã°ã誰ãä»ã®äººãããªãã®ã³ãŒãã䜿ããšãã«ããããä»ã®ã©ã€ãã©ãªãšç«¶åããªãããªã ãšæ©ãŸãã«æžãã
åå空éã®ããããã®äœ¿ãæ¹ã PSR-4 ã«ãŸãšãŸã£ãŠããã ãã®ææžã®çãã¯ããã¡ã€ã«ãã¯ã©ã¹ãããŠåå空éã®åœåèŠåãæšæºåã㊠ãäºãã«åå©çšããããããããšã ã
2014幎10æãPHP-FIG ã¯ãªãŒãããŒãã£ã³ã°ã«é¢ããæšæºã§ãã£ã PSR-0 ãéæšå¥šãšããã PSR-0ãPSR-4ããä»ã¯ã©ã¡ãã§ã䜿ããã ãšããã®ã PSR-4 㯠PHP 5.3 以éãå¿ é ã ããã©ãä»ã§ã PHP 5.2 ã®ãããžã§ã¯ãã¯ãããããã£ãŠããããã PSR-0 ã«åŸã£ãŠããããã ã
ããããæ°ããã¢ããªã±ãŒã·ã§ã³ãããã±ãŒãžãäœããšãã«ãªãŒãããŒããŒã®äœ¿ãããã®åèã«ããã®ãªãããŸãééããªã PSR-4 ã ã
Standard PHP Library (SPL) ãšã¯ PHP ã«çµã¿èŸŒãŸããæšæºã©ã€ãã©ãªã§ã ããŸããŸãªã¯ã©ã¹ãã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããã ãã䜿ãããŒã¿æ§é (ã¹ã¿ãã¯ããã¥ãŒãããŒããªã©) ãã€ãã¬ãŒã¿ãªã©ãå«ãŸããŠãããSPL ã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããã¯ã©ã¹ãã€ããã° ãããã€ãã¬ãŒã¿ã§å埩åŠçãããããšãã§ããã
PHP ã¯ããšããšãŠã§ãã¢ããªã±ãŒã·ã§ã³ãæžãããã«äœããããã®ã ãã ã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ã€ã¹ (CLI) ã®ããã°ã©ã ãæžãã®ã«ã䟿å©ã ã ã³ãã³ãã©ã€ã³ã®ããã°ã©ã ãæžãã°ããã¹ãããããã€ãšãã£ã ããããäœæ¥ãèªååããå©ããšãªãã
CLI ã® PHP ããã°ã©ã ã䟿å©ãªã®ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒãã䜿ããšãã« ãããããŠã§ãã® UI ãçšæããã«æžããšããã ã ãã ãCLI ã® PHP ã¹ã¯ãªããããŠã§ããµãŒããŒã®å ¬éãã£ã¬ã¯ããªã«çœ®ãããšã¯ çµ¶å¯ŸçŠæ¢ ïŒ
PHP ãã³ãã³ãã©ã€ã³ã§å®è¡ããŠã¿ããã
> php -i-i ã¯ãPHP ã®èšå®æ
å ±ã phpinfo 颿°ã¿ããã«è¡šç€ºãããªãã·ã§ã³ã ã
-a ãªãã·ã§ã³ã§å¯Ÿè©±ã·ã§ã«ã䜿ããããã«ãªããruby ã® IRB ãšããPython ã®å¯Ÿè©±ã·ã§ã«ãšåããããªãã®ã ã
ãã以å€ã«ããããã㪠ã³ãã³ãã©ã€ã³ãªãã·ã§ã³ ãããã
ããããã·ã³ãã«ãª âHello, $nameâ ããã°ã©ã ãæžããŠã¿ãããhello.php ãšãããã¡ã€ã«ãäœã£ãŠã
ãããªå
容ã«ããã
<?php
if ($argc !== 2) {
echo "Usage: php hello.php <name>" . PHP_EOL;
exit(1);
}
$name = $argv[1];
echo "Hello, $name" . PHP_EOL;PHP ã®ã¹ã¯ãªãããå®è¡ãããšãã³ãã³ãã©ã€ã³ã®åŒæ°ã«é¢ãã倿°ããµãã€èšå®ãããã
$argc ã¯æŽæ°å€ã§ãåŒæ°ã® æ° ã衚ãã
$argv ã¯é
åã§ãååŒæ°ã® å€ ãå«ãã
æåã®åŒæ°ã¯ãåžžã« PHP ã¹ã¯ãªããã®ãã¡ã€ã«åãšãªããä»åã®å Žåãªã hello.php ã ã
exit() ã§ãŒã以å€ã®æ°å€ãè¿ããšãã³ãã³ãã倱æããããšãã·ã§ã«ã«äŒããããšãã§ããã
ãã䜿ãããçµäºã³ãŒã㯠ãã ã§èª¿ã¹ããã
ãã®ã¹ã¯ãªãããã³ãã³ãã©ã€ã³ããå®è¡ãããšã次ã®ããã«ãªãã
> php hello.php
Usage: php hello.php <name>
> php hello.php world
Hello, worldãœãããŠã§ã¢éçºã«ããããã¡ã°ã䟿å©ãªããŒã«ãšããã°ãããã§ãããããã¬ã ã ããã€ãããã°ãã³ãŒããå®è¡ããªãããã®ç¶æ ã远ããããŠãã¹ã¿ãã¯ã®äžèº«ãç£èŠãããã§ããã Xdebugã¯PHPçšã®ãããã¬ã§ãããŸããŸãªIDEã«çµã¿èŸŒãã§äœ¿ããã ãã¬ãŒã¯ãã€ã³ããèšå®ãããã¹ã¿ãã¯ã®äžèº«ãèŠããã§ãããã ã ããã«ãPHPUnitãKCacheGrindãšãã£ãããŒã«ãšçµã¿åãããã°ã ã³ãŒãã«ãã¬ããžè§£æããããã¡ã€ãªã³ã°ãã§ããã
ãå®ã¯ããŸå°ã£ãŠããã ãã仿¹ãªãã«var_dump()ãšãprint_r()ã«é Œã£ãŠããã©ããã£ãšããããããããªãããªãâŠã
ãããªåã«å¿
èŠãªã®ã¯ããã¶ããããã¬ã ã
Xdebugã®ã€ã³ã¹ããŒã«ã¯ã¡ãã£ãšé¢åã ãã©ã éèŠãªæ©èœãšããŠããªã¢ãŒããããã°ãã䜿ããããã«ãªãã ãµã ãã¯ããŒã«ã«ã§éçºããŠãããã©ããã¹ãã¯VMãå¥ã®ãµãŒããŒã§ããŠãããšãã人ã¯ã ä»ããã«ã§ã䜿ããããã«ãããæ©èœã ããã
æ £äŸã«ãããã£ãŠãApacheã®VHostãããã¯.htaccessãã¡ã€ã«ã«ãããªå€ãèšå®ããã
php_value xdebug.remote_host 192.168.?.?
php_value xdebug.remote_port 9000âremote hostâãšâremote portâã¯ãããããéçºã«äœ¿ã£ãŠãããã¹ããšIDEããªã¹ã³ããŠããããŒãã«å¯Ÿå¿ããã ããšã¯IDEã®èšå®ã§ãæ¥ç¶ããªã¹ã³ãããã¢ãŒãã«å€ããŠããããªURLãèªã¿èŸŒãã ãã ã
http://your-website.example.com/index.php?XDEBUG_SESSION_START=1
ããã§ãIDEãã¹ã¯ãªããã®å®è¡ã«å²ã蟌ãã§ããã¬ãŒã¯ãã€ã³ããèšå®ããã ã¡ã¢ãªã®äžèº«ã調ã¹ããã§ããããã«ãªãã
ã°ã©ãã£ã«ã«ãªãããã¬ã䜿ãã°ãã³ãŒããã¹ãããå®è¡ããã倿°ã®äžèº«ã調ã¹ããã ä»ã®å®è¡ç°å¢äžã§ã³ãŒããè©äŸ¡ããããšãã£ãããšãç°¡åã«ã§ããããã«ãªãã ãããŠãã®IDEã«ã¯ãXdebugã䜿ã£ãã°ã©ãã£ã«ã«ãªãããã°ã®ä»çµã¿ãåãããçµã¿èŸŒãŸããŠãããã ãããã¯ãã©ã°ã€ã³ãçšæãããŠããã MacGDBpãšãããœããããããããã¯ãXdebugã䜿ãããã®ããªãŒã§ãªãŒãã³ãœãŒã¹ãªmacOSçšGUIç°å¢ã§ãã¹ã¿ã³ãã¢ãã³ã§äœ¿ããã
PHP ã®ã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ãã³ã³ããŒãã³ãã£ãŠã倧éã«ååšããã ãã£ãšãããªãã®ãããžã§ã¯ãã§ãäœåã䜿ã£ãŠããã ãããããããã®ãããããžã§ã¯ãã®äŸåé¢ä¿ãšããã ã€ãæè¿ãŸã§ãPHP ã«ã¯äŸåé¢ä¿ãããŸã管çããä»çµã¿ããªãã£ãã æäœæ¥ã§ç®¡çããŠãããšããã§ããªãŒãããŒããŒã®ããšãæ°ã«ããªããšãããªãã ããããããã ã
çŸæç¹ã§ãã䜿ãããŠããããã±ãŒãžç®¡çã·ã¹ãã ã¯ãComposer ãš PEAR ã§ããã Composer ã¯çŸåš PHP ã®ããã±ãŒãžãããŒãžã£ãŒãšããŠãã¡ã°ã人æ°ããããã®ã ããã©ããã€ãŠã¯ããã±ãŒãžãããŒãžã£ãŒãšããã° PEAR ã ã£ãã PEAR ã®æŽå²ãç¥ã£ãŠãããã»ãããããä»ã§ã PEAR ã䜿ã£ãŠãããšããããããããããªããã ããšã決ããŠäœ¿ãããšããªããšããŠããç¥ã£ãŠãããŠæã¯ãªãã ããã
Composerã¯ãPHP çšãšããŠããããã®äŸå管çããŒã«ã ããããžã§ã¯ãå
ã®äŸåé¢ä¿ã
composer.json ãã¡ã€ã«ã«æžããŠã·ã³ãã«ãªã³ãã³ããæã¡èŸŒãã°ã
Composer ãèªåçã«ãããããŠã³ããŒãããŠãããã ãã§ãªãããªãŒãããŒãã®èšå®ãŸã§ããŠããããã ã
Composer ã¯ãnode.js ã® NPM ã Ruby ã® Bundler ã¿ãããªãã®ã ã
Composer ã«å¯Ÿå¿ããã©ã€ãã©ãªã¯æ¢ã«ããããåºåã£ãŠããŠãèªåã®ãããžã§ã¯ãã§ããã«äœ¿ããã ãããªããã±ãŒãžããŸãšããã®ã Packagistãããã¯ãComposer 察å¿ã® PHP ã©ã€ãã©ãªããŸãšããå ¬åŒãªããžããªã§ããã
composer ãããŠã³ããŒããããã¡ã°ãå®å
šãªæ¹æ³ã¯ãå
¬åŒãµã€ãã®æç€ºã«åŸãããšã
ãã®æ¹æ³ã ãšãã€ã³ã¹ããŒã©ãå£ããŠãããæ¹ãããããŠãããããªããã確ãããããã
ã€ã³ã¹ããŒã©ã¯ãcomposer.phar ã®ãã€ããªã ã«ã¬ã³ããã£ã¬ã¯ã㪠ã«ã€ã³ã¹ããŒã«ããã
ãå§ãã¯ãã°ããŒãã«ã«ã€ã³ã¹ããŒã«ãã (èŠããã«ã/usr/local/bin ã«ã ã眮ã) æ¹åŒã ã
ãã®ããã«ã¯ã次ã®ã³ãã³ããå®è¡ããã°ããã
mv composer.phar /usr/local/bin/composer泚æ: ããŒããã·ã§ã³ã®ãšã©ãŒã§ãã®ã³ãã³ãã倱æããå Žåã¯ãé ã« sudo ãã€ããŠå®è¡ããŠã¿ããã
ããŒã«ã«ã«ã€ã³ã¹ããŒã«ãã Composer ãå®è¡ãããšãã«ã¯ php composer.phar
ãšãããã°ããŒãã«ã«ã€ã³ã¹ããŒã«ããã®ãªããåã« composer ãšæã€ã ãã ã
Windowsã®å Žåãäžçªç°¡åãªã®ã¯ ComposerSetup ã€ã³ã¹ããŒã©ãŒãäœ¿ãæ¹æ³ã ã
ããã¯ããã¹ãŠã®ãŠãŒã¶ãŒã§äœ¿ããããã«ã€ã³ã¹ããŒã«ããããã§ $PATH ãèšå®ããŠãããã®ã§ã
ããšã¯ã³ãã³ãã©ã€ã³ãã composer ãåŒã¶ã ãã§äœ¿ããããã«ãªãã
Composer ã¯ããããžã§ã¯ãã®äŸåé¢ä¿ã composer.json ãšãããã¡ã€ã«ã§ç®¡çããã
ãã®ãã¡ã€ã«ãæã§æžãæããŠãããããComposer ã䜿ã£ãŠç·šéããŠãããã
composer require ãå®è¡ãããšããããžã§ã¯ãã®äŸåé¢ä¿ã远å ããã
ãããŸã composer.json ããªããã°ãæ°ãããã¡ã€ã«ãäœãã
ãã®äŸã¯ããããžã§ã¯ãã®äŸåé¢ä¿ã« Twig ã远å ãããã®ã ã
composer require twig/twig:^2.0ãããã¯ã composer init ã³ãã³ããå®è¡ããŠã
èªåã®ãããžã§ã¯ãçšã®å®å
šãª composer.json ãã¡ã€ã«ãäœãããšãã§ããã
ã©ã¡ãã®æ¹æ³ã«ãããäžåºŠ composer.json ãã¡ã€ã«ãäœã£ãŠããŸãã°ã
ããšã¯ Composer ããã¹ãŠã®äŸåã©ã€ãã©ãªãããŠã³ããŒãã㊠vendor/ ã«ã€ã³ã¹ããŒã«ããŠãããã
次ã®ã³ãã³ãã¯ããã§ã« composer.json ãã¡ã€ã«ãå«ããããžã§ã¯ããããŠã³ããŒãããå Žåã«ã䜿ããã
composer install次ã«ãã¢ããªã±ãŒã·ã§ã³ã§æåã«åŒã°ãã PHP ãã¡ã€ã«ã«ãããªè¡ã远å ããã ããã¯ãComposer ã®ãªãŒãããŒããŒã䜿ã£ãŠãããžã§ã¯ãã®äŸåã©ã€ãã©ãªãèªãããæç€ºããŠããã
<?php
require 'vendor/autoload.php';ããã§ãäŸåã©ã€ãã©ãªã䜿ããããã«ãªã£ããå®éã«äœ¿ãå Žé¢ã§ãå¿ èŠã«å¿ããŠèªã¿èŸŒãŸããã
Composer 㯠composer.lock ãšãããã¡ã€ã«ãäœãã
ããã¯ãæåã« composer install
ãå®è¡ãããšãã«ããŠã³ããŒããããåããã±ãŒãžã®æ£ç¢ºãªããŒãžã§ã³ãèšé²ããŠãããã®ã ã
ä»ã®éçºè
ãšãããžã§ã¯ããå
±æãããšãã« composer.lock ãäžç·ã«é
åžããŠãããšã
ä»ã®äººã composer install ãå®è¡ãããšãã«ããŸã£ããåãããŒãžã§ã³ãã€ã³ã¹ããŒã«ãããããã«ãªãã
äŸåé¢ä¿ãæŽæ°ããã«ã¯ã composer update ãå®è¡ãããã
ãããã€ã®ãšãã«ã¯ composer update ã䜿ã£ãŠã¯ãããªããå¿
ã composer install ã䜿ãããšã
ããããªããšãéçºç°å¢ãšéçšç°å¢ã§éãããŒãžã§ã³ã®ããã±ãŒãžã䜿ã£ãŠããŸãããšã«ãªãã
ããã¯ãããŒãžã§ã³ã®èŠä»¶ãæè»ã«å®çŸ©ã§ããã®ã§äŸ¿å©ã ã
ããšãã°ãããŒãžã§ã³ã« ~1.8 ãšæžããå Žåã¯ã1.8.0 以éã®ããŒãžã§ã³ããã ã 2.0.x-dev ã¯å«ãŸãªãããšæå®ããããšã«ãªãã
ã¯ã€ã«ãã«ãŒã * ã䜿ã£ãŠ 1.8.* ã®ããã«æå®ããŠãããã
ããã§ãComposer ã§ php composer.phar update ãå®è¡ãããšãã«ã
å®çŸ©ããå¶çŽã®ç¯å²ã§ã®ææ°çã«äŸåã©ã€ãã©ãªãæŽæ°ããŠãããã
æ°ããŒãžã§ã³ã®ãªãªãŒã¹ã®éç¥ãåãåããããã° libraries.io ã«ãµã€ã³ã¢ãããããšããã ãã®ãµãŒãã¹ã¯ãäŸåã©ã€ãã©ãªãç£èŠããŠãæŽæ°ãããã°éç¥ããŠããããã®ã ã
Local PHP Security Checker ã¯ãã³ãã³ãã©ã€ã³ããŒã«ãšããŠæäŸãããŠããã
composer.lock ãã¡ã€ã«ã調ã¹ãŠãããäŸåé¢ä¿ã«æŽæ°ãå¿
èŠãªãæããŠããããã®ã ã
Composer ã¯ãã°ããŒãã«ãªäŸåé¢ä¿ããã®ãã€ããªãæ±ãããšãã§ããã
䜿ãããã¯ãšãŠãç°¡åã§ãåã«ã³ãã³ãã®åã« global ãã€ããã ãã§ããã
ããšãã°ãPHPUnit ãã°ããŒãã«ã«äœ¿ããããã€ã³ã¹ããŒã«ããããã°ããããªã³ãã³ããå®è¡ããã
composer global require phpunit/phpunitãã®ã³ãã³ãã¯ã ~/.composer ãã£ã¬ã¯ããªãäœã£ãŠãã°ããŒãã«ãªäŸåé¢ä¿ãããã«çœ®ãã
ã€ã³ã¹ããŒã«ãããããã±ãŒãžã®ãã€ããªãå
šäœã§äœ¿ããããã«ããã«ã¯ã ~/.composer/vendor/bin
ãã£ã¬ã¯ããªãç°å¢å€æ° $PATH ã«è¿œå ããã°ããã
å€ãããããããã±ãŒãžç®¡çããŒã«ã PEAR ã ã Composer ãšåããããªæãã ãã©ãéããšãããããã
PEARã®åã ã®ããã±ãŒãžã¯ãã«ãŒã«ã«åŸã£ãæ§é ã«ããŠãããªããšãããªãã ã€ãŸããPEARã§äœ¿ããããã«ããã«ã¯ããã±ãŒãžã®äœè ããã¡ããšæºåããŠãããªããšãããªãã£ãŠããšã ã PEARã§äœ¿ãããšãæ³å®ããŠããªããããžã§ã¯ãã¯ãPEARã§ã¯ããŸã䜿ããªãã
PEARã¯ããã±ãŒãžãã°ããŒãã«ç°å¢ã«ã€ã³ã¹ããŒã«ãããã€ãŸãã äœãããã±ãŒãžãã€ã³ã¹ããŒã«ããã°ãåããµãŒããŒäžã®ãã¹ãŠã®ãããžã§ã¯ãã§ãã®ããã±ãŒãžã䜿ããããã«ãªãã ãã¹ãŠã®ãããžã§ã¯ããåãããã±ãŒãžã®åãããŒãžã§ã³ã䜿ã£ãŠããšããã®ãªããããã¯äŸ¿å©ã ã ã§ãããããžã§ã¯ãã«ãã£ãŠäœ¿ã£ãŠããããŒãžã§ã³ãéããªããŠããå Žåã¯ã¡ãã£ãšãŸããããšã«ãªãå¯èœæ§ãããã
PEARãã€ã³ã¹ããŒã«ããã«ã¯ã.phar ã€ã³ã¹ããŒã©ãããŠã³ããŒãããŠå®è¡ããã°ããã
PEARã®ããã¥ã¡ã³ããèŠãã°ãåçš®OSåãã«
ã€ã³ã¹ããŒã«æé ã®è©³ãã説æ ãããã
Linuxã䜿ã£ãŠããå Žåã¯ããã£ã¹ããªãã¥ãŒã·ã§ã³ãæäŸããŠããããã±ãŒãžãããŒãžã£ãŒããã§ãã¯ãããã
ããšãã°ãDebianãUbuntuã«ã¯ php-pear ãšããaptããã±ãŒãžãçšæãããŠããã
PEAR ããã±ãŒãžãªã¹ãã«ããããã±ãŒãžãªããååãæå®ããŠæ¬¡ã®ããã«ã€ã³ã¹ããŒã«ã§ããã
pear install fooå¥ã®ãã£ãã«ã§å
¬éãããŠããããã±ãŒãžãã€ã³ã¹ããŒã«ããã«ã¯ããŸããã®ãã£ãã«ã
discover ããªããšãããªãããããŠãã€ã³ã¹ããŒã«ã®ãšãã«ããã£ãã«åãæå®ããã
詳ãã㯠ãã£ãã«ã®äœ¿ãæ¹ã«é¢ããããã¥ã¡ã³ã ãåç
§ããããšã
æ¢ã«Composerã䜿ã£ãŠããããã©ãPEARã®ã³ãŒããã€ã³ã¹ããŒã«ããããšããå Žåã¯ã Composerã«PEARã®äŸåé¢ä¿ãåŠçãããããšãã§ããã PEAR ã®ãªããžããªã¯ãComposer version 2 ã§ã¯ããçŽæ¥ã¯ãµããŒããããªãããã£ãŠãPEAR ã®ããã±ãŒãžãã€ã³ã¹ããŒã«ããã«ã¯ããªããžããªãæåã§è¿œå ããå¿ èŠããã:
{
"repositories": [
{
"type": "package",
"package": {
"name": "pear2/pear2-http-request",
"version": "2.5.1",
"dist": {
"url": "https://github.com/pear2/HTTP_Request/archive/refs/heads/master.zip",
"type": "zip"
}
}
}
],
"require": {
"pear2/pear2-http-request": "*"
},
"autoload": {
"psr-4": {"PEAR2\\HTTP\\": "vendor/pear2/pear2-http-request/src/HTTP/"}
}
}æåã®ã»ã¯ã·ã§ã³ã§ã¯ã"repositories"ã䜿ã£ãŠComposerã«pearãªããžããªããåæåã
(PEARã®çšèªã§ãããšãdiscoverã)ããã
ãããŠãrequireã»ã¯ã·ã§ã³ã§ã¯ããã±ãŒãžåãæ¬¡ã®ããã«æå®ããã
pear-channel/package
âpearâãšãããã¬ãã£ãã¯ã¹ãããŒãã³ãŒãããããšã§ãè¡çªãåé¿ããŠããã ãšããã®ããpearãã£ãã«ã®ååãšå¥ã®ããã±ãŒãžãã³ããŒã®ååãåãã«ãªã£ãŠããŸãå¯èœæ§ãããããã ã ãã®ããã«ããŠããã£ãã«ã®ççž®åïŒãããã¯å®å šãªURLïŒã䜿ã£ãŠãã®ããã±ãŒãžãå±ãããã£ãã«ãæå®ã§ããããã«ããã
ãã®ã³ãŒããã€ã³ã¹ããŒã«ãããšãvenderãã£ã¬ã¯ããªã®äžã«ãã£ãã«åã®ãã£ã¬ã¯ããªãã§ãããã£ãŠã Composerã®ãªãŒãããŒããŒãéããŠèªåçã«äœ¿ããããã«ãªãã
vendor/pear2/pear2-http-request/pear2/HTTP/Request.php
ãã®PEARããã±ãŒãžã䜿ãã«ã¯ãåçŽã«ãã®ããã«åç §ããã ãã§ããã
<?php
require __DIR__ . '/vendor/autoload.php';
use PEAR2\HTTP\Request;
$request = new Request();PHP ã¯ãšãŠãæãæ·±ãèšèªã§ãããããªã¬ãã«ã®æè¡è ã䜿ããããææ©ãå¹ççã«ã³ãŒããæžãããšãã§ããã ãããå®éã«äœ¿ã£ãŠãããã¡ã«ãåããŠèº«ã«ã€ãããšãã®åºæ¬ãå¿ããŠããŸãã æšªçããæ¹æ³ãšãããŸããããããªãç¿æ £ãšãã°ãã身ã«ã€ããŠããŸãã ãããªé¢šæœ®ã«äžç³ãæããããã«æžããã®ããã®ã»ã¯ã·ã§ã³ã ãPHPã§ã³ãŒããæžããšãã®åºæ¬ãå¿ããªãããã«ãããã
PHP ã® DateTime ã¯ã©ã¹ã䜿ãã°ãæ¥ä»ãæå»ã®èªã¿æžããæ¯èŒããããŠèšç®ãã§ããã PHP ã«ã¯ DateTime ã¯ã©ã¹ä»¥å€ã«ãæ¥ä»ãæå»ããã¿ã®é¢æ°ã倧éã«ãããã©ã DateTime ã¯ã©ã¹ã«ã¯ã¡ãããšãããªããžã§ã¯ãæåã®ã€ã³ã¿ãŒãã§ã€ã¹ãããã®ã§ ãããŠãã®å Žåã¯ãã®ã¯ã©ã¹ã䜿ã£ãã»ããããã ã¿ã€ã ãŸãŒã³ã ã£ãŠæ±ãããã©ãããã§ã¯ãããŸã§ã¯æ·±è¿œãããªãã
DateTime ã䜿ã£ãŠäœãã®æäœãããããã«ã¯ãæ¥ä»ãæå»ã衚ãæååããã¡ã¯ããªãŒã¡ãœãã
createFromFormat() ã§ãªããžã§ã¯ãã«å€æããããããã㯠new DateTime
ã§çŸåšã®æ¥æãååŸãããformat() ã¡ãœããã䜿ãã°ãDateTime ãæååã«æ»ããŠåºåã§ããã
<?php
$raw = '22. 11. 1968';
$start = DateTime::createFromFormat('d. m. Y', $raw);
echo 'Start date: ' . $start->format('Y-m-d') . PHP_EOL;DateTime ã䜿ã£ãèšç®ããããšãã«äœ¿ããã®ã DateInterval ã¯ã©ã¹ã ã
DateTime ã«ã¯ add() ã sub() ãšãã£ãã¡ãœããããã£ãŠããã®åŒæ°ã«æå®ããã®ããã® DateInterval ãšãªãã
1æ¥ã86400ç§ã§ããããšãåæãšããã³ãŒããæžããŠã¯ãããªãã
ãµããŒã¿ã€ã ãšãã¿ã€ã ãŸãŒã³ã®ç§»åãããããšããã®åæã¯ãã£ãã厩ããŠããŸãããã ã
ãããªãšãã«ã¯ DateInterval ã䜿ããäºã€ã®æ¥ä»ã®å·®ãèšç®ãããšãã«ã¯
diff() ã¡ãœããã䜿ãããã®ã¡ãœãã㯠DateInterval ãè¿ããçµæã衚瀺ããã®ãç°¡åã ã
<?php
// $start ãã³ããŒããŠã1ãæãš6æ¥ãè¶³ã
$end = clone $start;
$end->add(new DateInterval('P1M6D'));
$diff = $end->diff($start);
echo 'Difference: ' . $diff->format('%m month, %d days (total: %a days)') . PHP_EOL;
// Difference: 1 month, 6 days (total: 37 days)DateTime ãªããžã§ã¯ãã©ããã§ããæ®éã«æ¯èŒããããšãã§ããã
<?php
if ($start < $end) {
echo "Start is before the end!" . PHP_EOL;}æåŸã«ããã²ãšã€ DatePeriod ã¯ã©ã¹ã®äŸã瀺ãããç¹°ãè¿ãçºçããã€ãã³ããé ã«åŠçãããšãã«äœ¿ããã éå§æ¥æãšçµäºæ¥æã衚ãäºã€ã® DateTime ããããŠã€ãã³ãã®ééãåãåã£ãŠããã®éã«ãããã¹ãŠã®ã€ãã³ããè¿ããã®ã ã
<?php
// $start ãã $end ãŸã§ã®éã®ãã¹ãŠã®æšææ¥ãè¿ã
$periodInterval = DateInterval::createFromDateString('first thursday');
$periodIterator = new DatePeriod($start, $periodInterval, $end, DatePeriod::EXCLUDE_START_DATE);
foreach ($periodIterator as $date) {
// æ¯æšææ¥ã衚瀺ãã
echo $date->format('Y-m-d') . ' ';
}PHP APIã®æ¡åŒµãšããŠæåãªã®ã Carbon ã ã ãã㯠DateTime ã¯ã©ã¹ã®ãã¹ãŠãç¶æ¿ããŠããã®ã§ãã³ãŒãã®æžãæããæå°éã«æããããã ããã«è¿œå æ©èœãšããŠãå°ååã®ãµããŒããã DateTime ãªããžã§ã¯ãã®å æžç®ãšãã©ãŒãããã®æ¹æ³ã®è¿œå ãããã ãŸããèªåã§éžãã æ¥ä»ãšæå»ãã·ãã¥ã¬ãŒãããæ©èœããã£ãŠãããã¯ã³ãŒãããã¹ããããšãã«äœ¿ããã
ã¢ããªã±ãŒã·ã§ã³ãã€ãããšãã«ã¯ãäžè¬çãªãã¿ãŒã³ã«åŸã£ãŠã³ãŒããæžããšããã åãããããžã§ã¯ãã®å šäœæ§é ã«ã€ããŠããäžè¬çãªãã¿ãŒã³ã«åŸããã ãªããããããšããããšãããšãèªåã®ã³ãŒãã管çãããããªããã äœãã©ããªã£ãŠããã®ããä»ã®éçºè ã«ãããã£ãŠãããããããªãããã ã
ãã¬ãŒã ã¯ãŒã¯ã䜿ã£ãŠã³ãŒããæžããšãäžäœã¬ãã«ã®ã³ãŒãããããžã§ã¯ãã®æ§é ã®ã»ãšãã©ã¯ãã®ãã¬ãŒã ã¯ãŒã¯ã®æµåã«åŸãããšã«ãªãã ãã§ã«ããã«ã¯ãããããªãã¿ãŒã³ãé©çšãããŠããã ããã ãã ããã®ãã¬ãŒã ã¯ãŒã¯ã®äžã§æžãèªåã®ã³ãŒãã®äžã§ã©ããªãã¿ãŒã³ãé©çšãããã¯ãèªå次第ã ã äžæ¹ããã¬ãŒã ã¯ãŒã¯ã䜿ããã«ã³ãŒããæžãå Žåã¯ã©ãã ããã èªåãæžãããšããŠããã¢ããªã±ãŒã·ã§ã³ã®ã¿ã€ããèŠæš¡ã«å¿ããŠãæé©ãªãã¿ãŒã³ãã¿ã€ããå¿ èŠãããã
PHPã§ã®ãã¶ã€ã³ãã¿ãŒã³ãå®è£ äŸã«ã€ããŠã¯ããããèŠãã°ããã
ãã®ã»ã¯ã·ã§ã³ã¯ãããšããšAlex Cabalã PHP Best Practicesåãã«æžãããã®ã ããã®èšäºãããšã«ãUTF-8ã«ã€ããŠèª¬æããã
ä»ã®ãšããPHPã¯ãäœã¬ãã«ã§ã¯UnicodeããµããŒãããŠããªãã PHPã§UTF-8æååããã¡ããšåŠçããæ¹æ³ãããã«ã¯ããããç°¡åã§ã¯ãªããããã«ããŠã§ãã¢ããªã±ãŒã·ã§ã³ã®ããããã¬ãã« ïŒã€ãŸããHTMLãSQLããPHPãŸã§ïŒã«æãå ¥ããå¿ èŠãããã ããã§ã¯ããããã«ã€ããŠãçŸå®çãªç¯å²ã§æçã«ãŸãšããã
æååã®é£çµã倿°ãžã®ä»£å
¥ãªã©ã®åºæ¬æäœã«ã€ããŠã¯ãUTF-8ã ãããšãã£ãŠäœãç¹å¥ãªããšãããå¿
èŠã¯ãªãã
ãããã倧åã®æåå颿°ïŒstrpos() ã strlen() ãªã©ïŒã«ã€ããŠã¯ãããããããã«ã¯ãããªãã
ãããã®é¢æ°ã«ã¯ã察å¿ãã颿°ãšã㊠mb_* ãçšæãããŠããããšãå€ãã
ããšãã° mb_strpos() ã mb_strlen() ã ã
ãããã® mb_* 颿°ã¯ ãã«ããã€ãæååæ¡åŒµã¢ãžã¥ãŒã« ãæäŸãããã®ã§ã
Unicodeæååãæ±ããããã«èšèšãããŠããã
Unicodeæååãæ±ãå Žåã¯ãåžžã« mb_* 颿°ã䜿ãå¿
èŠãããã
ããšãã°ãUTF-8æååã«å¯Ÿã㊠substr() ã䜿ããšããã®çµæã®äžã«æååãããåè§æåãå«ãŸããŠããŸãå¯èœæ§ãããã
ãã®å Žåããã«ããã€ãæååã®ãšãã«äœ¿ãã¹ã颿°ã¯ mb_substr() ã ã
åžžã« mb_* 颿°ã䜿ãããã«èŠããŠããã®ã倧å€ãªãšããã ã
ããšãäžãæã§ããããå¿ããŠããŸããšããã以éã® Unicode æååã¯å£ããŠããŸãå¯èœæ§ãããã
ãããŠããã¹ãŠã®æåå颿°ã« mb_* çãããããã§ã¯ãªãã
èªåã䜿ããã颿°ã«ãã«ããã€ãçããªãã ã£ãŠïŒ
ãæå·æ§ã
ãã¹ãŠã®PHPã¹ã¯ãªããã®å
é ïŒãããã¯ãã°ããŒãã«ã«ã€ã³ã¯ã«ãŒããããã¡ã€ã«ã®å
é ïŒã§ mb_internal_encoding()
颿°ã䜿ããªããšãããªãããã¹ã¯ãªããã®äžã§ãã©ãŠã¶ã«åºåããã€ãããªããããã ãã§ã¯ãªã
mb_http_output() 颿°ã䜿ããªããã°ãããªãã
ãã¹ãŠã®ã¹ã¯ãªããã§ãšã³ã³ãŒãã£ã³ã°ãæç€ºããŠããã°ãåŸã§æ©ãŸãããããšããªããªãã ããã
ããã«ãæååãæäœãã颿°ã®å€ãã«ã¯ãæåãšã³ã³ãŒãã£ã³ã°ãæå®ããããã®ãªãã·ã§ã³åŒæ°ãçšæãããŠããã
ãã®ãªãã·ã§ã³ãããå Žåã¯ãåžžã« UTF-8 ãæç€ºããŠããã¹ãã ã
ããšãã° htmlentities() ã«ã¯æåãšã³ã³ãŒãã£ã³ã°ãèšå®ããåŒæ°ãããã®ã§ã
UTF-8 æååãæ±ããªãåžžã«ããæå®ããŠãããªããšãããªãã
PHP 5.4.0 以éã§ã¯ã htmlentities() ã htmlspecialchars() ã®ããã©ã«ããšã³ã³ãŒãã£ã³ã°ã UTF-8 ã«å€ãã£ãã
æåŸã«ãä»ã®äººãã¡åãã«é
åžããã€ããã®ã¢ããªã±ãŒã·ã§ã³ãªã©ããã®å®è¡ç°å¢ã§ mbstring ã䜿ãããã©ããå®ãã§ã¯ãªãå Žåã¯ã
Composer ã® symfony/polyfill-mbstring ããã±ãŒãžã䜿ãããšãæ€èšãããã
ããã¯ããã mbstring ãããã°ããã䜿ãããªããã°é UTF-8 颿°ã«ãã©ãŒã«ããã¯ãããšãããã®ã ã
PHP ã¹ã¯ãªãããã MySQL ã«æ¥ç¶ããå Žåã¯ãäžã§æžããæ³šæããã¹ãŠå®ã£ãã«ãããããã UTF-8 æååããã以å€ã®ãšã³ã³ãŒãã£ã³ã°ã§æ ŒçŽãããŠããŸãå¯èœæ§ãããã
PHP ãã MySQL ã«æž¡ãæååã確å®ã« UTF-8 ãšããŠæ±ãããã«ã¯ãããŒã¿ããŒã¹ãšããŒãã«ã®æåã»ãããç
§åé åºã®èšå®ãããã¹ãŠ
utf8mb4 ã«ããŠããå¿
èŠããããããã«ãPDO ã®æ¥ç¶æååã«ããæåã»ãããšã㊠utf8mb4 ãæå®ããã
詳现ã¯ä»¥äžã®ã³ãŒããåç
§ããããšã ããã詊éšã«åºããã
UTF-8 ãå®å
šã«ãµããŒãããã«ã¯ãæåã»ãã utf8mb4 ã䜿ããªããšãããªãã utf8 ã¯ãã¡ïŒïŒïŒ
ãã®çç±ãç¥ããããã°ãããããŠèªã¿ããããåç
§ããããšã
mb_http_output() 颿°ã䜿ãã°ãPHP ã¹ã¯ãªãããããã©ãŠã¶ãžã®åºåã UTF-8 æååã«ãªãããšãä¿èšŒã§ããã
ããšã¯ãHTTPã¬ã¹ãã³ã¹ã®äžã§ããã®ããŒãžãUTF-8ãšããŠæ±ããããã©ãŠã¶ã«æç€ºããå¿ èŠãããã ããŸã©ããªããæ®éã¯HTTPã¬ã¹ãã³ã¹ãããã®äžã§ãããªãµãã«èšå®ããã ããã
<?php
header('Content-Type: text/html; charset=UTF-8')æã¯ãããŒãžã® <head> ã¿ã°ã®äžã§ charset ã® <meta> ã¿ã° ãæå®ãããããŠãããã®ã ã
<?php
// PHP ã«å¯ŸããŠãä»åŸãã®ã¹ã¯ãªããã®äžã§ã¯ UTF-8 æååã䜿ãããšãäŒãã
mb_internal_encoding('UTF-8');
$utf_set = ini_set('default_charset', 'utf-8');
if (!$utf_set) {
throw new Exception('could not set default_charset to utf-8, please ensure it\'s set on your system!');
}
// PHP ã«å¯ŸããŠããã©ãŠã¶ã« UTF-8 ã§åºåããããšãäŒãã
mb_http_output('UTF-8');
// UTF-8 ã®ãã¹ãçšæåå
$string = 'Ãl sÃla erin lû e-govaned vîn.';
// äœããã®ãã«ããã€ã颿°ã§æååãæäœããã
// ããã§ã¯ããã¢ã®æå³ã蟌ããŠãéASCIIæåã®ãšããã§æååãã«ããããŠã¿ãã
$string = mb_substr($string, 0, 15);
// ããŒã¿ããŒã¹ã«æ¥ç¶ãããã®æååãæ ŒçŽããã
// ãã®ããã¥ã¡ã³ãã«ãã PDO ã®ãµã³ãã«ãèŠãã°ããã詳ããæ
å ±ããããã
// ããã§ã®èã¯ãããŒã¿ãœãŒã¹å (DSN) ã«ããã `charset=utf8mb4` ã ã
$link = new PDO(
'mysql:host=your-hostname;dbname=your-db;charset=utf8mb4',
'your-username',
'your-password',
array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_PERSISTENT => false
)
);
// 倿ããæååããUTF-8ãšããŠããŒã¿ããŒã¹ã«æ ŒçŽããã
// DBãšããŒãã«ã®æåã»ãããç
§åé åºããã¡ãããšutf8mb4ã«ãªã£ãŠããããªïŒ
$handle = $link->prepare('insert into ElvishSentences (Id, Body, Priority) values (default, :body, :priority)');
$handle->bindParam(':body', $string, PDO::PARAM_STR);
$priority = 45;
$handle->bindParam(':priority', $priority, PDO::PARAM_INT); // intãæ±ããŠããããšãpdoã«å¯ŸããŠæç€ºãã
$handle->execute();
// 仿 ŒçŽããã°ããã®æååãåãåºããŠããã¡ããšæ ŒçŽã§ããŠãããã©ããã確ããã
$handle = $link->prepare('select * from ElvishSentences where Id = :id');
$id = 7;
$handle->bindParam(':id', $id, PDO::PARAM_INT);
$handle->execute();
// çµæããªããžã§ã¯ãã«ä»£å
¥ããŠãåŸã§HTMLã®äžã§äœ¿ã
// ãã®ãªããžã§ã¯ããã¡ã¢ãªãå§è¿«ããããšã¯ãªããå¿
èŠã«ãªã£ããã®æç¹ã§ã¯ãããŠãã§ãããã
$result = $handle->fetchAll(\PDO::FETCH_OBJ);
// ã©ãããŒã®ãµã³ãã«ãããã¯ããŒã¿ãhtmlåºåçšã«ãšã¹ã±ãŒããã
function escape_to_html($dirty){
echo htmlspecialchars($dirty, ENT_QUOTES, 'UTF-8');
}
header('Content-Type: text/html; charset=UTF-8'); // ãã§ã« default_charset ã utf-8 ã«ãªã£ãŠããã®ã§ããã°ããã¯äžèŠ
?><!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>UTF-8 ãã¹ãããŒãž</title>
</head>
<body>
<?php
foreach($result as $row){
escape_to_html($row->Body); // 倿ããUTF-8æååãããã©ãŠã¶ã«æ£ããåºåãããã¯ã
}
?>
</body>
</html>ååŠè ã®çãããžã®ãæã: i18n ãš l10n ã¯ãã¡ããã (èš³è æ³š: é·ãè±åèªãæ°åã§çç¥ããŠè¡šçŸããèª)ã§ãããççž®ã«æ°åã䜿ãããçç¥åœ¢ã®äžçš®ã§ãã - ãã®å Žåãinternationalization 㯠i18nãlocalization 㯠l10n ãšãªãã
ãŸãåãã«ãããã2ã€ã®äŒŒãæŠå¿µãšããã®ä»é¢é£ãããã®ãå®çŸ©ããå¿ èŠãããã
PHP ã§æžããããœãããŠã§ã¢ãåœéåããæãç°¡åãªæ¹æ³ã¯ãé
åãã¡ã€ã«ã䜿ã£ãŠãããã®æååã <h1><?=$TRANS['title_about_page']?></h1> ã®ããã«ããã³ãã¬ãŒãã§äœ¿ãããšã ãããããªãããéçšããŠããäžã§ã¡ã³ããã³ã¹ã®åé¡ãçºçããã®ã§ããã®æ¹æ³ã¯æ¬æ Œçãªãããžã§ã¯ãã§ã¯å
šããå§ãã§ããªããè€æ°åãªã©ããããžã§ã¯ãã®æåæã«çºçããåé¡ãããããããã£ãŠãäœããŒãžãå«ãŸãããããžã§ã¯ãã§ããã°ããã®æ¹æ³ã詊ããªãã§ããã ãããã
æãå€å
žçã§ããã°ãã° i18n ã l10n ã®åèã«ãããããšãå€ãã®ã¯ãgettextãšããUnixã®ããŒã« ã§ãããããã¯1995幎ãŸã§ããã®ãŒãããœãããŠã§ã¢ã翻蚳ããããã®å®ç§ãªå®è£
ã§ãããååããããã«å®è¡ã§ãã匷åãªãµããŒãããŒã«ãåããŠãããããã§ã¯ Gettext ã«é¢ããŠèª¬æããããŸããããªããã³ãã³ãã©ã€ã³ã䜿ãããšã§æ··ä¹±ããªãããã«ãl10n ã®ãœãŒã¹ãç°¡åã«æŽæ°ã§ããåªããGUIã¢ããªã±ãŒã·ã§ã³ã玹ä»ããã
Gettext ããã®ä»ã® i18n ã®å®è£ ããµããŒãããäžè¬çãªã©ã€ãã©ãªãååšããããããã®äžã«ã¯ãã€ã³ã¹ããŒã«ãç°¡åãªãã®ãã远å ã®æ©èœã i18n ãã¡ã€ã«ãã©ãŒããããåããŠãããã®ããããæ¬ããã¥ã¡ã³ãã§ã¯ãPHPã³ã¢ã§æäŸãããããŒã«ã«ãã©ãŒã«ã¹ããããå®å šãæãããã«ã以äžã§ä»ã®ããŒã«ãåæããŠãã:
intl ãšã¯ã¹ãã³ã·ã§ã³ïŒè€æ°åãããã¡ãã»ãŒãžãå«ãïŒãä»ããé«åºŠãªã¡ãã»ãŒãžãã©ãŒããããæäŸãããgettext ã³ãã³ãããã€ãã£ãã«ãµããŒãããªããã®ãããïŒãåãã.mo/.po ãã¡ã€ã«ä»¥å€ã®ä»ã®ãã©ãŒãããã«ãšã¯ã¹ããŒãããããšãã§ããã翻蚳ãã¡ã€ã«ãJavaScriptã€ã³ã¿ãŒãã§ãŒã¹ãªã©ã®ã·ã¹ãã ã®ä»ã®éšåã«çµ±åããå¿
èŠãããå Žåã«åœ¹ã«ç«ã€ãstrtr() ã䜿ã£ãŠãã¬ãŒã¹ãã«ãããµããŒããããä»ã®ãã¬ãŒã ã¯ãŒã¯ã«ã i18n ã¢ãžã¥ãŒã«ãå«ãŸããŠãããããããã¯ãã¬ãŒã ã¯ãŒã¯ã䜿ã£ãã³ãŒãããŒã¹ä»¥å€ã§ã¯å©çšã§ããªãã
@lang ãã«ããŒãçšæãããŠãããIntl æ¡åŒµãåºç€ãšããŠããŠãICUãããžã§ã¯ã ã«åºã¥ããŠãããããã«ãããYii ã¯ãæ°åã®ã¹ãã«ããæ¥ä»ãæå»ãæéãé貚ãåºæ°ã®æžåŒèšå®ãªã©ã®åŒ·åãªçœ®æãå®è¡ã§ãããæœåºåšãæäŸãããŠããªãã©ã€ãã©ãªã®ïŒã€ãéžæããå Žåã¯ãgettext ãã©ãŒãããã䜿ãã®ãè¯ãã ãããããããã°ãæ¬ç« ã®ä»¥éã§èª¬æããããã«ããªãªãžãã«ã® gettext ããŒã«ãã§ã€ã³(Poedit ãå«ã) ã䜿ããã
apt-get ã yumãªã©ã®ããã±ãŒãžãããŒãžã£ã䜿ã£ãŠãGettext ãé¢é£ããPHPã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããå¿
èŠããããããããªããã€ã³ã¹ããŒã«åŸãextension=gettext.so (Linux/Unixã®å Žå)ãããã㯠extension=php_gettext.dll (Windowsã®å Žå)ã php.ini ã«è¿œå ããŠæå¹ã«ããã
ããã§ã¯ãPoedit ã䜿ã£ãŠç¿»èš³ãã¡ã€ã«ãäœæãããããããã·ã¹ãã ã®ããã±ãŒãžãããŒãžã£ã«ããããšæããUnix, macOS, Windows ã§äœ¿ãããšãã§ãããŠã§ããµã€ãããç¡æã§ããŠã³ããŒã ããããšãã§ããã
gettext ã䜿ãéãéåžžæ±ããã¡ã€ã«ã¯3ã€ãããäž»ãªãã¡ã€ã«ã¯ PO(Portable Object) ãã¡ã€ã«ãšãMO(Machine Object) ãã¡ã€ã«ã ãåè ã¯èªã¿åãå¯èœãªã翻蚳ããããªããžã§ã¯ããã®ãªã¹ãã§ãããåŸè ã¯ãããŒã«ã©ã€ãºãè¡ãéã«ãgettext ã«ãã£ãŠè§£éããã察å¿ãããã€ããªã ããã以å€ã«ãPOT (Template) ãã¡ã€ã«ããããããã¯ãœãŒã¹ãã¡ã€ã«ããã®æ¢åã®ããŒãå šãŠå«ãã§ããŠããã¹ãŠã®POãã¡ã€ã«ãçæãæŽæ°ããããã®ã¬ã€ããšããŠå©çšã§ããããããã®ãã³ãã¬ãŒããã¡ã€ã«ã¯å¿ é ã§ã¯ãªããl10n ãè¡ãéã«çšããããŒã«ã«ãã£ãŠã¯ãPO/MO ãã¡ã€ã«ã ãã§äºè¶³ãããèšèªãšå°åããšã«PO/MO ãã¡ã€ã«ã®ãã¢ãåžžã«ïŒã€ããããPOT ã¯ãã¡ã€ã³ããšã«ïŒã€ã ãã ã
倧ããªãããžã§ã¯ãã§ã¯ãåãåèªãã³ã³ããã¹ãã«å¿ããŠç°ãªãæå³ãäŒããå Žåã翻蚳ãåé¢ããå¿ èŠãããå Žåããããããããå Žåãããããå¥ã® ãã¡ã€ã³ ã«åå²ããããããã¯åºæ¬çã«ãPOT/PO/MOãã¡ã€ã«ã®ååä»ãã°ã«ãŒãã§ããããã®å Žåã®ãã¡ã€ã«åã¯å述㮠翻蚳ãã¡ã€ã³ ã§ãããäžå°èŠæš¡ã®ãããžã§ã¯ãã§ã¯éåžžãåçŽåããããã«ãïŒã€ã®ãã¡ã€ã³ã®ã¿ã䜿çšããããã®ååã¯ä»»æã ããæã ã®ã³ãŒããµã³ãã«ã§ã¯ãmainãã䜿ããSymfony ãããžã§ã¯ãã§ã¯ãäŸãã°ããã¡ã€ã³ã¯ããªããŒã·ã§ã³ã¡ãã»ãŒãžã®ç¿»èš³ãåé¢ããããã«å©çšãããã
ãã±ãŒã«ã¯åã«ãèšèªã®ããããŒãžã§ã³ãèå¥ããã³ãŒãã§ãããISO 639-1 ã ISO 3166-1 alpha2 仿§ã«æ²¿ã£ãŠå®çŸ©ããããèšèªã«ã¯2ã€ã®å°æåãå¿ èŠã«å¿ããŠäžç·ãšåœãå°åã®ã³ãŒããèå¥ãã2ã€ã®å€§æåãç¶ããã¬ã¢ãªèšèª ã«ã¯ã3æåã䜿ãããã
äžéšã®è©±è
ã«ãšã£ãŠã¯ãåœã®éšåãåé·ã«æããå Žåããããå®éãèšèªã®äžã«ã¯ããªãŒã¹ããªã¢ãã€ãèª(de_AT) ã (ãã©ãžã«ã§è©±ããã)ãã«ãã¬ã«èª(pt_BR) ã®ããã«ãç°ãªãåœã®æ¹èšãæã€ãã®ãããã2ã€ç®ã®éšåã¯ããããã®æ¹èšãåºå¥ããããã«äœ¿ãããã2ã€ç®ã®éšåããªãå Žåãèšèªã®ãæ±çšãããŒãžã§ã³ããããã¯ããã€ããªãããããŒãžã§ã³ãšããŠæ±ãããã
Gettext ã䜿ãã«ã¯ãç¹å®ã®ãã©ã«ãæ§é ã«åŸãå¿
èŠãããããŸãããœãŒã¹ãªããžããªå
ã® l10n ãã¡ã€ã«ã«å¯ŸããŠä»»æã®ã«ãŒããéžæããå¿
èŠãããããã®äžã«ãå¿
èŠãªãã±ãŒã«æ¯ã®ãã©ã«ããšããã¹ãŠã®PO/MOãã¢ãå«ããåºå®ã® LC_MESSAGES ãã©ã«ããçšæãããããšãã°ã以äžã®ããã«ããïŒ
<project root>
ââ src/
ââ templates/
ââ locales/
ââ forum.pot
ââ site.pot
ââ de/
â ââ LC_MESSAGES/
â ââ forum.mo
â ââ forum.po
â ââ site.mo
â ââ site.po
ââ es_ES/
â ââ LC_MESSAGES/
â ââ ...
ââ fr/
â ââ ...
ââ pt_BR/
â ââ ...
ââ pt_PT/
ââ ...ãã®ç« ã®ãã¯ããã«ãã§è¿°ã¹ãããã«ãèšèªãç°ãªãã°ãè€æ°åœ¢ã®èŠåãç°ãªããããããªãããgettext ã 䜿ãã°ããã®åé¡ã¯äºåºŠãšèµ·ãããªããªããæ°ãã.poãã¡ã€ã«ãäœæãããšããã®èšèªã®ããã® è€æ°åœ¢ã«ãŒã« ã宣èšããå¿
èŠããããè€æ°åœ¢ãåºå¥ããå¿
èŠã®ãã翻蚳ãããéšåã¯ãããã®ã«ãŒã«ã«å¯ŸããŠç°ãªã圢åŒãæã€ãã³ãŒãã®äžããGettext ãåŒã³åºãå Žåããã®æã«é¢é£ããçªå·ãæå®ããå¿
èŠãããããŸããå¿
èŠã«å¿ããŠæåå眮æã䜿ã£ãŠããŠãã䜿çšããæ£ãã圢åŒã決å®ãããã
è€æ°åœ¢ã®ã«ãŒã«ã«ã¯äœ¿çšå¯èœãªè€æ°ã®æ°ãšãæå®ãããæ°ãã©ã®ã«ãŒã«ã«è©²åœããããå®çŸ©ãã (ã«ãŠã³ãã¯0ããå§ãŸã) n ãçšããããŒãªã¢ã³åã®ãã¹ããå«ãŸãããäŸïŒ
nplurals=1; plural=0 - ã«ãŒã«ã¯1ã€ã ãnplurals=2; plural=(n != 1); - ã«ãŒã«ã¯2ã€ãããNã1ã®å Žåã¯1ã€ç®nplurals=2; plural=(n > 1); - ã«ãŒã«ã¯2ã€ãããNã1ãã倧ããå Žåã¯2ã€ç®ãããã§ãªããã°1ã€ç®ããã§ãã©ã®ããã«è€æ°åœ¢ã«ãŒã«ãæ©èœãããã®åºç€ãçè§£ããããŸã çè§£ã§ããŠããªãã®ã§ããã°ãLingoHubãã¥ãŒããªã¢ã« ã®è©³ãã説æãåç §ããããšãå¿ èŠãªãã®ãæã§æžãã®ã§ã¯ãªãããªã¹ãããã³ããŒããããšæããããããªãã
ã«ãŠã³ã¿ã䜿ã£ãŠæã®ããŒã«ã©ã€ãºãè¡ãããã« Gettext ãåŒã³åºãå Žåãé¢é£ããæ°ãåæ§ã«çšæããå¿
èŠããããGettext ã¯ã©ã®ã«ãŒã«ãåæ ãã¹ããã倿ããæ£ããããŒã«ã©ã€ãºãããããŒãžã§ã³ã䜿çšãããå®çŸ©ãããããããã®è€æ°åœ¢ã«ãŒã«æ¯ã«ç°ãªãæã .po ãã¡ã€ã«ã«å«ããå¿
èŠãããã
çè«é¢ãäžéãçµãã£ãããå°ãå®çšçãªããšãæ±ãããããã«ã.po ãã¡ã€ã«ã®æç²ãããããã©ãŒãããã«ã€ããŠã¯æ°ã«ããªãã§ããã ããããã代ããã«å
šäœçãªå
容ã瀺ããåŸã§ç°¡åã«ç·šéããæ¹æ³ãåŠãŒãã
msgid ""
msgstr ""
"Language: pt_BR\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
msgid "We are now translating some strings"
msgstr "Nós estamos traduzindo algumas strings agora"
msgid "Hello %1$s! Your last visit was on %2$s"
msgstr "Olá %1$s! Sua última visita foi em %2$s"
msgid "Only one unread message"
msgid_plural "%d unread messages"
msgstr[0] "Só uma mensagem não lida"
msgstr[1] "%d mensagens não lidas"æåã®ã»ã¯ã·ã§ã³ã¯ãããã®ããã«æ©èœããmsgid ãš msgstr ã¯ç¹å¥ã«ç©ºã£ãœã ãããã§ã¯ããã¡ã€ã«ãšã³ã³ãŒãã£ã³ã°ãè€æ°åœ¢ããã®ä»ããŸãé¢ä¿ãªãããšã説æããŠããã
2ã€ç®ã®ã»ã¯ã·ã§ã³ã¯åçŽãªæååãè±èªãã(ãã©ãžã«ã§è©±ããã)ãã«ãã¬ã«èªãžç¿»èš³ããŠããã3ã€ç®ã®ã»ã¯ã·ã§ã³ãåãããšãããŠããããsprintfããã®æåå眮æã䜿ã£ãŠã翻蚳ã«ãŠãŒã¶åãšèšªåæ¥ãå«ãŸããããã«ããã
æåŸã®ã»ã¯ã·ã§ã³ã¯è€æ°å圢åŒã®äŸã§ãåæ°ãšè€æ°ã®ããŒãžã§ã³è±èªã§msgidãšããŠã察å¿ãã翻蚳ã msgstr 0ãš1ãšããŠè¡šç€ºããŠããïŒè€æ°åœ¢ã«ãŒã«ã§æå®ãããæ°åã«ç¶ãïŒãããã§ãæåå眮æã䜿ãããŠããã®ã§ãæ°åã¯%dã䜿ã£ãŠæã®äžã§çŽæ¥åç
§ããããšãã§ãããè€æ°åœ¢ã¯åžžã«2ã€ã®msgid(åæ°ãšè€æ°) ãããã®ã§ã翻蚳ã®ãœãŒã¹ãšããŠè€éãªèšèªãçšããªãããšããå§ãããã
ãæ°ã¥ããããããªãããæã
ã¯è±èªã®å®éã®æããœãŒã¹IDãšããŠäœ¿ã£ãŠããããã® msgid ã¯ãã¹ãŠã®.po ãã¡ã€ã«ã§åãããã«äœ¿ãããŠãããããã¯ã€ãŸããä»ã®èšèªãåããã©ãŒããããšåãmsgidãã£ãŒã«ããæã£ãŠããããmsgstrè¡ã¯ç¿»èš³ãããŠãããšããããšã ã
翻蚳ããŒã«é¢ããŠããã°ã2ã€ã®äž»èŠãªãæµæŽŸããããã
msgid.
äž»ãªå©ç¹ã¯äžèšã®éãïŒ
msgid ã«åºã¥ããŠé©åãªç¿»èš³ãè¡ãæ¹ãã¯ããã«ç°¡åã ãmsgid ã眮æããå¿
èŠãããããšã ãmsgid
ããã¯ã¢ããªã±ãŒã·ã§ã³å
ã®æã®åœ¹å²ããæ§é åãããæ¹æ³ã§èšè¿°ãããããã«ã¯ãæååã®å
容ã§ã¯ãªããæååãé
眮ããããã³ãã¬ãŒãããããã¯ãã®äžéšãå«ãŸããŠããã
en.po ãã¡ã€ã«ã管çãã翻蚳è
ã¯ãäŸãã° fr.po ã«äœãæžãããçè§£ããããã«ãããèªããHello there, User! ã§ã¯ãªããtop_menu.welcome ã衚瀺ããã)ã å
¬éåã«ç¡çãã翻蚳ã宿ãããã®ã¯ããããšã ãã翻蚳ã®åé¡ã¯ç»é¢äžã§éåžžã«ã²ã©ããã®ã«ãªãã ãããããããªãããã©ã€ãã©ãªã®äžã«ã¯ãä»ã®ã¢ãããŒããšåæ§ã®æ¯ãèãããã€ç¹å®ã®èšèªãããã©ãŒã«ããã¯ããšããŠæå®ãããªãã·ã§ã³ãå«ãŸããŠãããã®ããããGettextã®ããã¥ã¢ã« ã§ã¯ãéåžžã翻蚳è ããŠãŒã¶ããã©ãã«ã«èŠèãããå Žåã«ç°¡åã«å¯ŸåŠã§ããããã«ãæåã®ã¢ãããŒããæ¡çšããŠããããªã®ã§ããã§ããã®ãããªäœæ¥ãè¡ããããããªãããSymfonyããã¥ã¡ã³ã ã§ã¯ãããŒã¯ãŒãã«åºã¥ãç¿»èš³ãæ¡çšããŠããŠããã³ãã¬ãŒãã«åœ±é¿ãåãŒãããšãªããã¹ãŠã®ç¿»èš³ãåå¥ã«å€æŽã§ããããã«ããŠããã
äžè¬çãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããŒãžã«éçãªããã¹ããæžãéã«Gettext颿°ãçšããããããã®æã¯ã.po ãã¡ã€ã«ã«çŸãã翻蚳ããã.mo ãã¡ã€ã«ã«ã³ã³ãã€ã«ãããå®éã®ã€ã³ã¿ãã§ãŒã¹ãã¬ã³ããªã³ã°ãè¡ãéã«Gettext ã«ãã£ãŠäœ¿ãããããªã®ã§ããããŸã§è°è«ããŠããå
容ãé ã远ã£ãŠããµã³ãã«ã³ãŒãã§ãŸãšããŠã¿ããã
<?php include 'i18n_setup.php' ?>
<div id="header">
<h1><?=sprintf(gettext('Welcome, %s!'), $name)?></h1>
<!-- å¯èªæ§ã®ããã ãã«ããããã颚ã«ã³ãŒããã€ã³ãã³ãããŠãã -->
<?php if ($unread): ?>
<h2><?=sprintf(
ngettext('Only one unread message',
'%d unread messages',
$unread),
$unread)?>
</h2>
<?php endif ?>
</div>
<h1><?=gettext('Introduction')?></h1>
<p><?=gettext('We\'re now translating some strings')?></p>gettext() ã¯ãæå®ãããèšèªã«å¯ŸããŠãmsgid ã察å¿ãã msgstr ã«å€æãããåæ§ã«åäœããç°¡åãªé¢æ° _() ããããngettext() ã¯åãããšãããããè€æ°åœ¢ã«ãŒã«ãé©çšãããdgettext() ããdngettext() ããããïŒåã®åŒã³åºãã§ãã¡ã€ã³ãäžæžãã§ããããã«ããããã¡ã€ã³èšå®ã®è©³çްã«ã€ããŠã¯ã次ã®äŸãåç
§ããããšãi18n_setup.php)ãæ£ãããã±ãŒã«ã®éžæããGettext ã®èšå®ãè¡ã<?php
/**
* æå®ããã $locale ãããããžã§ã¯ãã§ãµããŒãããŠãããã確èªãã
* @param string $locale
* @return bool
*/
function valid($locale) {
return in_array($locale, ['en_US', 'en', 'pt_BR', 'pt', 'es_ES', 'es']);
}
//åèæ
å ±ãšããŠããœãŒã¹ãšãªã/ããã©ã«ãã®ãã±ãŒã«ãèšå®
$lang = 'en_US';
if (isset($_GET['lang']) && valid($_GET['lang'])) {
// ãã±ãŒã«ã¯ã¯ãšãªã¹ããªã³ã°ã§å€æŽã§ãã
$lang = $_GET['lang']; //ç¡å®³åãã¹ãïŒ
setcookie('lang', $lang); //åå©çšã§ããããã«ãcookie ã«ä¿å
} elseif (isset($_COOKIE['lang']) && valid($_COOKIE['lang'])) {
// cookie ãååšããŠããå Žåããã®å€ã䜿ã
$lang = $_COOKIE['lang']; //ç¡å®³åãã¹ãïŒ
} elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
// ããã©ã«ã: ãŠãŒã¶ãŒãåãå
¥ãããšãã©ãŠã¶ãèšã£ãŠããèšèªãæ¢ã
$langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
array_walk($langs, function (&$lang) { $lang = strtr(strtok($lang, ';'), ['-' => '_']); });
foreach ($langs as $browser_lang) {
if (valid($browser_lang)) {
$lang = $browser_lang;
break;
}
}
}
// èŠã€ãã£ãèšèªãæå®ããŠãã°ããŒãã«ãªã·ã¹ãã ãã±ãŒã«ãããã§å®çŸ©ãã
putenv("LANG=$lang");
// ããããŠãããšãããšãã°æ¥ä»é¢æ°(LC_TIME) ã é貚ã®ãã©ãŒããã(LC_MONETARY) ã§åœ¹ç«ã€ãã
setlocale(LC_ALL, $lang);
// Gettext ã« ../locales/<lang>/LC_MESSAGES/main.mo ãæ¢ãããã«æç€ºãã
bindtextdomain('main', '../locales');
// ãã¡ã€ã«ãèªã¿åºããšãã«ãã©ã®ãšã³ã³ãŒãã£ã³ã°ã䜿ãããæç€ºãã
bind_textdomain_codeset('main', 'UTF-8');
// ã¢ããªã±ãŒã·ã§ã³ã«è¿œå ã§ã翻蚳ã®ãã¡ã€ã³ãããå Žåãæ¢ã«èª¬æããããã«ãããã§ãã€ã³ãããŠãã
bindtextdomain('forum', '../locales');
bind_textdomain_codeset('forum', 'UTF-8');
// gettext() ãã³ãŒã«ããããšãã«ãå¿çããããã©ã«ãã®ãã¡ã€ã³ãããã§æå®ãã
textdomain('main');
// 以äžã®ããã«ãããšãmain.mo ã§ã¯ãªããforum.mo ã«ããæååãæ¢ãããã«ãªã
// echo dgettext('forum', 'Welcome back!');
?>Gettext ãç¬èªãã¬ãŒã ã¯ãŒã¯ã® i18n ããã±ãŒãžã«å¯ŸããŠæã£ãŠãã倧ããªå©ç¹ã®ïŒã€ã¯ãåºç¯ã§åŒ·åãªãã¡ã€ã«ãã©ãŒãããã ãããããGettext ã®ãã©ãŒããããçè§£ããæã§ç·šéããããšã¯éåžžã«å°é£ã ãåçŽãªé åã®æ¹ãç°¡åã ïŒãééããªããPoedit ã®ãããªã¢ããªã±ãŒã·ã§ã³ã 倧ãã« å©ãã«ãªãã圌ãã®ãŠã§ããµã€ãããããã°ã©ã ãå ¥æããããšãã§ãããã¹ãŠã®ãã©ãããã©ãŒã ã§ç¡æã§å©çšããããšãã§ãããããã¯ãç°¡åã«äœ¿ããããŒã«ã§ãããåæã«éåžžã«åŒ·åãªããŒã«ã§ãã - ãªããªããGettext ã䜿ãããã¹ãŠã®æ©èœã䜿ã£ãŠããããã ããã®ã¬ã€ã㯠PoEdit 1.8 ã«åºã¥ããŠããã
æåã®å®è¡ã§ã¯ãã¡ãã¥ãŒããããFile > NewâŠããéžæããå¿
èŠããããèšèªã¯çŽæ¥å
¥åããããã«æ±ãããããããã§ç¿»èš³ãããèšèªãéžæïŒãã£ã«ã¿ããããen_US ã pt_BR ã®ãããªãåè¿°ãã圢åŒã䜿çšã§ããã
次ã«ãå ã«èª¬æãããã£ã¬ã¯ããªæ§é ã䜿ã£ãŠãã¡ã€ã«ãä¿åãããããã«ããExtract from sourcesããã¯ãªãã¯ããããã§æœåºã¿ã¹ã¯ãšç¿»èš³ã¿ã¹ã¯ã®æ§ã ãªèšå®ãè¡ãããCatalog > Propertiesãã§ãåŸããããããã¹ãŠãèŠã€ããããšãã§ããããã«ãªãã
gettext()(ãšãã®å
åŒ) ãåŒã³åºããããããžã§ã¯ãã®ãã¹ãŠã®ãã©ã«ããå«ããå¿
èŠããããããã¯éåžžã¯templates/views ãã©ã«ãã ãããã¯å¯äžã®å¿
é èšå®é
ç®ã§ãããgettext() ãåæ§ã®é¢æ°åŒã³åºããããã€ãã®ããã°ã©ãã³ã°èšèªã§ã©ã®ããã«èŠããããç¥ã£ãŠããããç¬èªã®ç¿»èš³é¢æ°ãäœæããæ¹ãè¯ãå Žåããããããã§ã¯ããããªå¥ã®ã¡ãœããã远å ãããããã«ã€ããŠã¯ãåŸè¿°ããããã³ããã®ç« ã§èª¬æããããããã®ãã€ã³ããèšå®ããåŸãPoEditã¯ãœãŒã¹ãã¡ã€ã«ãã¹ãã£ã³ããŠããŒã«ã©ã€ãºã®åŒã³åºããå šãŠæŽãåºããã¹ãã£ã³ãããã³ã«ãPoEdit ã¯æ€åºããããã®ãšãœãŒã¹ãã¡ã€ã«ããåé€ãããå 容ã®ãµããªã衚瀺ãããæ°ãããšã³ããªã¯ç©ºã®ãŸãŸå€æããŒãã«ã«å ¥åãããããŒã«ã©ã€ãºãããããŒãžã§ã³ã®æååãå ¥åãå§ããããããä¿åããããšã.mo ãã¡ã€ã«ã¯åããã©ã«ãã«ïŒåã³)ã³ã³ãã€ã«ããããããžã§ã¯ããåœéåãããã
ãã§ã«ãæ°ã¥ããããããªãããããŒã«ã©ã€ãºãããæååã«ã¯ã2ã€ã®äž»ãªã¿ã€ãããããåæ°ã®ãã®ãšãããè€æ°åœ¢ã«ãããã®ã ã1ã€ç®ã¯ããœãŒã¹ãšããŒã«ã©ã€ãºãããæååã®2ã€ã®ããã¯ã¹ãããã ãã ãGettext/Poedit ã«ã¯ãœãŒã¹ãã¡ã€ã«ã倿Žããæš©éããªãã®ã§ããœãŒã¹æååã¯å€æŽã§ããªãããœãŒã¹èªäœã倿ŽããŠãåã¹ãã£ã³ããå¿ èŠãããããã³ãïŒç¿»èš³è¡ãå³ã¯ãªãã¯ãããšããã®æååã䜿ãããŠãããœãŒã¹ãã¡ã€ã«ãšè¡ã®ãã³ãã衚瀺ãããã 仿¹ãè€æ°åœ¢æååã«ã¯2ã€ã®ãœãŒã¹æååã衚瀺ãã2ã€ã®ããã¯ã¹ãšãæ§ã ãªæçµåœ¢åŒãèšå®å¯èœãªã¿ããå«ãŸããŠããã
ãœãŒã¹ã倿ŽããŠç¿»èš³ãæŽæ°ããå¿ èŠãããå Žåã¯ãã€ã§ããRefresh ãã¯ãªãã¯ããã ãã§ Poedit ã¯ã³ãŒããåã¹ãã£ã³ããååšããªããšã³ããªãåé€ãã倿Žããããšã³ããªãããŒãžããŠæ°ãããšã³ããªã远å ãããããªããè¡ã£ãä»ã®ç¿»èš³ã«åºã¥ããŠãããã€ãã®ç¿»èš³ãæšæž¬ããããšããå Žåãããããããã®æšè«ãšå€æŽããããšã³ããªã«ã¯ãFuzzyãããŒã«ãŒãä»äžãããæ€èšŒãå¿ èŠã§ããããšã瀺ããããªã¹ãäžã«éè²ã§è¡šç€ºãããããã翻蚳ããŒã ãããŠã誰ããäžç¢ºããªããšãæžãããšããå Žåã«ã䟿å©ã ãFuzzy ãããŒã¯ããã ãã§ãä»ã®èª°ããåŸããã¬ãã¥ãŒããŠãããããã ã
æåŸã«ããView > Untranslated entries firstãããŒã¯ãã€ããŠããããšããå§ããããããã¯ããšã³ããªãå¿ããªãããã«ããã®ã« 倧ã㫠圹ã«ç«ã€ããã ããã®ã¡ãã¥ãŒãããå¿ èŠã«å¿ããŠã翻蚳è ãã¡ã«ã³ã³ããã¹ãã®æ å ±ãæ®ãããšãã§ãã UI ããªãŒãã³ããããšãã§ããã
PHP ã Apache äžã®ã¢ãžã¥ãŒã«(mod_php) ãšããŠå®è¡ããŠããå Žåã.mo ãã¡ã€ã«ããã£ãã·ã¥ãããåé¡ã«çŽé¢ãããããããªããããã¯æåã«èªã¿èŸŒãŸããæã«çºçããæŽæ°ããã«ã¯ããµãŒããåèµ·åããå¿
èŠããããNginx ãš PHP5 ã§ã¯éåžžã翻蚳ãã£ãã·ã¥ãæŽæ°ããã®ã«ãæ°ããŒãžãæŽæ°ããã ãã§ãããPHP7 ã§ã¯ã»ãšãã©å¿
èŠãªãã
å€ãã®äººã奜ãããæ¹ã ããgettext() ã®ä»£ããã«ã_() ãäœ¿ãæ¹ãç°¡åã ããã¬ãŒã ã¯ãŒã¯ã«åãã£ãŠããå€ãã®ã«ã¹ã¿ã i18n ã©ã€ãã©ãªãã倿ãããã³ãŒããçãããããã« t() ã«äŒŒããã®ã䜿ã£ãŠãããããããªãããããã¯ã·ã§ãŒãã«ãããåããå¯äžã®é¢æ°ã ãngettext() ã®ããã®__()ã_n()ããããžã§ã¯ãã«è¿œå ããããè¯çŸãª _r() ã gettext() ã sprintf()ã®åŒã³åºãã«è¿œå ããããªããããããªããphp-gettextã®Gettext ã®ãããªä»ã®ã©ã€ãã©ãªã§ãããããã®ãããªãã«ããŒé¢æ°ãæäŸãããŠããã
ããããå Žåããããã®æ°ãã颿°ããæååãæœåºããæ¹æ³ãGettextãŠãŒãã£ãªãã£ã«æç€ºããå¿
èŠãããããããæããå¿
èŠã¯ãªãããšãŠãç°¡åã ãããããæç€ºã¯ .po ãã¡ã€ã«ã«ãããã£ãŒã«ããããã㯠Poedit ã®èšå®ç»é¢ã§è¡ãããšãã£ã¿ã§ã¯ããã®ãªãã·ã§ã³ã¯ãCatalog > Properties > Source keywordsãã®äžã«ãããèŠããŠãããŠã»ããã®ã¯ãGettext ã¯å€ãã®èšèªã®ããã®ããã©ã«ã颿°ããã§ã«ããã£ãŠããã®ã§ããã®ãªã¹ãã空ã£ãœã®ããã«èŠããŠãæããå¿
èŠã¯ãªãããšããããšã ãç¹å®ã®åœ¢åŒ ã«åŸã£ãŠããããã®æ°ãã颿°ã®ä»æ§ãå«ããå¿
èŠãããã
t()ã®ãããªãã®ãäœæããå Žåãt ãšæå®ããããšãã§ããã
Gettextã¯é¢æ°ã®åŒæ°ã翻蚳ãããã¹ãæååã§ãããšèªèãã.__('one user', '%d users', $number) 颿°ãåŒã³åºããšããã®æå®ã¯__:1,2 ã«ãªããããã¯æåã®åœ¢åŒã1ã€ç®ã®åŒæ°ã§ã2ã€ãã®åœ¢åŒã2ã€ç®ã®åŒæ°ã§ããããšãæå³ããã代ããã«ãæ°åãæåã®åŒæ°ãšããŠæå®ãããå Žåãæå®ã¯ã__:2,3ãšãªããæåã®åœ¢åŒã2ã€ç®ã®åŒæ°ã§ããããšç€ºãããšããå
·åã ããããã®æ°ããã«ãŒã«ã.po ãã¡ã€ã«ã«å«ããããšãæ°ãã«ã¹ãã£ã³ãå®è¡ãããšã以åãšåæ§ãç°¡åã«æ°ããæååãåã蟌ãŸããã
Wikipediaã«ãããšã
äŸåæ§ã®æ³šå ¥ãšã¯ãœãããŠã§ã¢ãã¶ã€ã³ãã¿ãŒã³ã®1ã€ã§ãããäŸåé¢ä¿ããœãŒã¹ã³ãŒãããæé€ããŠãå®è¡æãããã¯ã³ã³ãã€ã«æã«ãã®äŸåé¢ä¿ã倿Žã§ããããã«ããã
ãšã®ããšã ãããã®èª¬æã¯å¿ èŠä»¥äžã«å°é£ããèšã£ãŠããããã«æããã äŸåæ§ã®æ³šå ¥ãšã¯ã³ã³ããŒãã³ãã«äŸåé¢ä¿ãæž¡ããä»çµã¿ã®ããšã§ãã³ã³ã¹ãã©ã¯ã¿ã§æ³šå ¥ãããã¡ãœããåŒã³åºãããããããããã£ãèšå®ããããšãã£ãæ¹æ³ãããã ããã ãã®ããšã ã
èãããã説æããããã«ãã·ã³ãã«ãªäŸã瀺ããã现ãããšããã¯æãæããŠãããã©ãã
ããã« Database ã¯ã©ã¹ããããããã€ãããŒã¿ããŒã¹ãšãããšãããããã«ã¯ãäœããã®ã¢ããã¿ãŒãå¿
èŠã ã
ããã§ãã³ã³ã¹ãã©ã¯ã¿ã®äžã§ã¢ããã¿ãŒã®ã€ã³ã¹ã¿ã³ã¹ãäœã£ãŠãããã¢ããã¿ãŒã®ååãçŽæ¥æå®ããŠãã
ãããªæžãããã ãš Database ã¯ã©ã¹ãåäœã§ãã¹ãããã®ãé£ãããªããã
ãã®ã¯ã©ã¹ãã¢ããã¿ãŒãšå¯æ¥ã«çµã³ã€ããŠããŸãã
<?php
namespace Database;
class Database
{
protected $adapter;
public function __construct()
{
$this->adapter = new MySqlAdapter;
}
}
class MysqlAdapter {}ãã®ã³ãŒããæžãæããŠäŸåæ§ã®æ³šå ¥ã䜿ãããã«ããã°ããã®äŸåé¢ä¿ãç·©ããã«ã§ããã ããã§ã¯ãã³ã³ã¹ãã©ã¯ã¿ã«äŸåæ§ãæ³šå ¥ããããšã«ããã¯ã©ã¹ã暪æããŠããããã£ã䜿ããããã«ããããã« ã³ã³ã¹ãã©ã¯ã¿ã®ããã¢ãŒã·ã§ã³ ã䜿ãããšã«ããã:
<?php
namespace Database;
class Database
{
public function __construct(protected MySqlAdapter $adapter)
{
}
}
class MysqlAdapter {}ããã§ãäŸåé¢ä¿ãå€éšãã Database ã¯ã©ã¹ã«æž¡ããããã«ãªã£ãããã®ã¯ã©ã¹èªèº«ã«äœãããå¿
èŠããªããªã£ããã ã
ã³ã³ã¹ãã©ã¯ã¿ã§æå®ãã以å€ã«ããäŸåé¢ä¿ãåŒæ°ã§åãåã£ãŠãããèšå®ãããããªã¡ãœãããæ°ãã«äœã£ãŠããããã
ããã㯠$adapter ãšãã public ããããã£ãäœã£ãŠãäŸåé¢ä¿ãçŽæ¥èšå®ã§ããããã«ããŠãããã
ãããŸã§ã«äŸåæ§ã®æ³šå ¥ã«ã€ããŠèª¿ã¹ãããšããã人ãªãã âå¶åŸ¡ã®å転ïŒIoCïŒInversion of ControlïŒâ ã âäŸåé¢ä¿é転ã®ååïŒDIPïŒDependency Inversion PrincipleïŒâ ãšãã£ãèšèã«èŠèŠããããã ããããããã¯è€éãªåé¡ã§ãäŸåæ§ã®æ³šå ¥ã«ãã£ãŠè§£æ±ºã§ãããã®ã ã
å¶åŸ¡ã®å転ãšã¯ãæåéããã·ã¹ãã ã®ãå¶åŸ¡ãå転ãããããšã ãã·ã¹ãã å šäœã®å¶åŸ¡ãããªããžã§ã¯ãããåãé¢ãããŸãŸã§è¡ãã äŸåæ§ã®æ³šå ¥ã®æèã§ã¯ãäŸåé¢ä¿ã®å¶åŸ¡ãäœæããã·ã¹ãã å ã®ã©ããå¥ã®å Žæã§ããã£ãŠããšãæå³ããã
PHPã®ãã¬ãŒã ã¯ãŒã¯ã§ããå¶åŸ¡ã®å転ã¯å®çŸãããŠãããã§ããå®éã®ãšãããäœã®å¶åŸ¡ãå転ããŠããã®ã ããããããŠãå転ããçµæãå¶åŸ¡ã¯ã©ãã«è¡ã£ãŠããŸã£ãã®ã ããã ããšãã°ããããŠãã®MVCãã¬ãŒã ã¯ãŒã¯ã«ã¯ãããããã³ã³ãããŒã©ã®èŠªã«ãªãåºåºã³ã³ãããŒã©ãçšæãããŠããã ãããŠããããç¶æ¿ããªããã°äŸåé¢ä¿ã«ã¢ã¯ã»ã¹ã§ããªãã ããã¯ããã§å¶åŸ¡ã®å転ã ããã§ããäŸåé¢ä¿ãç·©ããããšããããã¯ãåçŽã«äŸåé¢ä¿ãå¥ã®å Žæã«ç§»ããã ãã®ããšã ã
äŸåæ§ã®æ³šå ¥ã䜿ãã°ãããããã£ãšãã£ãããšè§£æ±ºã§ãããäŸåé¢ä¿ãå¿ èŠã«ãªã£ããšãã«ãå¿ èŠãªãã®ã ããæ³šå ¥ããã°ããã ããŒãã³ãŒãã£ã³ã°ããå¿ èŠã¯ãªãã
åäžè²¬ä»»ã®ååã¯ãã¢ã¯ã¿ãŒãšé«ã¬ãã«ãªã¢ãŒããã¯ãã£ãŒã«é¢ãããã®ã ããã㯠âã¯ã©ã¹ã倿Žããçç±ã¯ãã²ãšã€ã ãã§ããã¹ãã§ããâ ãšããååã ãããã¯ãåã ã®ã¯ã©ã¹ã¯ããœãããŠã§ã¢ãæäŸããåäžã®æ©èœã®ã¿ã«ã€ããŠè²¬ä»»ãæã€ã¹ãã§ãããšããããšã ããã®ã¢ãããŒããæ¡çšããæå€§ã®å©ç¹ã¯ãåå©çšæ§ãé«ããããšãã§ããããšã«ãããæã ã®ã¯ã©ã¹ãã²ãšã€ã®ããšã ããããŠããã°ãä»ã®ããã°ã©ã ã§ãããã倿Žããããšãªã䜿ãïŒãŸãã¯åå©çšïŒããããšãã§ããã
éæŸ/ééåå(Open/Closed Principle) ã¯ãã¯ã©ã¹èšèšãšæ©èœã®æ¡åŒµã«é¢ãããã®ã ãããã¯âãœãããŠã§ã¢ã®èŠçŽ (ã¯ã©ã¹ãã¢ãžã¥ãŒã«ã颿°ãªã©)ã¯ãæ¡åŒµã«å¯ŸããŠã¯éããŠãããä¿®æ£ã«å¯ŸããŠã¯éããŠããã¹ãã§ããâ ãšããååã ãããã¯ãæ°ããæ©èœãå¿ èŠã«ãªã£ãæã¯ãæ¢åã®ã³ãŒãã倿Žãããæ¢åã®ã³ãŒãã䜿ã£ãŠæ°ããã³ãŒããæžããããã«ã¯ã©ã¹ãã¢ãžã¥ãŒã«ã颿°ãèšèšãã¹ããšããããšã ãå®çšçãªèšãæ¹ããããšãã€ã³ã¿ãŒãã§ã€ã¹ã«åŸã£ãŠã¯ã©ã¹ãå®è£ ããç¹å®ã®ã¯ã©ã¹ã§ã¯ãªããã€ã³ã¿ãŒãã§ã€ã¹ã䜿ã£ãŠã¿ã€ããã³ããä»ããã¹ããšããããšã ã
ãã®ã¢ãããŒããæ¡çšããæå€§ã®å©ç¹ã¯ãæ¢åã®ã³ãŒãã倿Žããããšãªããæ°ããæ©èœããµããŒãã§ããããç°¡åã«æ¡åŒµã§ããããšã ãããããããšã§ãQA ã«ãããæéãåæžã§ããã¢ããªã±ãŒã·ã§ã³ãå®è³ªçã«å£ããŠããŸããªã¹ã¯ããæªã圱é¿ãé¿ããããšãã§ãããããã«ããããããšã§ãæ°ããã³ãŒããçŽ æ©ããèªä¿¡ããã£ãŠãããã€ã§ããããã«ãªãã
ãªã¹ã³ãã®çœ®æååã¯ããµãã¿ã€ãã³ã°ãšç¶æ¿ã«é¢ãããã®ã ããã㯠âåã¯ã©ã¹ã¯ã絶察ã«èŠªã¯ã©ã¹ã®åå®çŸ©ãå£ããŠã¯ãããªãâ ãšããååã ãRobert C. Martin ã®èšèãåããã° âãµãã¿ã€ãã¯ãåºåºåã代æ¿ã§ããªããã°ãªããªãâ ãšããããšã ã
äŸããããããembed() ã¡ãœãããå®çŸ©ããã€ã³ã¿ãŒãã§ã€ã¹ FileInterface ããããšããããããŠããã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããã¯ã©ã¹ Audio ãš Video ããããšããŠãembed() ã®äœ¿ãæ¹ã¯åžžã«æåŸ
éãã§ãããšããããåŸã«ãªã£ãŠãFileInterface ãå®è£
ãã PDF ã Gist ã¯ã©ã¹ãäœãããšã«ãªã£ãŠããembed() ã¡ãœãããäœãããããæã
ã¯ããã£ãŠããã¯ãã ããã®ã¢ãããŒããæ¡çšããæå€§ã®å©ç¹ã¯ãæè»æ§ããããç°¡åã«èšå®å¯èœãªããã°ã©ã ãäœããããšã ããªããªãããªããžã§ã¯ãã®å (ããã§ã¯ FileInterface) ãå¥ã®åã«å€æŽããŠããããã°ã©ã ã倿Žããå¿
èŠã¯ãªãããã ã
ã€ã³ã¿ãŒãã§ã€ã¹åé¢ã®åå(ISP)ãšã¯ãããžãã¹ããžãã¯ãšã¯ã©ã€ã¢ã³ãã®éä¿¡ã«é¢ãããã®ã ãããã¯ãâã©ã®ã¯ã©ã€ã¢ã³ãããèªåã䜿ããªãã¡ãœããã«äŸåããŠã¯ãããªãâ ãšããååã ãããã¯ãå šãŠã®ã¯ã©ã¹ãåŸããå®è£ ããå¿ èŠãããåäžã®ã¢ããªã·ãã¯ãªã€ã³ã¿ãŒãã§ã€ã¹ãæã€ã®ã§ã¯ãªããå°ããªãç¹å®ã®æŠå¿µãæã€ã€ã³ã¿ãŒãã§ã€ã¹ã®éåãæäŸããã¯ã©ã¹ã¯ããããã²ãšã€ä»¥äžå®è£ ãã¹ããšããããšã ã
äŸããããããCar ã Bus ã¯ã©ã¹ã¯ steeringWheel() ã¡ãœããã«é¢å¿ããããšããããäžæ¹ã§ãMotorcycle ã Tricycle ã¯ã©ã¹ã¯ãã®ã¡ãœããã«é¢å¿ããªããšãããå察㫠Motorcycle ã Tricycle 㯠handlebars() ã¡ãœããã«é¢å¿ãããããCar ã Bus ã¡ãœããã¯ãã®ã¡ãœããã«é¢å¿ããªããšããããã®å Žåããããå
šãŠã®è»äž¡ã®åã steeringWheel() ãš handlebars() ãäž¡æ¹ãµããŒãããããã«ããããã®ã¡ãœãããå®è£
ããå¿
èŠã¯ãªããã€ã³ã¿ãŒãã§ã€ã¹ãåå²ãã¹ãã ã
äŸåé¢ä¿é転ã®ååã¯ãè€æ°ã®å ·è±¡ã¯ã©ã¹ã®éã§ã¯ãå¯çµåããªãããã«ããååã ããããå®ããšãç°ãªãã¯ã©ã¹ãæž¡ãããšã§ãæ°ããæ©èœãå©çšã§ããããã«ãªãã ããã¯ ãæœè±¡ã«äŸåãããå ·è±¡ã«äŸåãããªã ãšããååã ã ç°¡åã«èšããšãäŸåé¢ä¿ã¯ã€ã³ã¿ãŒãã§ã€ã¹ãæœè±¡ã¯ã©ã¹ã«å¯ŸããŠèšå®ãã¹ããã®ã§ããããããå®è£ ããã¯ã©ã¹ã«å¯ŸããŠèšå®ããŠã¯ãããªãã£ãŠããšã å ã»ã©ã®äŸããã®ååã«æ²¿ã£ãŠæžãçŽããšããããªãµãã«ãªãã
<?php
namespace Database;
class Database
{
public function __construct(protected AdapterInterface $adapter)
{
}
}
interface AdapterInterface {}
class MysqlAdapter implements AdapterInterface {}ããã§ Database ã¯ã©ã¹ã¯ãå
·è±¡ã¯ã©ã¹ã§ã¯ãªãã€ã³ã¿ãŒãã§ã€ã¹ã«äŸåããããã«å€ãã£ããã§ããã£ããäœããããããã ããã
ãããªå Žé¢ãèããŠã¿ãããåã¯ä»ããšããããŒã ã®äžå¡ãšããŠäœæ¥ãããŠãããã¢ããã¿ãŒãäœã£ãŠããã®ã¯å¥ã®ã¡ã³ããŒã ã æåã®äŸã ãšããã®äººãã¢ããã¿ãŒã宿ããããŸã§ã¯ãèªåã®ã³ãŒãã®ãŠããããã¹ãã®ã¢ãã¯ãäœããªãã ã€ã³ã¿ãŒãã§ã€ã¹ã«äŸåããããã«ããæ°ããããŒãžã§ã³ã ãšããã®ã€ã³ã¿ãŒãã§ã€ã¹ã䜿ã£ãŠã¢ãã¯ãäœãããšãã§ããã ååãäœãã¢ããã¿ãŒããã®ã€ã³ã¿ãŒãã§ã€ã¹ã«æ²¿ã£ãŠãããšããã£ãŠããããã ã
ãããªããšããããã£ãšãã°ãããã¡ãªãããããããã£ã¡ã®æ¹åŒã®ã»ãããã³ãŒãããã£ãšã¹ã±ãŒã©ãã«ã«ãªããã ã ä»®ã«å°æ¥ãå¥ã®ããŒã¿ããŒã¹ã«ç§»è¡ããããšã«ãªã£ããšãããã ãããªå Žåã§ãããã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããæ°ããã¢ããã¿ãŒãæžãããããã§ãããŸãã ã ãã以å€ã¯äœããããå¿ èŠããªãã æ°ããã¢ããã¿ãŒããã¡ããšæ±ºãŸãããšã«åŸã£ãŠãããšããããšããã€ã³ã¿ãŒãã§ã€ã¹ãä¿èšŒããŠãããããã ã
DIã³ã³ããã«ã€ããŠãŸãç¥ã£ãŠããã¹ããªã®ã¯ãDIã³ã³ããã䜿ã£ãŠããããã°ãäŸåæ§ã®æ³šå ¥ããã§ããããã§ã¯ãªãã£ãŠããšã ã DIã³ã³ããã¯ãäŸåæ§ã®æ³šå ¥ãå®çŸããããã®äŸ¿å©ãªéå ·ãšããŠäœ¿ããã ã§ããäœ¿ãæ¹ããã¹ã£ãŠããµãŒãã¹ãã±ãŒã·ã§ã³ãšããã¢ã³ããã¿ãŒã³ãäœã£ãŠããŸã£ãŠããããšãå€ãã DIã³ã³ããããµãŒãã¹ãã±ãŒã¿ãŒãšããŠã¯ã©ã¹ã«çµã¿èŸŒãã§ããŸããšã äŸåé¢ä¿ãå¥ã®å Žæã«ç§»ãããšããŠããã¯ããªã®ã«ããããã€ãäŸåé¢ä¿ãäœã蟌ãããšã«ãªãã ããŸãã«ãã®ã³ãŒãã¯ãããã«ãããªã£ãŠããŸããããã¹ãããã¥ãããªãã
ããŸã©ãã®ãã¬ãŒã ã¯ãŒã¯ã«ã¯ãããŠãDIã³ã³ãããçšæãããŠããŠãäŸåé¢ä¿ãã³ãŒã以å€ã®ãšããã§èšå®ã§ããã èŠããã«ãã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒãããã£ãããšæžããŠããã¬ãŒã ã¯ãŒã¯æ¬äœãšããŸã坿¥ã«ã€ãªãããããªãããã«ã§ãããšããããšã
PHP ã®ã³ãŒããæžããŠãããšãæ å ±ãä¿åããããã«ããŒã¿ããŒã¹ã䜿ãããšãå€ããªãã ããŒã¿ããŒã¹ãæäœããã«ã¯ãããã€ãã®æ¹æ³ãããã PHP 5.1.0 ã®æä»£ãŸã§ã¯ ãããããã®æ¹æ³ã¯ mysqliãpgsqlãmssql ãªã©ã®ãã€ãã£ããã©ã€ãã䜿ãããšã ã£ãã
ãã®ããŒã¿ããŒã¹ãã䜿ããªããïŒã£ãŠããã®ãªããã€ãã£ããã©ã€ããããã ã§ãããšãã°ãMySQL ã䜿ã£ãŠãããã©äžéšã¯ MSSQL ã§ãããšãã Oracle ã«ãã€ãªãããšããããšãããããªå Žåã¯åããã©ã€ãã§ã¯å¯Ÿå¿ã§ããªãã ãããŠãããŒã¿ããŒã¹ãå€ãããã³ã«æ°ãã API ãèŠããªããšãããªãããšã«ãªãã ã°ããã話ã ã
PHP çšã® mysql æ¡åŒµã¢ãžã¥ãŒã«ã¯æ¢ã«æãã£ããå€ããªã£ãŠããŠããããã®æ¡åŒµã¢ãžã¥ãŒã«ããã®åŸç¶ã«ãªã£ãŠããã
mysql æ¡åŒµã¢ãžã¥ãŒã«ã®éçºã¯å€§æã«çµäºããŠããã ãã§ãªããPHP 7.0.0ã§å ¬åŒã«åé€ãããŠãã ã
ããŸäœ¿ã£ãŠããã¢ãžã¥ãŒã«ãã©ããªã®ããç¥ããããªãããããã php.ini ã®èšå®ã調ã¹ããŸã§ããªãã
ã奜ã¿ã®ãšãã£ã¿ãŒã§ mysql_* ãæ€çŽ¢ããŠã¿ãã°ããã
mysql_connect() ãšã mysql_query() ã¿ãããªé¢æ°ãããããããã mysql ã¢ãžã¥ãŒã«ã䜿ã£ãŠãã£ãŠããšã ã
åœé¢ã¯ PHP 7.x 以éã䜿ãã€ããããªãã®ã ãšããŠããä»ã¡ãããšèããŠãããªããšããããšãããšãã«å€§å€ãªããšã«ãªãã ãã¡ã°ãããã®ã¯ãéåžžã®éçºã¹ã±ãžã¥ãŒã«ã®äžã§ãmysql ã¢ãžã¥ãŒã«ã䜿ã£ãŠããéšåã mysqli ã PDO ã«åŸã ã«çœ®ãæããŠããããšã ã ããããã°ãåŸã«ãªã£ãŠããããã«ããã
** mysql ãã mysqli ãžã®ç§»è¡ã«ã€ããŠãåã«ãmysql_* ã mysqli_* ã«çœ®æããã°OKããªã©ãšæžããŠãããããªèšäºã«ã¯çšå¿ããããšã話ãåçŽåããããŠããã ãã§ã¯ãªããmysqli ãªãã§ã¯ã®å©ç¹ïŒãã©ã¡ãŒã¿ã®ãã€ã³ããªã©ããã㯠PDO ã§ãçšæãããŠããïŒã®æŽ»çšãã§ããªããªã£ãŠããŸãã **
PDO ã¯ããŒã¿ããŒã¹ãšã®æ¥ç¶ãæœè±¡åããã©ã€ãã©ãªã ãPHP 5.1.0 以éã«çµã¿èŸŒãŸããŠããŠã ããããªããŒã¿ããŒã¹ãåãã€ã³ã¿ãŒãã§ã€ã¹ã§æ±ããã MySQLã䜿ãã³ãŒããSQLiteã䜿ãã³ãŒãããåºæ¬çã«ã¯åãããã«ãªãã£ãŠããšã ã
<?php
// PDO + MySQL
$pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
$statement = $pdo->query("SELECT some_field FROM some_table");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['some_field']);
// PDO + SQLite
$pdo = new PDO('sqlite:/path/db/foo.sqlite');
$statement = $pdo->query("SELECT some_field FROM some_table");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['some_field']);PDO ã¯ãSQL ã®ã¯ãšãªãããŒã¿ããŒã¹ã«ããããŠå€æãããã®ã§ã¯ãªããã ããšããšååšããªãæ©èœããšãã¥ã¬ãŒããããã®ã§ããªãã çŽç²ã«ãããããªããŒã¿ããŒã¹ã«åã API ã§æ¥ç¶ããããã®ãã®ã ã
ãã£ãšå€§åãªããšã¯ãPDO ã䜿ãã°ãå€éšããã®å
¥å (ID ãªã©)
ãå®å
šã« SQL ã¯ãšãªã«åã蟌ãããšããããšã ãããŒã¿ããŒã¹ãžã®
SQL ã€ã³ãžã§ã¯ã·ã§ã³æ»æãå¿é
ããªããŠããããªãã
ãã®ããã«ã¯ãPDO ã¹ããŒãã¡ã³ããšãã€ã³ã倿°ã䜿ãã°ããã
æ°å€ã® ID ãã¯ãšãªæååãšããŠåãåã PHP ã¹ã¯ãªãããèããŠã¿ããã
æž¡ããã ID ã䜿ã£ãŠãããŒã¿ããŒã¹ãããŠãŒã¶ãŒæ
å ±ãåãåºãã
æåã«ç€ºãã®ã¯ æªãæ¹æ³ ã ã
<?php
$pdo = new PDO('sqlite:/path/db/users.db');
$pdo->query("SELECT name FROM users WHERE id = " . $_GET['id']); // <-- ãã¡ããŒãã¿ã€ïŒãããªæãããã³ãŒããæžãã¡ããããªãã
ããã¯ãã¯ãšãªæååã®ãã©ã¡ãŒã¿ã SQL ã«çŽã«åã蟌ãã§ããããšã«ãªãã
ãã£ãšããéã« SQLã€ã³ãžã§ã¯ã·ã§ã³ æ»æãé£ããã ããã
ã©ããã®ããããããæ»æè
ã id ã«æž¡ãå
容ãã²ãšå·¥å€«ããŠ
http://domain.com/?id=1%3BDELETE+FROM+users ã¿ãã㪠URL ãåŒãã ãšãããã
ãã®ãšã倿° $_GET['id'] ã®å
容㯠1;DELETE FROM users ãšãªããå
šãŠãŒã¶ãŒãæ¶ããŠããŸãããšã«ãªãïŒ
ãããªæžãæ¹ã§ã¯ãªããPDO ã®ãã€ã³ã倿°ã§ ID ãåãåããªããšãããªãã
<?php
$pdo = new PDO('sqlite:/path/db/users.db');
$stmt = $pdo->prepare('SELECT name FROM users WHERE id = :id');
$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT); // <-- ãŸãããŒã¿ã®ãã£ã«ã¿ãªã³ã°ãè¡ã ([ããŒã¿ã®ãã£ã«ã¿ãªã³ã°](#data_filtering) ãåç
§)ãç¹ã« INSERT ã UPDATE ãªã©ã§éèŠ
$stmt->bindParam(':id', $id, PDO::PARAM_INT); // <-- PDOãèªåçã«SQLã®ãšã¹ã±ãŒãåŠçããã
$stmt->execute();ãããæ£ããæ¹æ³ã ããã®äŸã§ã¯ãPDO ã¹ããŒãã¡ã³ãã§ãã€ã³ã倿°ã䜿ã£ãŠããã å€éšããã®å ¥åã§ãã ID ããšã¹ã±ãŒããããŠããããŒã¿ããŒã¹ã«æž¡ãã®ã§ã SQL ã€ã³ãžã§ã¯ã·ã§ã³æ»æãåããããšããªããªãã
INSERT ã UPDATE ãªã©ã®æžãèŸŒã¿æäœã®å Žåã¯ããŸã ããŒã¿ããã£ã«ã¿ãªã³ã° ããããšã倧åã ã ãã®åŸã§ããã®ä» (HTML ã¿ã°ã JavaScript ãªã©) ã®ãšã¹ã±ãŒããè¡ãã PDO ã¯ãããŸã§ã SQL çšã®ãšã¹ã±ãŒããè¡ããã®ã§ãããã¢ããªã±ãŒã·ã§ã³å šäœã®é¢åãã¿ãŠãããããã§ã¯ãªãã
ããšãããŒã¿ããŒã¹ã®ã³ãã¯ã·ã§ã³ã¯ãªãœãŒã¹ã䜿ããšããããšã«ãæ°ãã€ãããã ã³ãã¯ã·ã§ã³ãæç€ºçã«éããããšãå¿ããããã§ãªãœãŒã¹ãé£ãã€ã¶ããŠããŸããªããŠè©±ã¯çãããªãã ãšã¯ãããããã¯å¥ã«PHPã«éã£ã話ã§ããªããã©ãã PDOã䜿ã£ãŠããå Žåã¯ããªããžã§ã¯ããžã®åç §ããã¹ãŠåé€ããŠ(Nullãä»£å ¥ãããªã©ããŠ) ãªããžã§ã¯ããç Žæ£ããŠããŸãã°ãæé»ã®ãã¡ã«ã³ãã¯ã·ã§ã³ãéããããšãä¿èšŒãããã ãªããžã§ã¯ããæç€ºçã«ç Žæ£ããªãå Žåã¯ãã¹ã¯ãªããã®å®è¡ãçµãã£ãæç¹ã§PHPãèªåçã«æ¥ç¶ãéããã ãã¡ãããæç¶çæ¥ç¶ã䜿ã£ãŠããå Žåã¯å¥ã ã
PHPãå匷ãå§ããã°ããã®éçºè ããã£ãŠããŸããã¡ãªã®ããããŒã¿ããŒã¹ãšã®ãããšããšç»é¢è¡šç€ºã®ããžãã¯ããã¡ããŸãã«ããŠããŸãããšã ã ããšãã°ããããªã³ãŒãã«ãªãã
<ul>
<?php
foreach ($db->query('SELECT * FROM table') as $row) {
echo "<li>".$row['field1']." - ".$row['field1']."</li>";
}
?>
</ul>ããã¯ãããããæå³ã§ãããããªãã ãŸãäœãšèšã£ãŠãããããã°ãã¥ãããããã¹ãããã¥ããããèªã¿ã¥ããã ããšãäœãå¶éããããŠããªãå Žåã«ã倧éã®ãã£ãŒã«ããåºåããŠããŸãããšã«ãªãã
åãããšããã£ãšãã£ããè¡ãæ¹æ³ã¯ãããããããOOPã奜ããªäººåãã®ãããããããã° é¢æ°åããã°ã©ãã³ã°ã奜ããªäººåãã®ãããããããã ãããŸãã¯ãåé¢ããããšããã¯ããããã
ãããç¬¬äžæ©ã ã
<?php
function getAllFoos($db) {
return $db->query('SELECT * FROM table');
}
$results = getAllFoos($db);
foreach ($results as $row) {
echo "<li>".$row['field1']." - ".$row['field1']."</li>"; // BAD!!
}å°ãã¯ãã·ã«ãªã£ãããã®äºã€ãå¥ã ã®ãã¡ã€ã«ã«åããŠããŸãã°ããããã«åé¢ã§ããã ããã
次ã«ããã®ã¡ãœãããä¿æããã¯ã©ã¹ãçšæããããã¢ãã«ãã ã
ãããŠãã·ã³ãã«ãª .php ãã¡ã€ã«ãããã²ãšã€äœã£ãŠãããã«ç»é¢è¡šç€ºããžãã¯ãå
¥ãããããã¥ãŒãã ã
ããã§ãäœãšãªã MVC ã£ãœããªã£ããããã¯ãå€ãã® ãã¬ãŒã ã¯ãŒã¯ ã§äœ¿ãããŠãããOOPã®ã¢ãŒããã¯ãã£ã ã
foo.php
<?php
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8mb4', 'username', 'password');
// ã¢ãã«ãèªã¿èŸŒã
include 'models/FooModel.php';
// ã€ã³ã¹ã¿ã³ã¹ãäœã
$fooModel = new FooModel($db);
// Fooã®ãªã¹ããäœã
$fooList = $fooModel->getAllFoos();
// ãã¥ãŒã衚瀺ãã
include 'views/foo-list.php';models/FooModel.php
<?php
class FooModel
{
public function __construct(protected PDO $db)
{
}
public function getAllFoos() {
return $this->db->query('SELECT * FROM table');
}
}views/foo-list.php
<?php foreach ($fooList as $row): ?>
<li><?= $row['field1'] ?> - <?= $row['field1'] ?></li>
<?php endforeach ?>æ¬è³ªçã«ããã¯ãä»ã©ãã®ãã¬ãŒã ã¯ãŒã¯ããã£ãŠããããšãšåãã ããããæäœæ¥ã§ãã£ãŠã¿ãã æ¯åãããªããšãããå¿ èŠã¯ãªããããããªãããç»é¢è¡šç€ºãšããŒã¿ããŒã¹æäœãæ··åšããããããšã ãŠããããã¹ã ãããããªã£ããšãã«ãã£ãããªåé¡ãçºçããŠããŸãã
å€ãã®ãã¬ãŒã ã¯ãŒã¯ã¯ãããŒã¿ããŒã¹ã®æœè±¡åã¬ã€ã€ãŒãçšæããŠãããPDOãå©çšããŠãããã®ãããã°ãããã§ãªããã®ãããã ããããŒã¿ããŒã¹ã«ã¯ååšããããã©ãå¥ã®ããŒã¿ããŒã¹ã«ã¯ååšããªãæ©èœãªã©ããšãã¥ã¬ãŒãããããã«ã ã¯ãšãªãŒãPHPã®ã¡ãœããã§ã©ããããããããã®ã ã PDOã§ã¯ããŒã¿ããŒã¹ãžã®æ¥ç¶ã®æœè±¡åããããªããããã¬ãŒã ã¯ãŒã¯ã®æœè±¡åã¬ã€ã€ãŒã¯ããã以äžã®ããšãããŠãããã ãã¡ãããããªãã®ãªãŒããŒããããçºçããã ããã ã§ããMySQLã§ãPostgreSQLã§ãSQLiteã§ãåããããªã¢ããªã±ãŒã·ã§ã³ãæžããŠããã®ãªãã å€å°ã®ãªãŒããŒããããå²ãåŒããŠã§ãããã£ããããã³ãŒããæžããã»ããããããã ããã
以äžã®æœè±¡åã¬ã€ã€ãŒã¯ã PSR-0 ã PSR-4 ã§å®ããããæšæºåå空éã«åŸã£ãŠããã ãããã¯ã¢ããªã±ãŒã·ã§ã³ãåããã«å©çšã§ããã
ãã³ãã¬ãŒãã¯ãã³ã³ãããŒã©ãŒããã¡ã€ã³ããžãã¯ãããã¬ãŒã³ããŒã·ã§ã³ããžãã¯ããåãé¢ãããã®äŸ¿å©ãªææ®µã ã ãã³ãã¬âãã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã§äœ¿ãHTMLãå«ããããšãå€ããããã以å€ã®ãã©ãŒãããïŒXMLãªã©ïŒãå«ããããšãããã ãã³ãã¬ãŒãã®ããšãããã¥ãŒããšåŒã¶ããšãããããããã modelâviewâcontroller (MVC) ãã¿ãŒã³ã®ãäºçªç®ã®èŠçŽ ã®äžéš ã ã
ãã³ãã¬ãŒãã䜿ãäž»ãªã¡ãªããã¯ãç»é¢ã«è¡šç€ºããå 容ãã¢ããªã±ãŒã·ã§ã³ããåãé¢ããããšã ã ãã³ãã¬ãŒãã¯ããã©ãŒãããæžã¿ã®ã³ã³ãã³ãã衚瀺ãããšãã責åã ããè² ãã ããŒã¿ãæ€çŽ¢ããããããŒã¿ããŒã¹ã«ä¿åããããªã©ãšãã£ããéå€ãªã¿ã¹ã¯ã¯æ°ã«ããªãã ãã®ãããã§ããã£ãããããªãŒããã«ãªã³ãŒããæžããããã«ãªããããŒã ã§éçºããéãªã©ã«ã¯ããããç¹ã«æçšã ã éçºè ã¯ãµãŒããŒåŽã®ã³ãŒãïŒã³ã³ãããŒã©ãã¢ãã«ïŒããããŠãã¶ã€ããŒã¯ã¯ã©ã€ã¢ã³ãåŽã®ã³ãŒãïŒããŒã¯ã¢ããïŒ ãªã©ãšããäœæ¥åæ ããããããªãã
ãã³ãã¬ãŒãã«ã¯ããã¬ãŒã³ããŒã·ã§ã³ã®ã³ãŒãã®æ§é ãæ¹åãããšãã广ãããã ãã³ãã¬ãŒãã¯äžè¬çã«ãviewsããªã©ã®ãã©ã«ãã«ãŸãšããããŠãããããåå¥ã®ãã¡ã€ã«ã«ãªã£ãŠããããšãå€ãã ããããŠããã°ã³ãŒãã®åå©çšããããããªããå€§èŠæš¡ãªã³ãŒããããã¯ããå°ããã®åå©çšããããããŒãïŒããŒã·ã£ã«ãšåŒã°ããããšãããïŒã«åå²ã§ããããã ã ããšãã°ããµã€ãã®ããããããã¿ããã³ãã¬ãŒãã«ããŠããã°ãåããŒãžã®ãã³ãã¬ãŒãã«ãããã€ã³ã¯ã«ãŒãã§ããããã«ãªãã
å©çšããã©ã€ãã©ãªã«ãã£ãŠã¯ããã³ãã¬ãŒãã䜿ãããšã§ãããã»ãã¥ãªãã£ã確ä¿ã§ããããã«ããªãã ãŠãŒã¶ãŒãäœãã³ã³ãã³ããèªåçã«ãšã¹ã±ãŒãããŠããããããæ©èœãæã€ãããªãã³ãã¬ãŒãããããã«ãããã ããã«ããµã³ãããã¯ã¹æ©èœãæäŸããã©ã€ãã©ãªããããããã¯ããã¶ã€ããŒãããããããèš±å¯ããã倿°ãšé¢æ°ããå©çšã§ããªãããã«ããä»çµã¿ã ã
ãã¬ãŒã³ãªPHPã«ãããã³ãã¬ãŒããšã¯ãåã«PHPã®ã³ãŒãã䜿ã£ããã³ãã¬ãŒããšããæå³ã ã ããèªç¶ãªéžæè¢ã ãšãèšãããããããPHPèªäœããã³ãã¬ãŒãèšèªã ãã ããããã£ãŠåã«ãPHPã®ã³ãŒããHTMLãšãã«ãåã蟌ããããã£ãŠãã以äžã®æ·±ãæå³ã¯ãªããããã PHPã®éçºè ã«ãšã£ãŠã¯ãæ°ããæ§æãèŠããã«æžããšããã¡ãªãããããã ã©ããªé¢æ°ã䜿ããã®ããããã£ãŠãããããµã ãPHPãæžããŠãããšãã£ã¿ã®ã·ã³ã¿ãã¯ã¹ãã€ã©ã€ãã èªåè£å®æ©èœãããã®ãŸãŸäœ¿ããã ãã®äžããã¬ãŒã³ãªPHPã®ãã³ãã¬ãŒãã¯é«éã§ããããšãå€ããã³ã³ãã€ã«ãäžèŠã ããã ã
ããŸã©ãã®PHPãã¬ãŒã ã¯ãŒã¯ã¯ããããŠãäœããã®ä»çµã¿ã®ãã³ãã¬ãŒãã·ã¹ãã ãæã£ãŠããã ãã®å€ãã§ããã©ã«ãã«ãªã£ãŠããã®ãããã¬ãŒã³PHPã«ãããã³ãã¬ãŒãã ã ãã¬ãŒã ã¯ãŒã¯ä»¥å€ã§ã¯ãPlatesãAura.View ãšãã£ãã©ã€ãã©ãªããã¬ãŒã³PHPãã³ãã¬ãŒãã䜿ããããããŠããããç¶æ¿ãã¬ã€ã¢ãŠããæ¡åŒµãªã©ã®äŸ¿å©ãªãã³ãã¬ãŒãæ©èœãçšæããŠããããã ã
Plates ã©ã€ãã©ãªã䜿ã£ãã
<?php // user_profile.php ?>
<?php $this->insert('header', ['title' => 'User Profile']) ?>
<h1>User Profile</h1>
<p>Hello, <?=$this->escape($name)?></p>
<?php $this->insert('footer') ?>Plates ã©ã€ãã©ãªã䜿ã£ãã
<?php // template.php ?>
<html>
<head>
<title><?=$title?></title>
</head>
<body>
<main>
<?=$this->section('content')?>
</main>
</body>
</html><?php // user_profile.php ?>
<?php $this->layout('template', ['title' => 'User Profile']) ?>
<h1>User Profile</h1>
<p>Hello, <?=$this->escape($name)?></p>PHPã¯ãªããžã§ã¯ãæåèšèªãšããŠæçããŠããŠã¯ãããã®ã®ããã³ãã¬ãŒãèšèªãšããŠã¯ ããŸãã¡ ã ã ã³ã³ãã€ã«åœ¢åŒã®ãã³ãã¬ãŒããããšãã° Twig ã Brainy ã Smarty* ãããã®ç©ŽãåããŠãããããã³ãã¬ãŒãã«ç¹åãããæ°ããæ§æãçšæããŠããããã ã èªåãšã¹ã±ãŒãããç¶æ¿ãå¶åŸ¡æ§æãŸã§ãã³ã³ãã€ã«åœ¢åŒã®ãã³ãã¬ãŒãã¯ãããã«èªã¿æžããããããå®å¿ããŠäœ¿ããããéèŠããŠäœãããŠããã ããã«ãã³ã³ãã€ã«åœ¢åŒã®ãã³ãã¬ãŒãã¯ãå¥ã®èšèªã§ããã䜿ãããšãã§ãããMustache ããã®ããäŸã ã ãã³ãã¬ãŒããã³ã³ãã€ã«ããæéããããã®ã§ãå€å°ã¯ããã©ãŒãã³ã¹ã«åœ±é¿ããã ããããé©åã«ãã£ãã·ã¥ãããã°ããã®åœ±é¿ã¯åŸ®ã ãããã®ã ã
*Smartyã«ã¯èªåãšã¹ã±ãŒãæ©èœããããã©ãããã¯ããã©ã«ãã§ã¯ç¡å¹ã«ãªã£ãŠããã
Twig ã©ã€ãã©ãªã䜿ã£ãã
{% include 'header.html' with {'title': 'User Profile'} %}
<h1>User Profile</h1>
<p>Hello, {{ name }}</p>
{% include 'footer.html' %}Twig ã©ã€ãã©ãªã䜿ã£ãã
// template.html
<html>
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<main>
{% block content %}{% endblock %}
</main>
</body>
</html>// user_profile.html
{% extends "template.html" %}
{% block title %}User Profile{% endblock %}
{% block content %}
<h1>User Profile</h1>
<p>Hello, {{ name }}</p>
{% endblock %}äŸå€åŠçãéèŠããããã°ã©ãã³ã°èšèªã§ã¯ãäœãåé¡ãèµ·ãã£ããããã«äŸå€ãæããã ããã¯ããã§ããããšã§ã¯ããããPHPã¯ããã§ã¯ãªãããäŸå€åŠçã䜿ãããããã°ã©ãã³ã°èšèªã ã PHPã«ã¯äŸå€åŠçã®ä»çµã¿ãããããã³ã¢ã®äžã§ããªããžã§ã¯ããæ±ããšãã«ã¯äŸå€åŠçãè¡ãããšãå¢ããŠããã ã§ããPHPã¯åºæ¬çã«ããã£ãœã©èŽåœçãªãšã©ãŒãçºçããªãéãã¯äœãããããšåŠçãç¶è¡ããããšããã
ããšãã°ããããªã³ãŒããèããŠã¿ããã
$ php -a
php > echo $foo;
Notice: Undefined variable: foo in php shell code on line 1åçŽã«noticeã¬ãã«ã®ãšã©ãŒã«ãªãã ãã§ãPHPã¯ãã®ãŸãŸåŠçãç¶è¡ããã äŸå€åŠçãéèŠããäžçãããã£ãŠãã人ã«ãšã£ãŠã¯ãããã¯å°ããã¢ããšæããããããªããã ããšãã°Pythonãªããæªå®çŸ©ã®å€æ°ãåç §ããããšãããšãäŸå€ãçºçããã
$ python
>>> print foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'foo' is not definedå®éã®éãã¯ãããããããšã ã Pythonã¯ãäºçްãªããšã«ãŸã§ãã ããããšã§ãããã°ã©ããŒãäœèšãªå¿é ïŒãããââã ã£ããããã®å Žåã¯âŠããšèãããããšããžã±ãŒã¹ãèæ ®ããããªã©ïŒ ãããã«æžãããã«ããŠããã äžæ¹PHPã¯ãã©ããããããªããšã©ãŒãçºçããªããããã¯ãäžå¿ãšã©ãŒãå ±åããããã§åŠçãç¶è¡ããã
PHPã®ãšã©ãŒã¯ãäœæ®µéãã®æ·±å»åºŠã¬ãã«ã«å¥ããŠãããPHPã§ãã䜿ãããã¡ãã»ãŒãžã®åœ¢åŒã¯ã
ãšã©ãŒïŒerrorïŒãšæ³šæïŒnoticeïŒãããŠèŠåïŒwarningïŒã ã
ããããå¥ã
ã®æ·±å»åºŠã¬ãã«ãèšå®ãããŠããŠã E_ERRORãE_NOTICEããã㊠E_WARNING ã«ãªãã
ããšã©ãŒãã¯å®è¡æã®èŽåœçãªåé¡ã§ããµã€ãã¯ã³ãŒãã®æžãããããŸããããã§çºçããã
ããã¯ä¿®æ£ããªããã°ãããªãããšããã®ãããããçºçãããšPHPã®å®è¡ãããã§æ¢ãŸã£ãŠããŸãããã ã
ãæ³šæãã¯å©èšã¿ãããªãã®ã§ãåé¡ãèµ·ããå¯èœæ§ãããã¹ã¯ãªãããå®è¡ãããšãã«çºçããã
ã¹ã¯ãªããã®å®è¡ã¯æ¢ãŸããªãã
ãèŠåãã¯èŽåœçã§ã¯ãªãåé¡ã§ããããã¹ã¯ãªããã®å®è¡ã¯æ¢ãŸããªãã
ããã²ãšã€ãã³ã³ãã€ã«æã«çºçãã E_STRICT ãšãã圢åŒã®ã¡ãã»ãŒãžãããã
ããã¯ãçžäºéçšæ§ãå°æ¥ã®ããŒãžã§ã³ã®PHPãšã®äºææ§ãèãããšãã«ãã³ãŒããæžãæããã»ãããããšææ¡ããããã®ã¡ãã»ãŒãžã ã
ãšã©ãŒå ±åã®æåã¯ãPHPã®èšå®ã§å€æŽããããšãã§ãããPHPã®é¢æ°ã§å€æŽããããšãã§ããã
çµã¿èŸŒã¿ã®é¢æ° error_reporting() ã«ãšã©ãŒã¬ãã«å®æ°ãæž¡ãã°ããã®ã¹ã¯ãªããã®å®è¡äžã«
ã©ã®ã¬ãã«ã®ãšã©ãŒåŠçãããã®ããèšå®ã§ããã
ããšãã°ããšã©ãŒ(error)ãšãèŠå(warning)ã¯è¡šç€ºããããããã©ããå¥ã«æ³šæ(notice)ã¯èŠãããªããšããå Žåã¯ããããªãµãã«ããã°ããã
<?php
error_reporting(E_ERROR | E_WARNING);ç»é¢ã«è¡šç€ºãããããªãã(éçºæã«æå¹)ã ãã§ãªãããã°ã«åºåãããããªãã(éçšæã«æå¹)ãå¶åŸ¡ã§ããã 詳现㯠ãšã©ãŒã¬ããŒã ãåç §ã
ãããã§ã®ãšã©ãŒã¯ç¡èŠããããšããšPHPã«æç€ºããããšãã§ããããã®ãšãã«äœ¿ãã®ãã
ãšã©ãŒå¶åŸ¡æŒç®å @ ã ããã®æŒç®åãäœãã®åŒã®åã«æžããšã
ãã®åŒã§çºçãããããããšã©ãŒã¯é»ã£ãŠæã¿æ¶ãããã
<?php
echo @$foo['bar'];ããã¯ããã $foo['bar'] ãååšããã°ãã®å
容ãåºåããããä»®ã«å€æ° $foo
ãã㌠'bar' ãååšããªããŠããšã©ãŒã«ã¯ãªããªããåçŽã« null ãè¿ããŠäœã衚瀺ããªãã ãã ã
ãããšã©ãŒå¶åŸ¡æŒç®åããªãã£ããã PHP Notice: Undefined variable: foo ã ãšã
PHP Notice: Undefined index: bar ã®ãããªãšã©ãŒã«ãªãã
äžèŠãããããªæ©èœã ãšæãããããããªããã§ããããã䜿ããšãããŸãæãŸãããªã代åãæãããšã«ãªãã
ãŸããPHPã§ã¯ã @ ã€ãã®åŒã¯ @ ãªãã®åŒãããåŠçå¹çãèœã¡ãŠããŸãã
ãæ©ãŸã£ãæé©åã¯è«žæªã®æ ¹æºã ããšã¯ãããã®ã®ã
ããããã©ãŒãã³ã¹ãéèŠããã¢ããªã±ãŒã·ã§ã³ãã©ã€ãã©ãªãäœã£ãŠããã®ãªãã
ãšã©ãŒå¶åŸ¡æŒç®åãããã©ãŒãã³ã¹ã«åãŒãæªåœ±é¿ãç¥ã£ãŠããã¹ãã ã
次ã«ããšã©ãŒå¶åŸ¡æŒç®åã䜿ããšãçºçãããšã©ãŒã å®å šã« é èœãããŠããŸãã ç»é¢ã«ã衚瀺ãããªããã°ããã°ã«æžãåºãããããšããªãã ãŸããéçšäžã®PHPã·ã¹ãã ã®ãšã©ãŒå¶åŸ¡æŒç®åãç¡å¹ã«ããä»çµã¿ã¯ãªãã ä»èŠãŠãããšã©ãŒãä»®ã«äºçްãªãã®ã ãšããããã ãšããŠãããã以å€ã«ç¡èŠã§ããªããšã©ãŒãçºçãããããããªãã ãããªãšã©ãŒããåæ§ã«é èœãããŠããŸãã
ãšã©ãŒå¶åŸ¡æŒç®åã䜿ããã«ããéããããªãããã®æ¹åã§èããã¹ãã ã ããšãã°ãã£ãã®ã³ãŒããªãããããªãµãã«æžãçŽãã°ããã
<?php
// Null Coalescing Operator
echo $foo['bar'] ?? '';ãšã©ãŒã®æå¶ã䜿ãã®ãçã«ããªã£ãŠããå Žé¢ãšããŠèããããã®ã¯ã
ããšãã° fopen() ã䜿ã£ãŠããŠãã¡ã€ã«ã®èªã¿èŸŒã¿ã«å€±æããå Žåã ã
ãã¡ããå®éã«èªã¿èŸŒãåã«ãã¡ã€ã«ããããã©ããããã§ãã¯ããã ãããã
ãã®ãã§ãã¯ãçµãã£ãŠããå®éã« fopen() ã§èªã¿èŸŒããŸã§ã®éã«
ãã¡ã€ã«ãåé€ããããããããªãïŒãŸãããããªãã ãããã©ãå¯èœæ§ã¯ãŒãã§ã¯ãªãïŒã
ãããªå Žåã fopen() ã false ãè¿ãã ãã㊠ãšã©ãŒãçºçããã
ã»ããšã¯PHPåŽã§äœãšãããŠããããããšããã ããã©ãçŸç¶ã§ã¯ãšã©ãŒãæå¶ãããããããæããªãã
ãã£ãã皌åäžã®PHPã·ã¹ãã ã§ã¯ãšã©ãŒå¶åŸ¡æŒç®åãç¡å¹åã§ããªããšãã£ãããã©ã
å®ã¯ã Xdebug ã®èšå® xdebug.scream ã䜿ãã°ããšã©ãŒå¶åŸ¡æŒç®åãç¡å¹åã§ããã
php.ini ã«ããããªãµãã«æžãã°ããã
xdebug.scream = Onå®è¡æã«èšå®ãããªãã ini_set 颿°ã䜿ãã°ããã
<?php
ini_set('xdebug.scream', '1')ãã®æ©èœã圹ç«ã€ã®ã¯ãã³ãŒãã®ãããã°äžãªã©ããšã©ãŒããæ å ±ãèªã¿åããããšãã ã screamã䜿ããšãã«ã¯æ°ãã€ããŠããããŸã§ãäžæçãªãããã°çšã®ããŒã«ãšããŠäœ¿ãããã«ãããã ãšã©ãŒå¶åŸ¡æŒç®åãç¡å¹ã«ãããŸãŸã§ã¯æ£åžžã«åããªããšããã©ã€ãã©ãªã£ãŠãçµæ§å€ããã
PHPã¯ãäŸå€ã倧奜ããªäººãã¡ã«ã察å¿ããããã°ã©ãã³ã°èšèªã ã
ã»ãã®æ°è¡ã®ã³ãŒããè¶³ãã ãã§ãäŸå€ã«å¯Ÿå¿ã§ããã
åºæ¬çã«ããšã©ãŒãçºçãããšãã«ã¯ã ErrorException ã¯ã©ã¹ã䜿ã£ãŠãäŸå€ããæããã°ããã
ãã®ã¯ã©ã¹ã¯ã Exception ã¯ã©ã¹ãç¶æ¿ãããã®ã ã
ããã¯ãSymfonyãLaravelã¿ãããªä»ã©ãã®ãã¬ãŒã ã¯ãŒã¯ã§ããã䜿ãããŠããæ¹æ³ã ã ãããã®ãã¬ãŒã ã¯ãŒã¯ã®ãããã°ã¢ãŒã (éçºã¢ãŒã) ã¯ã ã¹ã¿ãã¯ãã¬ãŒã¹ ãããæãã«è¡šç€ºããŠãããã
ãšã©ãŒãäŸå€ã®åŠçã衚瀺ãããŸãå ·åã«ããŠãããããã±ãŒãžãããã ããšãã° Whoops! ããã®ã²ãšã€ã ã ããã¯Laravelãããã©ã«ãã§ã€ã³ã¹ããŒã«ãããšã€ããŠãããã®ã ãã©ãã»ãã®ãã¬ãŒã ã¯ãŒã¯ã§ã䜿ããã
éçºäžã¯ããšã©ãŒãäŸå€ãšããŠæããããã«ããŠãããšããã®åŠçããããããªãã éçºäžã«ããäŸå€ãçºçãããããããcatchæã§ã©ããããŠããã®ç¶æ³ã«å¯Ÿå¿ããåŠçãæžãããšãã§ããã äŸå€ãã²ãšã€ãã£ãããããã³ã«ãã¢ããªã±ãŒã·ã§ã³ã¯ã»ãã®å°ããã€é äžã«ãªã£ãŠããã
ãã£ãšè©³ããããšãç¥ããããããã㯠ErrorException ã¯ã©ã¹ã䜿ã£ããšã©ãŒåŠçã«ã€ããŠèª¿ã¹ãããšãã人ã¯ã
ErrorException ã¯ã©ã¹ ã®ããã¥ã¡ã³ããèªããã
æè¿ã¯ããã®ããã°ã©ãã³ã°èšèªã«ã¯ããããŠãäŸå€åŠçã®ä»çµã¿ããããã§ã PHP ã®äººã¯èŠèœãšããã¡ã ã ããšãã° Ruby ãªããã¯äŸå€åŠçã䜿ããŸãã£ãŠããã HTTP ãªã¯ãšã¹ãã«å€±æãããšããããŒã¿ããŒã¹ãžã®ã¯ãšãªã倱æãããšãããç»åãã¡ã€ã«ãèŠã€ãããªãã£ããšãã§ãããã Ruby ã®ããã°ã©ã (ãããã¯ãã®äžã§äœ¿ã£ãŠãã gem) ã¯äŸå€ãæããã ãªã®ã§ãç»é¢ãèŠãã°ããã«ããããäœãééãããã ãªããšãããã
PHP ã¯ãã®ããããæ¥µããŠç·©ããŠãããšãã° file_get_contents() ã倱æããŠãåã«
FALSE ãè¿ããŠèŠåãåºãã ãã ãå€ããã¬ãŒã ã¯ãŒã¯ã®å€ãããããªæãã ã
ããšãã° CodeIgniter ã®å Žåã¯ãåã« false ãè¿ããŠãã°ãã¡ã€ã«ã«ã¡ãã»ãŒãžãæžãåºãã ãã
åå ãç¥ããããã° $this->upload->get_error() ã¿ãããªã¡ãœãããå®è¡ããããšã«ãªãã
äœãåé¡ããšãããšããŸããšã©ãŒãçºçããã®ãã©ãããèªåã§èª¿ã¹ãªããšãããªãããšã
ãããŠæ¬¡ã«ããšã©ãŒæ
å ±ãååŸããæ¹æ³ãããã¥ã¡ã³ãã§èª¿ã¹ãªããšãããªãããšã
ãã£ãšã¯ã£ãããããããã«ããŠããããããã®ã«ã
å¥ã®åé¡ããããäœãã®ã¯ã©ã¹ããšã©ãŒãç»é¢ã«æãã£ã±ãªãã«ããŠãã®ãŸãŸçµãããããªå Žåã ã ãããªããšãããã°ããšã©ãŒããã£ããšãã«ããã°ã©ã äžã§åçã«å¯Ÿå¿ããããšãã§ããªããªã£ãŠããŸãã ãããªå Žåã¯ããšã©ãŒã§ã¯ãªãäŸå€ãçºçãããªããšãããªãã äŸå€ã«ããŠããã°éçºè ããšã©ãŒã«æ°ã¥ããããããã°ã©ã ã®äžã§å¯Ÿå¿ã§ããããã«ãªãã ããšãã°ãããªæãã ã
<?php
$email = new Fuel\Email;
$email->subject('ã¿ã€ãã«');
$email->body('ãããããããïŒ');
$email->to('guy@example.com', '誰ããã');
try
{
$email->send();
}
catch(Fuel\Email\ValidationFailedException $e)
{
// æ€èšŒã«å€±æãã
}
catch(Fuel\Email\SendingFailedException $e)
{
// ãã©ã€ããã¡ãŒã«ãéããªãã£ã
}
finally
{
// äŸå€ãçºçããŠãããªããŠããããã¯å¿
ãå®è¡ããã
}æ±çšç㪠Exception ã¯ã©ã¹ã«ã¯ãéçºè
ããããã°ããããã®ã³ã³ããã¹ãæ
å ±ãã»ãšãã©å«ãŸããŠããªãã
ãããæ¹åããã«ã¯ãç¹ååã® Exception ãäœãã°ãããã€ãŸããException ã¯ã©ã¹ã®ãµãã¯ã©ã¹ãäœãã£ãŠããšã ã
<?php
class ValidationException extends Exception {}ãããªãµãã«ããã°ãcatch ãããã¯ãè€æ°çšæããŠããããã®äŸå€ã§å¥ã®åŠçãã§ããããã«ãªãã ãã®çµæãèªäœã®äŸå€ã¯ã©ã¹ã 倧éã« ã§ãããã£ãŠããŸããããããªããã SPL æ¡åŒµã¢ãžã¥ãŒã« ãçšæããäŸå€ã¯ã©ã¹ã䜿ãã°å°ãã¯ãŸãã«ãªãã ããã
ããšãã°ãããžãã¯ã¡ãœãã __call() ã䜿ã£ãŠãããšãã«ãç¡å¹ãªã¡ãœãããèŠæ±ããããšãããã
æšæºã® Exception ã¯ã©ã¹ã䜿ãã®ã¯ææ§ããããããã®ããã ãã«å°çšã®äŸå€ã¯ã©ã¹ãäœãã®ãäœã ãã
ãšããå Žåã«ã¯åã« throw new BadMethodCallException; ãšããã°ããã
ä»ãŸã§èŠãPHPã®ã»ãã¥ãªãã£ã«é¢ããè³æã®äžã§ãã¡ã°ãã ã£ãã®ã¯ãParagon Initiative ã«ãã The 2018 Guide to Building Secure PHP Softwareã ã
PHPéçºè ã¯å šå¡ãWebã¢ããªã±ãŒã·ã§ã³ã»ãã¥ãªãã£ã®åºæ¬ ãåŠã¶ã¹ãã ãå 容ãšããŠã¯ã ããããããªæãã«ãªãã down into a handful of broad topics:
äžã®äžã«ã¯æªã人ãã¡ãããŠãããªãã®æžãããŠã§ãã¢ããªã±ãŒã·ã§ã³ããã£ãšçãããŠããã å¿ èŠãªå¯ŸçãããŠããŠã§ãã¢ããªã±ãŒã·ã§ã³ã®ã»ãã¥ãªãã£ãåºããŠããããšã倧åã ã ãããããããšã«ãThe Open Web Application Security Project (OWASP) ã®äººãã¡ããæ¢ç¥ã®ã»ãã¥ãªãã£åé¡ãšãã®å¯ŸçããŸãšããŠãããŠããã ã»ãã¥ãªãã£ãæ°ã«ãªãéçºè ã¯å¿ èªã ã Padraic BradyãæžããSurvive The Deep End: PHP Security ãã ãŠã§ãã¢ããªã±ãŒã·ã§ã³ã»ãã¥ãªãã£ã«é¢ããŠPHPåãã«æžãããããããã¥ã¡ã³ãã ã
誰ãããã€ãã¯ããã°ã€ã³æ©èœãæã€ PHP ã¢ããªã±ãŒã·ã§ã³ãæžãããšã«ãªãã ãŠãŒã¶ãŒåãšãã¹ã¯ãŒã (ã®ããã·ã¥) ãããŒã¿ããŒã¹ã«ä¿åããŠã ãŠãŒã¶ãŒã®ãã°ã€ã³æã«ããã䜿ã£ãŠèªèšŒãããšãããã€ã ã
ããŒã¿ããŒã¹ã«ãã¹ã¯ãŒããä¿åãããšãã¯ãé©åã« ããã·ã¥ ããããšã倧åã ã ããã·ã¥ãšæå·å㯠ãŸã£ããéããã® ãªã®ã«ãæ··åãããããšãå€ãã
ãã¹ã¯ãŒãã®ããã·ã¥ã¯äžå¯éãªæäœã§ããŠãŒã¶ãŒã®ãã¹ã¯ãŒãã«å¯ŸããŠäžæ¹éè¡ã§è¡ãã ã§ããããçµæã¯åºå®é·ã®æååã§ãå ã«ã¯æ»ããªãã ã€ãŸãããã®ããã·ã¥ãå¥ã®ããã·ã¥ãšæ¯èŒããã°å ã®æååã©ãããäžèŽãããã©ããã¯å€æã§ãããã å ã®æååãäœã ã£ããã¯ããããªãã£ãŠããšã ã ãã¹ã¯ãŒããããã·ã¥ããã«ããŒã¿ããŒã¹ã«ä¿åããŠãããšã äžäžç¬¬äžè ã«äžæ£ã¢ã¯ã»ã¹ãããå Žåã«ããã¹ãŠã®ãŠãŒã¶ãŒã¢ã«ãŠã³ããä¹ã£åãããŠããŸãã
ããã·ã¥ãšéã£ãŠæå·åã¯å ã«æ»ãã (éµããæå ã«ããã°ã)ã æå·åãã®ãã®ã¯äœ¿ãå Žé¢ãéžã¹ã°äŸ¿å©ãªãã®ã ãã©ãããšãã¹ã¯ãŒãã®ä¿åã«é¢ããŠã¯ããŸãææ®µã§ã¯ãªãã
ãã¹ã¯ãŒãã«ã¯åå¥ã« ãœã«ã ãå¿ èŠã ãã©ã³ãã ãªæååããã¹ã¯ãŒãã«ä»ããŠããããã·ã¥ããã£ãŠããšã ããããŠããã°ãèŸæžæ»æããå®ããããã¬ã€ã³ããŒããŒãã«(ãããã¡ãªãã¹ã¯ãŒããšãã®ããã·ã¥ããŸãšãã倿ããŒãã«)ãã«ããæ»æãé²ããã
ããã·ã¥ãšãœã«ãã¯æ¬ ãããªããã ã£ãŠããããŠãã®ãŠãŒã¶ãŒã¯ããããªãµãŒãã¹ã§ãã¹ã¯ãŒãã䜿ãåããã®ã ãã ãã¹ã¯ãŒãèªäœã決ããŠåŒ·åãªãã®ã ãšã¯èšããªãããã
ããšãé床ã売ãã®æ±çšããã·ã¥é¢æ° (SHA256ãšã) ãããªã㊠ãã¹ã¯ãŒãã®ããã·ã¥ ã«ç¹åããã¢ã«ãŽãªãºã ã䜿ãããšã 2018幎6ææç¹ã§ãã¹ã¯ãŒãã®ããã·ã¥ã«äœ¿ã£ãŠãããŸããªãã¢ã«ãŽãªãºã ã¯ãããªæãã
ãããããããšã«ãæè¿ã® PHP ãªããã®ãããã䜿ããããã
password_hashã«ãããã¹ã¯ãŒãã®ããã·ã¥
PHP 5.5ããã¯ãæ°ãã«password_hash()颿°ã䜿ããããã«ãªã£ãã
çŸæç¹ã§ã¯ããã®é¢æ°ã¯BCryptã䜿ã£ãŠãããããã¯ãçŸåšã®PHPããµããŒãããŠããã¢ã«ãŽãªãºã ã®äžã§ã¯æåŒ·ã®ãã®ã ã
å¿
èŠã«å¿ããŠãå°æ¥ã¯ãã£ãšåŒ·åãªã¢ã«ãŽãªãºã ããµããŒãããããã«æŽæ°ãããã ããã
ãã®é¢æ°ãPHP 5.5ããåã®ããŒãžã§ã³ã§ã䜿ããããã«ãããããpassword_compatã©ã€ãã©ãªãäœãããã
ãã®ã©ã€ãã©ãªã¯PHP 5.3.7以éã§äœ¿ããã
ãã®äŸã§ã¯ãæååãããã·ã¥ããåŸã§ãã®ããã·ã¥ãæ°ããªæååãšæ¯èŒããŠããã äºã€ã®æååã¯éã£ãŠãã(âsecret-passwordâãšâbad-passwordâ)ã®ã§ããã®ãã°ã€ã³ã¯å€±æããã
<?php
require 'password.php';
$passwordHash = password_hash('secret-password', PASSWORD_DEFAULT);
if (password_verify('bad-password', $passwordHash)) {
// ãã¹ã¯ãŒããäžèŽãã
} else {
// ãã¹ã¯ãŒããäžèŽããªãã£ã
}password_hash() ã¯ããã¹ã¯ãŒãã®ãœã«ããããªãã«ä»£ãã£ãŠç®¡çããŠãããããœã«ãã®æ
å ±ã¯ãã¢ã«ãŽãªãºã ã®æ
å ±ãš âã³ã¹ãâ ãšäžç·ã«ãããã·ã¥ã®äžéšãšããŠä¿åããããpassword_verify() ã¯ãã®æ
å ±ãå±éããŠãã¹ã¯ãŒãããã§ãã¯ããæ¹æ³ã決ããããã£ãŠããœã«ããããŒã¿ããŒã¹ã«ä¿åããå¿
èŠã¯ãªãã
PHP ã®ã³ãŒãã«å€éšããæž¡ãããå
¥åã¯ã絶察ã«ä¿¡çšããŠã¯ãããªãã
å€éšããã®å
¥åã¯ãåžžã«æ€èšŒããŠãã䜿ãããã«ãããã
filter_var() 颿°ã filter_input() 颿°ã§ãå
¥åã®æ€èšŒãæžåŒã®å€å® (ã¡ãŒã«ã¢ãã¬ã¹ãªã©)
ãã§ããã
å€éšããã®å
¥åã«ã¯ãããããªçš®é¡ãããããã©ãŒã ããæž¡ããã $_GET ã $_POST ãããã°ã
ã¹ãŒããŒã°ããŒãã« $_SERVER ã«å«ãŸãããã®ãããããããŠ
fopen('php://input', 'r') ã§ãã£ãŠãã HTTP ãªã¯ãšã¹ãã®ããã£ãããã ã
å€éšããã®å
¥åãšãã£ãŠãããŠãŒã¶ãŒããã©ãŒã ã§å
¥åãããã®ã°ãããšã¯éããªãããšã«æ³šæã
ã¢ããããŒããããããŠã³ããŒãããããããã¡ã€ã«ãã»ãã·ã§ã³ã®ããŒã¿ã
ã¯ãããŒã®ããŒã¿ããµãŒãããŒãã£ã®ãŠã§ããµãŒãã¹ããã®ããŒã¿ã
ãããã¯ã¿ããªå€éšããã®å
¥åãšãªãã
å€éšããã®ããŒã¿ããã£ããä¿åããŠãäœããšçµã¿åãããŠåŸã§äœ¿ããšãããã ããã§ãããã®ããŒã¿ãå€éšããã®å ¥åã§ãããšããäºå®ã¯å€ãããªãã ãã®ããŒã¿ãåŠçãããåºåãããäœããšã€ãªãããã³ãŒãã«çµã¿èŸŒãã ããããšãã«ã¯ ãé©åã«ãã£ã«ã¿ãªã³ã°ã§ããŠãïŒããä¿¡é Œã§ããïŒããšç¢ºèªãããã
ããŒã¿ã®ãã£ã«ã¿ãªã³ã°æ¹æ³ã¯ããã®å©çšç®çã«ãã£ãŠç°ãªãã
ããšãã°ãå€éšã®å
¥åãäœãåŠçããã« HTML ããŒãžã«åºåãããšã
ããªãã®ãµã€ãäžã§ä»»æã® JavaScript ãå®è¡ã§ããŠããŸãããšã«ãªãïŒ
ããããããããã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã° (XSS) ã§ããã
ãšãŠãå±éºãªæ»æã ããããªãšãã« XSS ãåé¿ããæ¹æ³ã®ã²ãšã€ã¯ã
strip_tags() ã§å
¥åãããã¹ãŠã® HTML ã¿ã°ãåãé€ããã
ããã㯠htmlentities() ã htmlspecialchars() ã§ãšã¹ã±ãŒãã㊠HTML ãšã³ãã£ãã£ã«å€æããããšã ã
å¥ã®äŸãšããŠãå€éšã®å
¥åãã³ãã³ãã©ã€ã³ã®ãªãã·ã§ã³ãšããŠæž¡ãããšãèãããã
ããã£ãŠéåžžã«å±éºãªããšã ãããµã€ãã¯ããŸãããã¹ãã§ã¯ãªãããšã ã
ã§ãããããããªããçµã¿èŸŒã¿ã®é¢æ° escapeshellarg()
ã䜿ãã°ã³ãã³ãã®åŒæ°ãå®è¡ãããŠããŸãããšãé²ããã
æåŸã®äŸã¯ãå€éšã®å ¥åã«åºã¥ããŠãã¡ã€ã«ã·ã¹ãã äžã®ãã¡ã€ã«ãèªã¿èŸŒããšãããã®ã ã ãã®ãšãã¯ããã¡ã€ã«åã®ãããã«ãã¡ã€ã«ãã¹ãæž¡ãããŠããŸããšããæ»æãèããããã å€éšã®å ¥åããâ/âãâ../âãnull ãã€ããªã©ãåãé€ããŠã é ããã¡ã€ã«ãå ¬éãã¹ãã§ãªãå Žæã®ãã¡ã€ã«ãèªã¿èŸŒãŸãªãããã«ããå¿ èŠãããã
ãµãã¿ã€ãºãšã¯ãå€éšã®å ¥åããå±éºãªæåãåãé€ã (ãããã¯ãšã¹ã±ãŒããã) ããšã ã
ããšãã°ãå€éšã®å ¥åã HTML ã«å«ããã SQL ã¯ãšãªã«çµã¿èŸŒãã ãããåã«ã ãµãã¿ã€ãºãå¿ èŠãšãªããPDO ã§ãã€ã³ã倿°ã䜿ãå Žåã¯ã PDO ãå ¥åããµãã¿ã€ãºããã
å€éšã®å ¥åã HTML ãšããŠçµã¿èŸŒããšãã«ãããã€ãã®å®å šãª HTML ã¿ã°ã¯ãã®ãŸãŸäœ¿ãããããšããå ŽåãããããããªèŠæ±ãå®çŸããã®ã¯éåžžã«é£ããã®ã§ã ãããŠãã®å Žå㯠Markdown ã BBCode ãªã©ã®ãã©ãŒããããä»£æ¿ææ®µãšããŠäœ¿ãã®ã ãã ã©ãããŠããšããå Žå㯠HTML Purifier ã®ãããªãã¯ã€ããªã¹ãã©ã€ãã©ãªã䜿ããã
ãµãã¿ã€ãºãã£ã«ã¿ãŒ
ãŠãŒã¶ãŒããã®å
¥åãªã©ãä¿¡é Œã§ããªããšããããæž¡ãããããŒã¿ã unserialize() ããã®ã¯å±éºã ã
æªæã®ãããŠãŒã¶ãŒãéã蟌ãã ãªããžã§ã¯ãïŒãŠãŒã¶ãŒå®çŸ©ã®ããããã£ã€ãã®ãã®ïŒã®ã€ã³ã¹ã¿ã³ã¹ãçæã§ããŠããŸãã
ããšããã®ãªããžã§ã¯ããäžå䜿ããªããŠã ãã®ãã¹ãã©ã¯ã¿ã¯å®è¡ãããŠããŸãã
ãªã®ã§ãä¿¡é Œã§ããªãããŒã¿ã®ã¢ã³ã·ãªã¢ã©ã€ãºã¯é¿ããã¹ãã ã
ã·ãªã¢ã«åããããŒã¿ããŠãŒã¶ãŒã«æž¡ãå¿
èŠãããå Žåã¯ã(json_decode ã json_encode çµç±ã§) JSON ã®ãããªå®å
šã§æšæºçãªããŒã¿äº€æãã©ãŒãããã䜿ãããã«ãããã
ããªããŒã·ã§ã³ãšã¯ãå€éšã®å ¥åãæåŸ éãã§ãããã©ããã確ãããããšã ããšãã°ãŠãŒã¶ãŒç»é²ã®åŠçã§ã¯ã ã¡ãŒã«ã¢ãã¬ã¹ãé»è©±çªå·ããããã¯å¹Žéœ¢ãªã©ãæ€èšŒããããšã«ãªãã ããã
èªäœã®ã¢ããªã±ãŒã·ã§ã³ã§èšå®ãã¡ã€ã«ã䜿ããšãã«ã¯ããããã®æéã«åŸãã®ããå§ãã ã
.phpã«ããã
ããããã°ãä»®ã«ãã®ãã¡ã€ã«ãžçŽæ¥ã¢ã¯ã»ã¹ããããšããŠããäžèº«ããã®ãŸãŸèŠããŠããŸãããšã¯ãªããæ³šæ:
PHP 5.4.0 ãã㯠register_globals
ãšããèšå®é
ç®ããªããªã£ãã®ã§ããã®èšå®ã¯äœ¿ããªãã
ãã®ããŒãžã¯åã«ã倧æã®ã¢ããªã±ãŒã·ã§ã³ãã¢ããã°ã¬ãŒãããŠãã人ãã¡åãã®èŠåãšããŠçšæãããã®ã§ãããªãã
register_globalsãæå¹ã«ãããšã$_POSTã$_GETãããŠ$_REQUEST
ãªã©ã®å
容ã«ã¢ããªã±ãŒã·ã§ã³ã®ã°ããŒãã«ã¹ã³ãŒãã§ã¢ã¯ã»ã¹ã§ããããã«ãªãã
ããã䜿ããšã»ãã¥ãªãã£ã®åé¡ãçºçãããããªãã
ãšããã®ãããã®ããŒã¿ãã©ããããããã®ãªã®ããã¢ããªã±ãŒã·ã§ã³åŽã§å€æã§ããªããªãããã ã
ããšãã° $_GET['foo'] ã®å
容㫠$foo ã§ã¢ã¯ã»ã¹ã§ããããšã«ãªãã®ã ãã
ããã¯ãå®£èšæžã¿ã®å€æ°ã®äžèº«ãèªåçã«äžæžãããŠããŸãããšã«ã€ãªããã
PHP 5.4.0 ããåã®ããŒãžã§ã³ã䜿ã£ãŠããå Žåã¯ã
確å®ã« register_globals ã off ã«ããŠãããã
ãšã©ãŒãèšé²ããŠãããšãã¢ããªã±ãŒã·ã§ã³ã«äœãåé¡ããã£ããšãã«ãã®åå ãèŠã€ãããããªãã ããããã®äžæ¹ã§ãã¢ããªã±ãŒã·ã§ã³ã®æ§é ã«é¢ããæ å ±ãå€éšã«å ¬éããŠããŸãããšã«ããªãã ãšã©ãŒã¡ãã»ãŒãžãåºãããšã§èµ·ããåé¡ããã¢ããªã±ãŒã·ã§ã³ãå®ãã«ã¯ã éçºç°å¢ãšæ¬çªç°å¢ã§ãµãŒããŒã®èšå®ãåãæ¿ããå¿ èŠãããã
éçº ç°å¢ã§ãèµ·ãããããšã©ãŒããã¹ãŠè¡šç€ºãããšãã«ã¯ãphp.iniã§æ¬¡ã®ããã«èšå®ããã
display_errors = On
display_startup_errors = On
error_reporting = -1
log_errors = Onå€ã«
-1ãæå®ãããšãä»®ã«å°æ¥ã®ããŒãžã§ã³ã®PHPã§æ°ããã¬ãã«ãšå®æ°ã远å ããããšããŠããã¹ãŠã®ãšã©ãŒã衚瀺ããããã«ãªããŸããE_ALL 宿°ããPHP 5.4以éãããšåãæåã«ãªããŸãã - php.net
E_STRICTãšã©ãŒã¬ãã«å®æ°ã¯5.3.0ã§å°å
¥ããããã®ã§ãåœæã¯
E_ALLã«ã¯å«ãŸããŠããªãã£ããã§ã5.4.0ããã¯E_ALLã«å«ãŸããããã«ãªã£ãã
ã ããã©ããªãã ã£ãŠïŒ
ãããããšã©ãŒã衚瀺ãããããšãã«ã¯ã5.3ã®å Žåã¯
-1ãããã¯E_ALL | E_STRICTã䜿ããªããšãããªãã£ãŠããšã ã
PHPã®ããŒãžã§ã³å¥ã®ããã¹ãŠã®ãšã©ãŒã衚瀺ãããããã®èšå®
-1 or E_ALL-1 or E_ALL | E_STRICT-1 or E_ALLæ¬çª ç°å¢ã§ãšã©ãŒã®æ
å ±ãèŠããªãããã«ããã«ã¯ãphp.iniã§æ¬¡ã®ããã«èšå®ããã
display_errors = Off
display_startup_errors = Off
error_reporting = E_ALL
log_errors = Onãã®æ¬çªç°å¢çšã®èšå®ãããŠãããŠã§ããµãŒããŒã®ãšã©ãŒãã°ã«ã¯ãšã©ãŒã®å 容ããã¡ããšæ®ãã ãããããŠãŒã¶ãŒã«ã¯ãšã©ãŒãèŠããªããªãããããã®èšå®é ç®ã«ã€ããŠãã£ãšè©³ããç¥ããããã°ã PHP ã®ããã¥ã¢ã«ãèªããã
PHPã®ã³ãŒããæžããšãã«ã¯ãèªååããããã¹ããæžãã®ãããç¿æ £ã ãšãããŠããã ããããã°ãé äžãªã¢ããªã±ãŒã·ã§ã³ãäœããããã«ãªããèªåãã¹ããæŽ»çšããã°ã äœãã倿Žãããæ©èœã远å ããããããšãã«ãã¢ããªã±ãŒã·ã§ã³ããã¡ããšåãããšã確èªã§ããã æ¬ ãããªãããŒã«ã ã
PHP ã§äœ¿ãããã¹ãçšããŒã« (ãããã¯ãã¬ãŒã ã¯ãŒã¯) ã«ã¯ããã€ãã®ãã®ãããã ããããç°ãªãææ³ã䜿ã£ãŠãããããç®æããšããã¯åãã æäœæ¥ã§ã®ãã¹ãããªããããããŠææ°ã®å€æŽã§æ¢åã®æ©èœãå£ããŠããªããã©ããã確ãããããã ãã« å€§èŠæš¡ãªå質ä¿èšŒããŒã ã䜿ããªããŠããšããªããããšããã®ãç®æšã ã
Wikipedia ã«ãããšã
Test-driven development (TDD) is a software development process that relies on the repetition of a very short development cycle: first the developer writes a failing automated test case that defines a desired improvement or new function, then produces code to pass that test and finally refactors the new code to acceptable standards. Kent Beck, who is credited with having developed or ârediscoveredâ the technique, stated in 2003 that TDD encourages simple designs and inspires confidence.
ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãã«ã¯ãããã€ãã®çš®é¡ãããã
ãŠããããã¹ããšã¯ããã°ã©ãã³ã°ã®ææ³ã®ã²ãšã€ã ã 颿°ãã¯ã©ã¹ãã¡ãœãããæåŸ éãã«åããŠããããšãéçºäžã«åžžã«ç¢ºãããã ããŸããŸãªé¢æ°ãã¡ãœããã®å ¥åºåã®å€ããã§ãã¯ããã°ã ãã®å éšããžãã¯ãæ£ããåããŠããããšã確èªã§ããã äŸåæ§æ³šå ¥ã®ä»çµã¿ãå©çšããŠã¯ã©ã¹ã®ã¢ãã¯ãã¹ã¿ãã䜿ãã°ã äŸåã©ã€ãã©ãªãæ£ãã䜿ãããŠããããšã確ãããããã
ã¯ã©ã¹ã颿°ãäœããšãã«ããã®æ¯ãèãã確ãããããã®ãŠããããã¹ããåæã«äœãã
æãåºæ¬çãªã¬ãã«ã ãšãééã£ãåŒæ°ãæž¡ããå Žåã«ãšã©ãŒã«ãªãããšãã
æ£ããåŒæ°ãæž¡ãããšãã«æ£åžžã«åãããšãªã©ã確èªããªããšãããªãã
ããããŠããã°ãåŸã«ã¯ã©ã¹ã颿°ã«æãå ãããšãã«ã
ä»ãŸã§ã®æ©èœãæåŸ
éãã«åããã©ããã確ãããããããã«ãªãã
test.php ã§ var_dump() ãšãããããæ¹ããããã©ã
ãŸãšããªã¢ããªã±ãŒã·ã§ã³ãäœãã€ãããªãããã¯ããåŸãªãã
ãã以å€ã«ããŠããããã¹ãã®äœ¿ãéã¯ããããªãŒãã³ãœãŒã¹ã«è²¢ç®ããææ®µãšããŠäœ¿ããã®ã ã ããŸãæ©èœããŠããªãããšã瀺ãããã«ãã¹ããæžãããããŠåãããã«ä¿®æ£ããã æåŸã«ãã¹ããéãããšã確èªããããããªããããéãã°ããã£ãšåãå ¥ããŠãããããããªãã ããã ããäœããããžã§ã¯ããéå¶ããŠã㊠pull request ãåãä»ããŠããã®ãªãã ããããã«ã¯ãã¹ããã€ããããšããšããæ¡ä»¶ãã€ããŠãããšããã ããã
PHPUnitã¯ãPHPã¢ããªã±ãŒã·ã§ã³ã§ãŠããããã¹ããæžãããã® ããã¡ã¯ãã¹ã¿ã³ããŒãã®ãã¬ãŒã ã¯ãŒã¯ã ãããããã以å€ã«ãéžæè¢ãããã
Wikipedia ã«ãããšã
Integration testing (sometimes called Integration and Testing, abbreviated âI&Tâ) is the phase in software testing in which individual software modules are combined and tested as a group. It occurs after unit testing and before validation testing. Integration testing takes as its input modules that have been unit tested, groups them in larger aggregates, applies tests defined in an integration test plan to those aggregates, and delivers as its output the integrated system ready for system testing.
ãŠããããã¹ãçšã®ããŒã«ã®å€ãã¯ã€ã³ãã°ã¬ãŒã·ã§ã³ãã¹ãã«ã䜿ããã ã»ãŒåããããªæéã§è¡ããã®ã ããã§ããã
åãå ¥ããã¹ããšåŒã°ããããšããããå®éã«ã¢ããªã±ãŒã·ã§ã³ã䜿ã芳ç¹ã§ã®èªåãã¹ããäœã£ãŠãã®åãã確èªããã åã«ã³ãŒãçãæ£ããåããšããåã ã®ããŒãããäºãã«æ£ãããããšãã§ããããšãããã¬ãã«ã®ãã¹ãã§ã¯ãªãã ãã®ã¬ãã«ã®ãã¹ãã§ã¯ãå®éã®ããŒã¿ã䜿ã£ããã¢ããªã±ãŒã·ã§ã³ã®å®éã®ãŠãŒã¶ãŒãã·ãã¥ã¬ãŒããããããããšãäžè¬çã ã
æ¯ãèãé§åéçº (BDD) ã«ã¯äºçš®é¡ãããSpecBDD ãš StoryBDD ã ã SpecBDD ã¯ã³ãŒãã®æè¡çãªæ¯ãèããéèŠããStoryBDD ã¯æ¥åçãããã¯æ©èœçãªæ¯ãèããéèŠããã PHP ã«ã¯ããããäºçš®é¡ã® BDD çšã®ãã¬ãŒã ã¯ãŒã¯ãååšããã
StoryBDD ã§ã¯ã人éãèªãã圢åŒã®ã¹ããŒãªãŒãæžããŠã¢ããªã±ãŒã·ã§ã³ã®æ¯ãèãã衚ãã ãããŠãã®ã¹ããŒãªãŒããã¢ããªã±ãŒã·ã§ã³ã®ãã¹ããšããŠå®è¡ããã PHP ã¢ããªã±ãŒã·ã§ã³ã§ StoryBDD ãããããã«äœ¿ãããã¬ãŒã ã¯ãŒã¯ã Behat ã§ããã㯠Ruby ã® Cucumber ã®åœ±é¿ãåãããã¬ãŒã ã¯ãŒã¯ã§ããã Gherkin DSL ã䜿ã£ãŠãã£ãŒãã£ãèšè¿°ã§ããã
SpecBDD ã§ã¯ãå®éã®ã³ãŒãã®ããã¹ãæ¯ãèããã¹ããã¯ãšããŠæžãã 颿°ãã¡ãœãããåç¬ã§ãã¹ãããã®ã§ã¯ãªãããã®é¢æ°ãã¡ãœãããã©ã®ããã«æ¯ãèãã®ããèšè¿°ããã®ã ã PHP ã§ SpecBDD ããããšãã«äœ¿ãããã¬ãŒã ã¯ãŒã¯ã PHPSpec ã§ããã㯠Ruby ã® RSpec project ã®åœ±é¿ãåããŠããã
ãããŸã§ã«åãäžãããã¹ãããŒã«ãæ¯ãèãé§åéçºãã¬ãŒã ã¯ãŒã¯ä»¥å€ã«ãã ãããããªãã¬ãŒã ã¯ãŒã¯ããã«ããŒã©ã€ãã©ãªããããããããæçšã«äœ¿ããã
PHP ã®ã¢ããªã±ãŒã·ã§ã³ããããã€ããŠæ¬çªãµãŒããŒã§éçšããããã®æ¹æ³ã玹ä»ããã
PaaS ã䜿ãã°ãPHP ã¢ããªã±ãŒã·ã§ã³ããŠã§ãäžã§åããããã«å¿ èŠãªã·ã¹ãã ããããã¯ãŒã¯ç°å¢ãçšæããŠãããã ã»ãšãã©äœãèšå®ããã«ãPHP ã®ã¢ããªã±ãŒã·ã§ã³ããã¬ãŒã ã¯ãŒã¯ãå®è¡ã§ãããšããããšã ã
æè¿ã¯ãPHP ã¢ããªã±ãŒã·ã§ã³ã®ãããã€å ãšã㊠PaaS ã䜿ãããšãå€ããªã£ããããããèŠæš¡ã®ã¢ããªã±ãŒã·ã§ã³ãæ±ããã PHP çšã® PaaS âPlatform as a Serviceâ ãããã€ã ããæ å ±æº ã«ãŸãšããã
ãµãŒããŒç®¡çãèŠã«ãªããªã人ããããã¯ãµãŒããŒç®¡çãå匷ããŠã¿ãã人ã¯ãä»®æ³ãµãŒããŒãããã¯å°çšãµãŒããŒãéžã¶ãšããã ããããã°ãã¢ããªã±ãŒã·ã§ã³ã®éçšç°å¢ãå®å šã«å¶åŸ¡ã§ããã
PHP ã«çµã¿èŸŒãŸãã FastCGI Process Manager (FPM) 㯠nginx ãšçµã¿åãããã®ã«æé©ã ãnginx ã¯ã軜éã§ããã©ãŒãã³ã¹ã«åªãããŠã§ããµãŒããŒã§ããã Apache ãããå°ãªãã¡ã¢ãªã§åããåæã«ãã°ãããªã¯ãšã¹ãã®æ°ãå€ãã ããã¯ç¹ã«ãå ±æã¡ã¢ãªã®å°ãªãä»®æ³ãµãŒããŒã§ã¯éèŠã ã
PHP ãš Apache ã¯é·ãä»ãåãã ã Apache ã¯ããããªèšå®ãå¯èœã§ãããŸããŸãª ã¢ãžã¥ãŒã« ã§æ©èœãæ¡åŒµã§ãããå ±æãµãŒããŒã§ PHP ã®ãã¬ãŒã ã¯ãŒã¯ãåãããããWordPress ã¿ãããªã¢ããªã±ãŒã·ã§ã³ãåãããããããšãã«ã¯ãã䜿ãããéžæè¢ã ã æ®å¿µãªãã Apache ã¯ãããã©ã«ãã§ã¯ nginx ãããã¡ã¢ãªãé£ããã åæã«ãã°ãããŠãŒã¶ãŒæ°ã nginx ããå°ãªãã
Apache ã§ PHP ãåããã«ã¯ããã€ãã®éžæè¢ãããã
äžçªãã䜿ãããŠããŠç°¡åã«èšå®ã§ããã®ããprefork MPM ãš mod_php ã®çµã¿åããã ã
ã¡ã¢ãªã®äœ¿çšå¹çã¯ããã»ã©ãããªããããšããããåãããŠäœ¿ãã«ã¯äžçªã·ã³ãã«ã ã
ãµãŒããŒç®¡çæ¹é¢ã«ããŸãè¶³ãçªã£èŸŒã¿ãããªãå Žåã¯ããã®æ¹æ³ãããã ããã
泚æãã¹ãç¹ã¯ãmod_php ã䜿ãå Žåã¯å¿
ã prefork MPM ã䜿ããªããšãããªããšããããšã ã
Apache æ¬æ¥ã®ããã©ãŒãã³ã¹ãå®å®æ§ããã£ãšçµãåºããããšããå Žåã¯ãnginx ãšåãããã« FPM ã䜿ãããšãã§ããã ãã®å Žåã¯ãworker MPM ããã㯠event MPM ã« mod_fastcgi ããã㯠mod_fcgid ãçµã¿åãããããã®èšå®ã¯ã¡ã¢ãªã®å©çšå¹çããããŠé«éã«åäœããããèšå®ã«æéããããã
Apache 2.4 以éãªããmod_proxy_fcgiã䜿ãããç°¡åã«ã»ããã¢ããã§ããã髿§èœã ã
ãŸãããããŒã¿ããŒã¹ã®ã¹ããŒãã倿Žããããã¹ããå®è¡ããããšããã£ãããšãæäœæ¥ã§ãã£ãŠããªããŠããšã¯ãªãããïŒ ã¡ãã£ãšåŸ ã£ãïŒæ°ããããŒãžã§ã³ã®ã¢ããªã±ãŒã·ã§ã³ããããã€ãããšãã«æäœæ¥ãã²ãšã€ã§ãå¢ãããšã èŽåœçãªééããç¯ããŠããŸãå¯èœæ§ããã®ã¶ãå¢ããŠããŸããã ãããšãåçŽãªæŽæ°äœæ¥ã ãšããŠãã ãã¡ããšãããã«ãæé ã«ããããããšãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã®æŠç¥ã«ãããã£ãŠã ãã«ãã®èªåå ãããŠãããšããã
èªååã§ããã¿ã¹ã¯ã«ã¯ããããªãã®ãããã
ãããã€ããŒã«ãšã¯ããœãããŠã§ã¢ã®ãããã€ã«ããããããã¡ãªäœæ¥ãåŠçããã¹ã¯ãªããããŸãšãããã®ã ãšèšããã ãããã€ããŒã«èªäœã¯åãäœããœãããŠã§ã¢ã®äžéšã§ã¯ãªãããœãããŠã§ã¢ããå€éšãããæ¯æŽãããã®ã ã
ãã«ãèªååããããã€ã®å©ããšãªããªãŒãã³ãœãŒã¹ã®ããŒã«ãããããå ¬éãããŠãããPHPã§æžãããŠãããã®ãããã°ã ãããããªããã®ããããPHP補ãããªããããšãã£ãŠãããã䜿ããªãçç±ã¯ãªãã ããèªåã®ããããããšã«é©ããããŒã«ãããã®ãªãã䜿ãã¹ãã ãããã€ãäŸãããããã
Phing ã䜿ãã°ãããã±ãŒãžã³ã°ããããã€ãããŠãã¹ããšãã£ãåŠçãã·ã³ãã«ãªXMLãã«ããã¡ã€ã«ã§èšå®ã§ããã Phingã¯Apache Ant ãããŒã¹ã«äœããããã®ã§ã Webã¢ããªã®ã€ã³ã¹ããŒã«ãã¢ããããŒãã«å¿ èŠãšãªãã¿ã¹ã¯çŸ€ãæäŸããã ã«ã¹ã¿ã ã¿ã¹ã¯ã§æ©èœã远å ããããšãã§ããã«ã¹ã¿ã ã¿ã¹ã¯ã¯PHPã§æžããã å€ãããããããŒã«ã ããã£ãŠå å®ã§å®å®ããŠããã©ãã¡ãã£ãšå€èããæãã (èšå®ãXMLãã¡ã€ã«ã§ç®¡çãããšãããšãã)ã
Capistrano 㯠äžçŽããäžçŽã®ããã°ã©ã㌠åãã®ã·ã¹ãã ã ãæ§é åããããç¹°ãè¿ãå¯èœãªåœ¢åŒã§ã è€æ°ã®ãªã¢ãŒããã·ã³äžã§ã³ãã³ããå®è¡ã§ããã Ruby on Railsã®ã¢ããªããããã€ããããã«èšå®ãããŠãããã PHP ã®ã¢ããªããããã€ã§ããã Capistranoã䜿ãããªãã«ã¯ãRubyãšRakeã«é¢ãããããªãã®ç¥èãå¿ èŠã ã Dave Gardnerã®blogèšäº[PHP Deployment with Capistrano][phpdeploy_capistrano] ã¯ãCapistranoã«èå³ã®ããPHPéçºè ãžã®å ¥éèšäºãšããŠããããã ã
Ansistrano ã¯ãããã€ããã»ã¹(ãããã€ãããŒã«ããã¯) ãç°¡åã«ç®¡çããããã® Ansible ã®ããŒã«ã ãPHP ã Python ã Ruby ã®ãããªã¹ã¯ãªããèšèªã§æžãããã¢ããªã±ãŒã·ã§ã³ã§äœ¿ãããããã¯ãCapistrano ã Ansible ã«ç§»æ€ãããã®ã§ãæ¢ã«ããããã® PHP ãå©çšããŠããäŒç€Ÿã§äœ¿ãããŠããã
Deployer ã¯PHPã§æžããããããã€ããŒã«ã§ãã·ã³ãã«ãã€æ©èœçã ã ã¿ã¹ã¯ã䞊åã«å®è¡ããã¢ãããã¯ãªãããã€ãè¡ãããµãŒããŒéã®æŽåæ§ãç¶æããã SymfonyãLaravelãZend FrameworkããããŠYiiãªã©ã§äœ¿ãããäžè¬çãªã¿ã¹ã¯ã®ã¬ã·ããçšæãããŠããã Younes Rafieã®èšäºEasy Deployment of PHP Applications with Deployer ã¯ãDeployerã䜿ã£ãŠã¢ããªã±ãŒã·ã§ã³ããããã€ããããã®ãããã¥ãŒããªã¢ã«ã«ãªã£ãŠããã
Magallanes ãPHPã§æžãããããŒã«ã§ãYAMLã§ã®ã·ã³ãã«ãªèšå®ãã§ããã è€æ°ãµãŒããŒãè€æ°ç°å¢ãã¢ãããã¯ãªãããã€ã«å¯Ÿå¿ããŠããŠã äžè¬çãªããŒã«ããã¬ãŒã ã¯ãŒã¯ã§äœ¿ããçµã¿èŸŒã¿ã®ã¿ã¹ã¯ãçšæãããŠããã
ãµãŒããŒã®æ§æç®¡çã¯ã倧éã®ãµãŒããŒãæ±ãããã«ãªããšç¹ã«å€§å€ãªã¿ã¹ã¯ã ã ããããªããŒã«ãçšæãããŠããã®ã§ããããã£ãã€ã³ãã©ã®æ§ç¯ãèªååã§ããã ããŒã«ã䜿ãã°ãé©åãªãµãŒããŒãé©åãªæ§æã«ãªã£ãŠããããšã確å®ã«ã§ããã ãããã®ããŒã«ã¯å€§èŠæš¡ãªã¯ã©ãŠããã¹ãã£ã³ã°ãããã€ã㌠(Amazon Web Services, Heroku, DigitalOceanãªã©) ã«ãã€ã³ã¹ã¿ã³ã¹ã®ç®¡ççšã«çµ±åãããŠããããšãå€ããŠã ããç°¡åã«ã¢ããªã±ãŒã·ã§ã³ãã¹ã±ãŒã«ã§ããããã«ãªã£ãŠããã
Ansible ã¯ãYAMLãã¡ã€ã«ã§ã€ã³ãã©ã管çããããŒã«ã ã æ°è»œã«äœ¿ãå§ããããããè€éã§å€§èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ã«ã䜿ããã ã¯ã©ãŠãã®ã€ã³ã¹ã¿ã³ã¹ã管çããããã®APIãçšæãããŠããŠã 察å¿ããããŒã«ã䜿ãã°åçã€ã³ãã³ããªãéããŠã€ã³ã¹ã¿ã³ã¹ã管çã§ããã
Puppet ã¯ãç¬èªã®èšèªããã¡ã€ã«ã¿ã€ãã䜿ã£ãŠãµãŒããŒãæ§æã管çããã ãã¹ã¿ãŒïŒã¯ã©ã€ã¢ã³ã圢åŒã§äœ¿ãããšãã§ããããããã¹ã¿ãŒã¬ã¹ãã¢ãŒãã§äœ¿ãããšãã§ããã ãã¹ã¿ãŒïŒã¯ã©ã€ã¢ã³ãã¢ãŒãã®å Žåã¯ãæå®ã®ã€ã³ã¿ãŒãã«ã§ã¯ã©ã€ã¢ã³ããäžå€®ãµãŒããŒãããŒãªã³ã°ããŠã æ°ããæ§æãèŠã€ãã£ããèªåèªèº«ãæŽæ°ããã ãã¹ã¿ãŒã¬ã¹ã¢ãŒãã§ã¯ã倿Žå 容ãåããŒãã«ããã·ã¥ããã
Chef ã¯Rubyã§äœããã匷åãªã·ã¹ãã ã€ã³ãã°ã¬ãŒã·ã§ã³ãã¬ãŒã ã¯ãŒã¯ã§ã ãµãŒããŒç°å¢ãä»®æ³ãã·ã³ããŸãããšæ§ç¯ã§ããã Amazon Web Servicesãšãçµ±åãããŠããŠãOpsWorksãšãããµãŒãã¹ãéããŠå©çšããã
ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã¯ãœãããŠã§ã¢éçºã®ãã©ã¯ãã£ã¹ã®ã²ãšã€ã§ã ããŒã ã®ã¡ã³ããŒãèªåãã¡ã®äœæ¥ãé »ç¹ã«çµ±åãããšãããã®ã ã éåžžã¯ãåèªãå°ãªããšãäžæ¥ã«äžåºŠã¯çµ±åãããäžæ¥ã«äœåºŠãçµ±åããããšãããã å€ãã®ããŒã ãããã®æ¹éã®ãããã§çµ±åæã®åé¡ãå°ãªããªããã ãã¡ããšãããœãããŠã§ã¢ãããçŽ æ©ãéçºã§ããããã«ãªããšå®æããŠããã
â ããŒãã£ã³ã»ãã¡ãŠã©ãŒ
PHPã§ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ãå®è·µããæ¹æ³ã¯ããããããã Travis CI ã®ãããã§ã ã¡ãã£ãšãããããžã§ã¯ãã«ãç°¡åã«ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ãçµã¿èŸŒããããã«ãªã£ãã Travis CIã¯ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã®ãã¹ãã£ã³ã°ç°å¢ã§ããªãŒãã³ãœãŒã¹ã³ãã¥ããã£ã«éæŸãããŠããã GitHubãšçµ±åãããŠãããPHPãå«ãããŸããŸãªèšèªã«å¯Ÿå¿ããŠããã GitHub ã¯ãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã®ã¯ãŒã¯ãããŒãšã㊠GitHub Actions ãæäŸããŠããã
éçºç°å¢ã ã®æ¬çªç°å¢ã ã®ãããããéãç°å¢ã§ã¢ããªã±ãŒã·ã§ã³ãåãããŠãããšãããããªãã°ã«åºããããŠããŸããããªãã ãéçºç°å¢ã ãšåé¡ãªãã®ã«ãæ¬çªç°å¢ã ãšåããªããã¿ãããªãã€ã ã ãŸããããŒã ã§éçºããŠãããšãã«ãéçºç°å¢ã®ããããªã©ã€ãã©ãªã®ããŒãžã§ã³ããã¡ããšçµ±äžããŠããã®ããé¢åã ã
Windowsã§éçºããŠLinuxïŒãªã©Windows以å€ã®ç°å¢ïŒã«ãããã€ããŠããããããŒã ã§éçºããŠãããããå Žåã¯ã ä»®æ³ãã·ã³ã䜿ãããšãèããã¹ãã ã äœãé£ããããšã¯ãªããVMwareãVirtualBoxã¿ãããªæåã©ããã ãã§ãªãã ä»®æ³ç°å¢ãç°¡åã«æºåããããã®ããŒã«ãçšæãããŠããã
Vagrantã䜿ãã°ãæ¢ç¥ã®ä»®æ³ç°å¢ã䜿ã£ãŠèªåçšã®ããã¯ã¹ãäœããŠããã®ç°å¢ã®æ§æãããã£ãã²ãšã€ã®èšå®ãã¡ã€ã«ã ãã§ã§ããã ãã®ããã¯ã¹ãæåã§èšå®ããããšãã§ãããã PuppetãšãChefã¿ãããªãããããžã§ãã³ã°ããœããã«ããŸããããããšã ã£ãŠã§ããã ããŒã¹ãšãªãç°å¢ãé åžã§ããããã«ããŠããã°ãè€æ°ã®éçºç°å¢ããŸã£ããåãç¶æ ã«æ§ç¯ã§ããã è€éæªå¥ãªã³ãã³ããçŸ åãããç°å¢æ§ç¯æé æžãã ãšãããã®ããããªããªãã£ãŠããšã ããŒã¹ç°å¢ããç Žæ£ããããäœããªããããããã®ããããªã«æéãããããªãã®ã§ã ãŸã£ãããªç°å¢ãçšæããã®ããæè»œã«ã§ããã
Vagrantã¯ããã©ã«ããäœã£ãŠããã¹ããšä»®æ³ãã·ã³ã®éã§ã³ãŒããå ±æããã ã€ãŸãããã¹ããã·ã³ã§äœã£ããç·šéãããããã³ãŒããããã®ãŸãŸä»®æ³ãã·ã³ã®äžã§å®è¡ã§ããã£ãŠããããšã ã
Docker - å®å šä»®æ³åããããã·ã³ã®è»œéãªä»£æ¿ - ã¯ããã¹ãŠã âã³ã³ããâ ã§ããããããã®ããã«åŒã°ããŠãããã³ã³ããã¯ããã£ãšãç°¡åãªã±ãŒã¹ã§ã¯ãç¹å®ã®ã¿ã¹ã¯ãã²ãšã€ã ã(ããšãã° WebãµãŒããŒ)ãå®è¡ãããã«ãã£ã³ã°ãããã¯ã ãâã€ã¡ãŒãžâ ã¯ãã³ã³ããããã«ãããããã«äœ¿ãããã±ãŒãžã ãDocker ã¯ãã€ã¡ãŒãžãé åžããããã®ãªããžããªãæã£ãŠããã
å žåç㪠LAMP ã¢ããªã±ãŒã·ã§ã³ã®å Žåãã³ã³ããã¯3ã€å¿ èŠã«ãªããWebãµãŒããŒãPHP-FPM ããã»ã¹ããã㊠MySQL ã®ã³ã³ããã ãå ±æãã©ã«ãã Vagrant å ã§äœ¿ãã®ãšåãããã«ãã¢ããªã±ãŒã·ã§ã³ã®ãã¡ã€ã«ã¯ãã®ãŸãŸã§ãDocker ã«ã©ããæ¢ãã°ããã®ããæç€ºããããšãã§ããã
ã³ã³ããã¯ã³ãã³ãã©ã€ã³ (以äžã®äŸãèŠãã) ããäœæããããšãã§ããããã¡ã³ããã³ã¹ãç°¡åã«ããããã« docker-compose.yml ãã¡ã€ã«ãããªãã®ãããžã§ã¯ãåãã«ãã«ãããããšãã§ããããã®ãã¡ã€ã«ã§ã¯ãäœã®ã³ã³ãããäœãããæå®ããããããäºãã«ã©ãéä¿¡ããã®ããæç€ºããã
Docker ã¯ãè€æ°ã® Web ãµã€ã ãéçºããä»®æ³ãã·ã³äžã§ããããã® Webãµã€ã ã®ã€ã³ã¹ããŒã«ç°å¢ãåé¢ãããå Žåã«åœ¹ç«ã€ãã ãããã¹ãŠãææ°ã®ç°å¢ã«ããŠããããã«ã远å ã®ãã£ã¹ã¯ã¹ããŒã¹ãæéã¯å¿ èŠãªããDocker ã¯å¹ççã : ã€ã¡ãŒãžã®ããŠã³ããŒããã€ã³ã¹ããŒã«ã¯é«éã ããäœåºŠã€ã¡ãŒãžãå¿ èŠã«ãªã£ãŠããä¿åããŠããå¿ èŠãããã€ã¡ãŒãžã®ã³ããŒã¯ã²ãšã€ã ãã ããŸããåã OS ã®ã«ãŒãã«ãå ±æããã®ã§ãå¿ èŠãªã¡ã¢ãªã¯å°ãªããŠæžãããã£ãŠãå€ãã®ãµãŒããåæã«å®è¡ã§ãããã忢ãèµ·åã«æããæéãç§åäœã§æžãããµãŒããã·ã³ãå®å šã«èµ·åããã®ãåŸ ã€å¿ èŠããªãã®ã ã
ãã·ã³ã«Dockerãã€ã³ã¹ããŒã«ããããããšäžæéã ãã§ãPHP ã䜿ãã Apache ç°å¢ãçšæã§ããã
次ã®ã³ãã³ãã¯ãææ°çã®PHPå
¥ãã®Apacheç°å¢ãããŠã³ããŒãããŠã
ãã£ã¬ã¯ã㪠/path/to/your/php/files ã http://localhost:8080 ã§èŠãããããã«ãããã®ã ã
docker run -d --name my-php-webserver -p 8080:80 -v /path/to/your/php/files:/var/www/html/ php:apacheããã§ãã³ã³ãããåæåããŠå®è¡ã§ããã-d ã¯ãããã¯ã°ã©ãŠã³ãã§å®è¡ãããªãã·ã§ã³ã ã
ã³ã³ããã忢ããããåéãããããããªã£ããããå Žåã¯ãnameã«æå®ããååã䜿ã£ãŠ
docker stop my-php-webserver ã docker start my-php-webserver ãªã©ãšããã ãã ã
ãã£ãã®ãã©ã¡ãŒã¿ãäœåºŠãæå®ããå¿
èŠã¯ãªãã
ããã§ç޹ä»ããã®ã¯ãåºæ¬çãªãµãŒããŒããæè»œã«å®è¡ããããã®ã³ãã³ãã ã ã ãã©ãDocker ã«ã§ããããšã¯ãŸã ãŸã ãããããã(ãããŠãããããã®ãã«ãæžã¿ã®ã€ã¡ãŒãžã Docker Hub ã«ãã)ãDocker ãæå€§é掻çšããããã«ãDocker ãŠãŒã¶ãŒã¬ã€ã ãèªã¿ãæéãæããŠãããã«é¢ããçšèªãåŠãã§ãããããããŠãããŠã³ããŒãããã³ãŒããå®å šãã©ãã確èªããã«å®è¡ããªãããã«æ³šæããããéå ¬åŒãªã€ã¡ãŒãžã«ã¯ææ°ã®ã»ãã¥ãªãã£ããããåœãã£ãŠããªãå Žåãããããã ãããããããªããã°ããªãã£ã·ã£ã«ã®ãªããžã㪠ãåžžã«äœ¿ãããã«ãããã
PHPDocker.io ãµã€ãã¯ãããªããéžãã PHP ã®ããŒãžã§ã³ãæ¡åŒµæ©èœãå«ãã圢ã§ãå šãŠã®æ©èœãåãã LAMP/LEMP ã¹ã¿ãã¯ã«å¿ èŠãªãã¡ã€ã«ãå šãŠèªåçæããŠãããã
PHP èªäœã¯æ¥µããŠé«éã ãã©ããªã¢ãŒãæ¥ç¶ããã¡ã€ã«ã®èªã¿èŸŒã¿ãªã©ã絡ããšããã«ããã¯ã«ãªããããããªãã ãããããããšã«ãããããªããŒã«ã掻çšããã°ã¢ããªã±ãŒã·ã§ã³ãé«éåã§ãããã æéã®ãããåŠçã®å®è¡åæ°ãæžããããšãã§ããã
PHPãã¡ã€ã«ãå®è¡ãããšãã«ã¯ããŸãããããªãã³ãŒã (CPUçšã®æ©æ¢°èªã®æç€º) ã«ã³ã³ãã€ã«ããªããã°ãããªãã ãœãŒã¹ã³ãŒãã«å€æŽããªããã°ããªãã³ãŒããåããã®ã«ãªãã ãšããããšã¯ãPHP ãã¡ã€ã«ã«å€æŽããªããã°ã³ã³ãã€ã«åŠç㯠CPU ãªãœãŒã¹ã®ç¡é§é£ãã«ãªããšããããšã ã
ãªãã³ãŒããã£ãã·ã¥ã¯ãã³ã³ãã€ã«æžã¿ã®ãªãã³ãŒããã¡ã¢ãªã«æ ŒçŽãããã以éã®åŒã³åºãã§åå©çšããããšã§ã åé·ãªã³ã³ãã€ã«ãåé¿ããŠãããããããã®ã¯ããã¡ã€ã«ã®ã·ã°ããã£ãæŽæ°æå»ããã§ãã¯ããŠå€æŽã®æç¡ã倿ããæ¹åŒã ã
ãªãã³ãŒããã£ãã·ã¥ã䜿ãã°ãã¢ããªã±ãŒã·ã§ã³ã®å®è¡é床ãçžåœåäžããå¯èœæ§ãããã
PHP 5.5 ããã¯ã Zend OPcache ãšãããªãã³ãŒããã£ãã·ã¥ãæšæºã§çµã¿èŸŒãŸããããã«ãªã£ãã
䜿ã£ãŠãã PHP ããã±ãŒãžããã£ã¹ããªãã¥ãŒã·ã§ã³ã«ããããã©ãæ®éã¯ããã©ã«ãã§æå¹ã«ãªã£ãŠããããšãå€ãã
opcache.enable
ãã phpinfo() ã®åºåã§ç¢ºèªãããã
å€ãããŒãžã§ã³ã®PHPãªããPECL ã®æ¡åŒµã¢ãžã¥ãŒã«ã䜿ããã
ãªãã³ãŒããã£ãã·ã¥ã«ã€ããŠè©³ããç¥ããããã°ã以äžãåç §ããããšã
ã³ãŒãå ã®åã ã®ãªããžã§ã¯ãããã£ãã·ã¥ã§ããã°äŸ¿å©ãªããšãããã æã£ãŠããã®ã«ã³ã¹ãããããããŒã¿ããçµæãã»ãšãã©å€ãããªãããŒã¿ããŒã¹ãžã®åãåãããªã©ã ã ãªããžã§ã¯ããã£ãã·ã¥çšã®ãœãããŠã§ã¢ã䜿ãã°ããããã£ãããŒã¿ãã¡ã¢ãªäžã«ä¿æã§ãã ãã®åŸã®ã¢ã¯ã»ã¹ã®é«éåã«ã€ãªããã äžåºŠååŸããããŒã¿ãã©ããã«æ ŒçŽããŠãããŠããã以éã®ãªã¯ãšã¹ãã§ã¯ããããçŽæ¥åãåºãã ããããã°ããã©ãŒãã³ã¹ã¯åçã«åäžããããããŒã¿ããŒã¹ãµãŒããŒã«ãããè² è·ãæžãããã
ãã€ãã³ãŒããã£ãã·ã¥çšãœãªã¥ãŒã·ã§ã³ã®å€ãã¯ã«ã¹ã¿ã ããŒã¿ãåæ§ã«ãã£ãã·ã¥ã§ããã®ã§ãããã«æŽ»çšã§ããã APCu ã WinCache 㯠API ãæäŸããŠãããPHP ã³ãŒãã®ããŒã¿ãã¡ã¢ãªãã£ãã·ã¥ã«æ ŒçŽã§ããã
ãªããžã§ã¯ããã£ãã·ã¥ã·ã¹ãã ãšããŠæããã䜿ãããŠããã®ã¯ APCu ãš memcached ã ã APCu ã¯ãªããžã§ã¯ããã£ãã·ã¥ã®éžæè¢ãšããŠæé©ã§ã ã·ã³ãã«ãª API ã䜿ã£ãŠããŒã¿ãã¡ã¢ãªãã£ãã·ã¥ã«æ ŒçŽã§ããã ã»ããã¢ãããç°¡åã§ãããã«äœ¿ããããã«ãªãã APCu ã®å¶çŽã®ã²ãšã€ã¯ãã€ã³ã¹ããŒã«ãããµãŒããŒãšå¯æ¥ã«çµåããŠããŸãããšã ã äžæ¹ãMemcached ã¯åå¥ã®ãµãŒãã¹ãšããŠã€ã³ã¹ããŒã«ãããã®ã§ããã ãããã¯ãŒã¯è¶ãã«ã¢ã¯ã»ã¹ã§ãããã€ãŸãã äžå€®ã§ç®¡çããŠããè¶ é«éãªã¹ãã¬ãŒãžã«ãªããžã§ã¯ããæ ŒçŽããŠã ããããªã·ã¹ãã ãããããåãåºãããšããããšã ã
PHPã(Fast-)CGIã¢ããªã±ãŒã·ã§ã³ãšããŠãŠã§ããµãŒããŒã§å®è¡ãããšãã«ã¯ã ãã¹ãŠã®PHPããã»ã¹ãèªèº«ã®ãã£ãã·ã¥ãæã€ããšã«ãªããã€ãŸã APCuã®ããŒã¿ãã¯ãŒã«ãŒããã»ã¹éã§ã¯å ±æãããªããšããããšã ã ãããªãšãã«ã¯ããããã«memcachedãæ€èšããã°ããã ãã£ã¡ã¯PHPã®ããã»ã¹ã«ã¯çµã³ã€ããŠããªãã
ãããã¯ãŒã¯ç°å¢ã«ãããŠãã¢ã¯ã»ã¹é床ã®é¢ã§ã¯ APCu ã®ã»ãã memcached ããåªããŠããã ããããmemcached ã®ã»ãããããæè»œã«ã¹ã±ãŒã«ã¢ããã§ããã è€æ°ã®ãµãŒããŒã䜿ãäºå®ããªããšã memcached ã®è¿œå æ©èœãäžèŠã ãšããå Žåã¯ã ãªããžã§ã¯ããã£ãã·ã¥ã« APCu ãéžã¶ã®ãæé©ã ããã
APCu ã䜿ãããžãã¯ã®äŸã瀺ãã
<?php
// 'expensive_data' ããã£ãã·ã¥ã«ä¿åãããŠãããã©ããã調ã¹ã
$data = apcu_fetch('expensive_data');
if ($data === false) {
// ããŒã¿ããã£ãã·ã¥ã«ãªããšãã¯ãã³ã¹ãã®ãããæäœãããŠååŸããã
// ãããŠããã®çµæãä¿åããŠããšã§äœ¿ããããã«ããã
apcu_add('expensive_data', $data = get_expensive_data());
}
print_r($data);PHP 5.5 ããåã®ããŒãžã§ã³ã§ã¯ãAPC ããªããžã§ã¯ããã£ãã·ã¥ãšãã€ãã³ãŒããã£ãã·ã¥ã®äž¡æ¹ã®æ©èœãæäŸããŠããã æ°ãã APCu ã¯ãAPC ã®ãªããžã§ã¯ããã£ãã·ã¥æ©èœã PHP 5.5 以éã§äœ¿ããããã«ãããã®ã ã ãšããã®ããPHP 5.5 以éã§ã¯ãã€ãã³ãŒããã£ãã·ã¥ïŒOPcacheïŒã®æ©èœãæšæºã§çµã¿èŸŒãŸããããã«ãªã£ãããã ã
PHPDocã¯ãéå ¬åŒãªãããPHPã®ã³ãŒãã«ã³ã¡ã³ããæžããšãã®æšæºãšããŠäœ¿ãããŠãããã®ã ã ããŸããŸãª [ã¿ã°] ã䜿ããã ãã¹ãŠã®ã¿ã°ã®äžèЧãå®éã®äœ¿çšäŸã¯ã PHPDoc ã®ããã¥ã¢ã« ãåç §ããããšã
ããã€ãã®ã¡ãœãããæã€ã¯ã©ã¹ã®ããã¥ã¡ã³ããæžãäŸã瀺ããã
<?php
/**
* @author A Name <a.name@example.com>
* @link https://www.phpdoc.org/docs/latest/index.html
*/
class DateTimeHelper
{
/**
* @param mixed $anything Anything that we can convert to a \DateTime object
*
* @throws \InvalidArgumentException
*
* @return \DateTime
*/
public function dateTimeFromAnything($anything)
{
$type = gettype($anything);
switch ($type) {
// Some code that tries to return a \DateTime object
}
throw new \InvalidArgumentException(
"Failed Converting param of type '{$type}' to DateTime object"
);
}
/**
* @param mixed $date Anything that we can convert to a \DateTime object
*
* @return void
*/
public function printISO8601Date($date)
{
echo $this->dateTimeFromAnything($date)->format('c');
}
/**
* @param mixed $date Anything that we can convert to a \DateTime object
*/
public function printRFC2822Date($date)
{
echo $this->dateTimeFromAnything($date)->format('r');
}
}ã¯ã©ã¹å šäœã®ããã¥ã¡ã³ãã®æåã«ããã®ã @author ã¿ã°ãš @link ã¿ã°ã ã @author ã¿ã°ã¯ãã³ãŒãã®äœè ã衚ããäœè ãè€æ°ããå Žåã¯ãäœåºŠãç¹°ãè¿ã䜿ã£ãŠãããŸããªãã @link ã¿ã°ã¯ããã®ã³ãŒãã«é¢é£ãããŠã§ããµã€ããžã®ãªã³ã¯ã瀺ãããã«äœ¿ãã
ã¯ã©ã¹ã®äžã«ç®ãç§»ããšãæåã®ã¡ãœããã«ã¯ @param ã¿ã°ãèšãããŠããã ããã¯ããã®ã¡ãœããã«æž¡ããã©ã¡ãŒã¿ã®åãšååãããŠèª¬æãèšè¿°ãããã®ã ã ããã«ã@return ã¿ã°ãš @throws ã¿ã°ãæžãããŠããã ãããã¯ãããããæ»ãå€ã®åãšãçºçããå¯èœæ§ã®ããäŸå€ãèšè¿°ãããã®ã ã
äºçªç®ãšäžçªç®ã®ã¡ãœããã¯ã»ãŒåãã ããŸããæåã®ã¡ãœãããšåæ§ã« @param ã¿ã°ãæžãããŠããã
äºçªç®ãšäžçªç®ã®ã¡ãœããã®å€§ããªéãã¯ã @return ã¿ã°ã®æç¡ã ã
@return void ã¯ããã®ã¡ãœãããäœãæ»ããªãããšãæç€ºããŠããã
äžæ¹ãæŽå²çã«ã @return void ãçç¥ããå Žåãåãæå³ïŒäœãå€ãæ»ããªãïŒã«ãªãã
PHPã³ãã¥ããã£ã®äžã§æ³šç®ãã¹ã人ãèŠã€ããã®ã¯ãã³ãã¥ããã£ã«å ãã£ãã°ããã®äººãã¡ã«ãšã£ãŠã¯é£ãããã®ã ã PHPã³ãã¥ããã£ã®äž»èŠã¡ã³ããŒã®äžèЧããããã«ãŸãšãŸã£ãŠããã
PHP éçºè ã®å€ãã¯ããŠã§ãã¢ããªã±ãŒã·ã§ã³ãäœããšãã«è»èŒªã®åçºæãé¿ããŠãã¬ãŒã ã¯ãŒã¯ã䜿ã£ãŠããã ãã¬ãŒã ã¯ãŒã¯ã䜿ãã°äœã¬ãã«ã®äœæ¥ã®å€ããæœè±¡åã§ãã 䟿å©ã§äœ¿ããããã€ã³ã¿ãŒãã§ã€ã¹ã§ããããäœæ¥ãããªããã
å¥ã«ããã¬ãŒã ã¯ãŒã¯ã䜿ããªããšãããªããšãããããããªãã ãµã€ãã« PHP ã§æžãã¹ãå Žé¢ã ã£ãŠããã ãããã¬ãŒã ã¯ãŒã¯ã䜿ãã®ãªãããã¬ãŒã ã¯ãŒã¯ã¯ãããªæãã«åé¡ã§ããããšãç¥ã£ãŠãããã
ãã€ã¯ããã¬ãŒã ã¯ãŒã¯ãšããã®ã¯æ¬è³ªçã«ã¯ã©ãããŒã§ã HTTP ãªã¯ãšã¹ããæã£åãæ©ãã³ãŒã«ããã¯ã«æ¯ãåããã ãã®ãã®ã ã å Žåã«ãã£ãŠã¯ãéçºãæ¯æŽããããã®ã¡ãã£ãšãã远å ã©ã€ãã©ãªãä»å±ããããšãããã ããŒã¿ããŒã¹ã®åºæ¬çãªã©ãããŒãªã©ã ããã€ã¯ããã¬ãŒã ã¯ãŒã¯ã®äž»ãªäœ¿ãéã¯ã ãªã¢ãŒã HTTP ãµãŒãã¹ã®æ§ç¯ã§ããã
å€ãã®ãã¬ãŒã ã¯ãŒã¯ã¯ããã€ã¯ããã¬ãŒã ã¯ãŒã¯ãæã€æ©èœã«å ããŠå€§éã®æ©èœãçšæããŠããã ãã®çš®ã®ãã¬ãŒã ã¯ãŒã¯ã®ããšãããã«ã¹ã¿ãã¯ãã¬ãŒã ã¯ãŒã¯ãšåŒã¶ã ORM ãèªèšŒããã±ãŒãžãªã©ãå«ãŸããããšãå€ãã
ã³ã³ããŒãã³ããã¬ãŒã ã¯ãŒã¯ãšã¯ãç¹å®ã®ç®çã®ããã®å°çšã©ã€ãã©ãªããšããŸãšãããã¬ãŒã ã¯ãŒã¯ã§ããã ãã®çš®ã®ãã¬ãŒã ã¯ãŒã¯ã®ã³ã³ããŒãã³ããåçš®çµã¿åãããŠã ãã€ã¯ããã¬ãŒã ã¯ãŒã¯ããã«ã¹ã¿ãã¯ãã¬ãŒã ã¯ãŒã¯ãäœãããšãã§ããã
å ã»ã©èª¬æããããã«ããã³ã³ããŒãã³ããã£ãŠããã®ã¯ å ±æããã³ãŒããäœã£ãããããé åžãããããããã®ææ®µã®ã²ãšã€ã ã ã³ã³ããŒãã³ããç»é²ãããªããžããªã«ããããããããã©ãäžã§ãæåãªã®ããã®ãµãã€ã ã
ã©ã¡ãã®ãªããžããªã«ã€ããŠãã³ãã³ãã©ã€ã³ã®ããŒã«ãååšãã ã³ã³ããŒãã³ãã®ã€ã³ã¹ããŒã«ãã¢ããã°ã¬ãŒããç°¡åã«ã§ããã 詳现ã¯[äŸåé¢ä¿ã®ç®¡ç][dm]ãåç §ããããšã
ã³ã³ããŒãã³ãããŒã¹ã®ãã¬ãŒã ã¯ãŒã¯ãããã°ããã¬ãŒã ã¯ãŒã¯ãæããã«ã³ã³ããŒãã³ãã ããæäŸãããã³ããŒãããã ãããã£ããããžã§ã¯ããæäŸããããã±ãŒãžã¯ãä»ã®ããã±ãŒãžãç¹å®ã®ãã¬ãŒã ã¯ãŒã¯ãžã®äŸåãã»ãšãã©ãªãã
ããšãã°[FuelPHPã®Validationããã±ãŒãž][fuelval]ã䜿ããšãã«ã¯ã å¥ã«FuelPHPãã¬ãŒã ã¯ãŒã¯ã䜿ãå¿ èŠã¯ãªãã
Laravelã® Illuminate ã³ã³ããŒãã³ã ããå°æ¥çã«ã¯ Laravel ãã¬ãŒã ã¯ãŒã¯ãããã¡ããšåãé¢ãããããã«ãªãã ããã çŸæ®µéã§ã¯ãLaravel ãã¬ãŒã ã¯ãŒã¯ããããŸãåãé¢ããŠããã³ã³ããŒãã³ãã ãããªã¹ãã«ãããŠãããã
ãã¥ãŒã¹ã¬ã¿ãŒã賌èªããã°ãæ°ããã©ã€ãã©ãªãææ°ãã¥ãŒã¹ãã€ãã³ããªã©ã®éç¥ãåãåããã ããã ããããªããŠãæ°æ§ããŸããŸãªèšäºã玹ä»ããŠãããã ããã
ãã®ä»ã®ãã©ãããã©ãŒã ã«ãåããããªé±åãã¥ãŒã¹ã¬ã¿ãŒãããã ãã®äžéšããŸãšããã
PHPã«é¢ããæ¬ã¯ãã£ã±ãåºãŠããã©ãçµ¶æçã«å€ããªã£ãŠããŸã£ãŠããŠãã¯ãæ£ããæ å ±ã§ã¯ãªããªã£ãŠãããã®ãããã ãªããããã®äžã«ååšããããŠããªããPHP 6ãåãã®æ¬ãŸã§åºãŠãããããã ããããPHP 5.6ã®æ¬¡ã®ã¡ãžã£ãŒããŒãžã§ã³ã®ååããPHP 7ãã«æ±ºãŸã£ãçç±ã®ã²ãšã€ãããããªãã
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãPHPã§ã®éçºå šè¬ã§ããããã®æžç±ã玹ä»ããã èªåã®æ¬ãèŒããŠæ¬²ãããšãã人ã¯ããã«ãªã¯ãšã¹ããåºããŠãããã°ã¬ãã¥ãŒã®ããã§è¿œå ããã
PHP ã®ã³ãã¥ããã£ã¯ãèŠæš¡ã倧ãããªãã«ã€ããŠå€æ§åããŠããã ã©ãã®ã³ãã¥ããã£ã§ãæ°ããªä»²éãæè¿ããŠããã è¿æã®ãŠãŒã¶ãŒã°ã«ãŒãã«åå ããããã¡ãã£ãšå€§ããã®ã«ã³ãã¡ã¬ã³ã¹ã«åå ãããããã°ã ãã®ããŒãžã§ç޹ä»ããããšããããã£ãšå€ããåŠã¹ãã ããã IRC ãªã irc.freenode.com ã« #phpc ãšãããã£ã³ãã«ããããã @phpc ã Mastodon ããã©ããŒãããšããã ããããªãšããã«é£ã³èŸŒãã§ãæ°ãã人ãšåºäŒã£ãŠãããããªããšãåŠãã§ãåéã«ãªããã ã StackOverflow ã«ãPHPããã°ã©ããŒåãã®ã³ãã¥ããã£ãããã
倧éœåžã«äœãã§ãããªãããã£ãšè¿å Žã« PHP ãŠãŒã¶ãŒã°ã«ãŒããããã¯ãã ã
è¿å Žã® PHP ãŠãŒã¶ãŒã°ã«ãŒããèŠã€ããã«ã¯ãPHP.ug ã䜿ãã°ããã
ãã以å€ã«ããMeetup.com ã䜿ã£ãŠããããã
ã奜ã¿ã®ãµãŒããšã³ãžã³ (ããšãã° Google ãšã) ã§
php user group near me ã¿ããã«æ€çŽ¢ããŠã¿ããšããã
å°ããªçºãªãããããããããŠãŒã¶ãŒã°ã«ãŒãããªããããããªãã
ã ã£ãããäœãã°ããïŒ
æ°ã ã®ã°ã«ãŒãã®äžã§ããç¹çãã¹ããã®ããããNomadPHP ãš PHPWomen ã ã NomadPHP ã¯ããªã³ã©ã€ã³ã§ã®ããŒãã£ã³ã°ãæ¯æ2åéå¬ããŠããã ãã®ããŒãã£ã³ã°ã§ã¯ãPHP ã³ãã¥ããã£ã®æå人ã«ãããã¬ãŒã³ãè¡ãããŠããã PHPWomen ã¯ãPHP çã®å¥³æ§ãã¿ãŒã²ããã«ãããŠãŒã¶ãŒã°ã«ãŒãã ã£ãããä»ã¯ããã«ãšã©ãŸããªãã ãã倿§æ§ã®ããã³ãã¥ããã£ãç®æãããšãã人ãªãã誰ã§ãåãå ¥ããŠããã PHPWomen ã¯ããµããŒããã¡ã³ã¿ãŒã·ãããæè²ãªã©ã®ãããã¯ãŒã¯ãæäŸããŠããã ãããŠã女æ§ã«ããããããããã§ãã·ã§ãã«ãªç©ºæ°ãåºããããšãç®æããŠããã
äžçååœã§ãå°åã¬ãã«ãããã¯åœã¬ãã«ã®å€§èŠæš¡ãªã«ã³ãã¡ã¬ã³ã¹ãéãããŠããã PHPçã®æå人ãç»å£ããããšãå€ãã®ã§ã圌ãããçŽæ¥åŠã¶ãã£ã³ã¹ã ã
ElePHPant 㯠PHP ãããžã§ã¯ãã®ãã¹ã³ããã ã ããšããšã¯ 1998 幎㫠Vincent Pontier ããã¶ã€ã³ãããã®ãã€ãŸã圌ã¯ãäžçäžã® elePHPant ãã¡ã®ç¶ãªãç¥ã§ããã ãã®çŽ10幎åŸã«ã¯ãããããããã¬ãããã¿ãã§ãããã£ãã ããŸããã¡ãã¡ã®PHPã«ã³ãã¡ã¬ã³ã¹ã§elePHPantãèŠãããããèªåã®PCã®ãã°ã«elePHPantã眮ããŠããPHPéçºè ãå€ãã