Is PHP A Bad Programming Langauge? (Part 2)
Hatred for PHP
ëë¶ë¶ì ì¬ëë¤ì PHPê° íë°©íë PHPì ì² íì ëìíë¤. ê·¸ë ë¤ë©´ 무ìì´ ì«ë¨ ë§ì¸ê°? ì¹ ê²ìì íµí´ì ë¤ìê³¼ ê°ì ê¸ë¤ì ë°ê²¬í ì ììë¤.
- I hate PHP
- Why PHP sucks (for large systems)
- PHP in contrast to Perl
- Experiences of Using PHP in Large Websites
- PHP annoyances
- PHP: A love and hate relationship
- PHP 5 Enterprise Edition?"
ì´ ì¬ëë¤ì PHP를 미ìíê³ ìë¤. ê·¸ ì´ì ë? ì´ë ì ë ì í¨íê³ ì¤ìí ë´ì©ë¤ë§ ë´ ìê°ë¤ê³¼ í¨ê» ì 리í´ë³´ìë¤.
Language Syntax
- No namespaces: ì´ë ì ë ë³µì¡í product를 ë§ë¤ ë, ë¶í¸í ì ì¤ì íëë í¨ì ì´ë¦ì´ë ë³ì ì´ë¦ì´ ì¤ë³µëë ê²ì´ë¤. ì´ ë¬¸ì ì ëí í´ê²°ì± ì¼ë¡, 모ë í¨ìë ë³ìë¤ì ì´ë¦ì prefix를 ë¶ì¬ì namespace를 구ë¶íê±°ë, í´ëì¤ë¥¼ namespaceì ëì©ì¼ë¡ ì¬ì©íë ë°©ë²ì´ ìë¤. Cì ê°ì ë¤ë¥¸ ì¸ì´ë¤ì ìê°í´ë³´ë©´, ë¶ëª í namespaceê° ìì´ë 커ë¤ë íë¡ëí¸ë¥¼ ë§ëë ê²ì ê°ë¥íë¤. íì§ë§, ìµê·¼ì ëì¨ ëë¶ë¶ì ì¸ì´ê° namespace를 ê°ì§ê³ ìììë ë¶êµ¬íê³ PHP 5ì namespaceê° ë¤ì´ê°ì§ ìì ê²ì ìë¹í ìì¬ì´ ë¶ë¶ì´ë¤.
- Arrays are ordered maps: PHPì arrayë 기본ì ì¼ë¡ë key, value pairì ì§í©ì¸ ordered mapì´ë¤. PHPì arrayë ì´ë¬í mapì ì©ë ë¿ë§ ìëë¼ ì¬ë¬ ì©ëë¡ ì ì©ëë¤. integer를 keyë¡ íë ì íµì ì¸ array를 ë¹ë¡¯íì¬, list, queue, stack ë±ì¼ë¡ ì¬ì©ë ì ìë¤. ì´ë¬í ì¬ì¤ì array functionë¤ì ë³´ë©´ ì ì ìë¤. ì¸ì´ê° ë¨ìí´ì§ê³ , ì¬ë¬ê°ì§ ë°ì´í°íì¼ë¡ íì©í¨ì¼ë¡ì¨ ì»ë í¸ë¦¬í ì ë ìê² ì¼ë, íë¡ê·¸ëë¨¸ê° arrayë¼ë ë°ì´í°íì ëí ëª íí 모ë¸ì 머리ìì ê·¸ë¦¬ì§ ëª»íê² íê³ , ëí íë¡ê·¸ëë¨¸ê° ì¤ì를 í ê°ë¥ì±ì ëíë¤ë 측면ìì 그리 ì¢ì§ 못íë¤ê³ ìê°ëë¤. ë§ì ì¸ì´ë¤ì´ arrayì mapìíë¤. íì§ë§, ê·¸ë ë¤ê³ string ë§ì¼ë¡ array를 ì§ìíë ì¸ì´ë¤ì 무ìí ìë ìë¤. ì´ë¤ ë°ì´í°íì ì§ìíëê° íë 문ì ë ì¸ì´ì ë¨ìì±ê³¼ íë¡ê·¸ë머ì í¸ì´ì± ì¬ì´ì trade-off 문ì ë¼ê³ ìê°íë¤. ì´ë¤ ì¸ì´ê° ì´ë¤ ë°ì´í°íì ì§ìíëëë ê·¸ ì¸ì´ì ì² íì ë¬ë¦° ì¼ì´ê³ , ì ëµì´ ìë ê²ì ìëë¤.
- Does not enforce the declaration of variables: PHPë ì ì¸ ëë ì ìëì§ ìì ë³ìì´ëë¼ë ì°¸ì¡°ê° ê°ë¥íë¤. (ë¬¼ë¡ warningì ë°ìíë¤.) "<? print $undeclared_variable; ?>"ë¼ë PHP ì½ëì "print undeclared_variable"ì´ë¼ë Ruby ì½ë를 ì¤íí´ë³´ë¼. PHPììë ì무ë ì§ ìì ë¯ì´ ì¡°ì©í ì¤íëì§ë§ Rubyììë "undefined local variable or method"ë¼ë ìë¬ê° ë°ìíë¤. ë¹êµì ìì íë¡ê·¸ë¨, 모ë, ëë í¨ìììë í° ë¬¸ì ê° ëì§ ìì§ë§, ì½ëê° ê¸¸ì´ì§ê³ ë³µì¡í´ì§ ìë¡ ë²ê·¸ë¥¼ ë°ììí¬ ê°ë¥ì±ì´ ëìì§ê³ , ì´ ë²ê·¸ë¥¼ ë°ê²¬íë ê²ë íë¤ì´ì§ë¤. PHPììë ìµì ì íµí´ ì ìëì§ ìì ë³ì ì ê·¼ì ëí ê²½ê³ ë¥¼ 켤 ì ìë¤.
- No real references: referenceê° ìëë¼ name aliasì¼ ë¿ì´ê¸° ë문ì ì¬ë¬ê°ì§ 문ì ê° ë°ìíë¤. http://www.php.net/manual/en/language.references.php
- No chained method call: $foo->bar()->op() ê°ì 문ë²ì´ ë¶ê°ë¥íìë¤. PHP 5ìì ê°ë¥í´ì¡ë¤.
- No closure, not even anonymous functions
- shortcut behavior: ë¤ë¥¸ ì¸ì´ë¤ê³¼ë ë¬ë¦¬ shortcutì ê²°ê³¼ê°ì´ boolean ê°ì´ë¤.
- call-time pass-by-reference deprecation: PHPìì reference를 ì¬ì©íë 문ë²ì ë§¤ì° ì´ìíë¤. functionì ì ìí ë íë¼ë¯¸í°ì referenceìì ëíë¼ ìë ìê³ , ì¤ì ë¡ í¸ì¶ì ìíí ëë referenceìì ëíë¼ ì ììë¤. ì´ ì ì 기존 PHP 문ë²ì´ ìë¹í ë¶ìì í¨ì ëíë´ë ì¦ê±°ë¼ê³ ë³¼ ì ìë ê² ê°ë¤. (ì를 ë¤ì´, function ì ìì íë¼ë¯¸í°ìë referenceë¼ê³ ëª
ìíê³ , í¸ì¶ ì ìê·ë¨¼í¸ìë referenceë¼ê³ ëª
ìíë¤ë©´ ì´ë»ê² ë ê²ì¸ê°. referenceì reference? ëµì, ê·¸ë¥ referenceë¤.) ê²°êµì í¸ì¶ ì reference ëª
ìë deprecated ëìë¤. 문ì ë ì´ deprecationì¼ë¡ 기존ì í ì ì
ìë ì¼ì í ì ìê² ëì´ë²ë ¸ë¤ë ê²ì´ë¤. PHP 5ììë 모ë variableì reference semanticì ê°ì§ëë¡ ë°ê¾¸ì기 ë문ì ëì´ì ì´ë° 문ì ë ìì ê²ì´ë¤.
Language Implementation
- Template: ëë¶ë¶ì ì¸ì´ë¤ì templatingì ì¸ì´ì 구íê³¼ ë¶ë¦¬í´ëì§ë§, PHPì 구íìë ìì í í©ì³ì ¸ìë¤. ì¹ ì´í리ì¼ì´ì ì ê·ëª¨ê° 커ì§ë©´ì í리ì í ì´ì ê³¼ ë¡ì§ì ë¶ë¦¬ê° ì¤ìí´ì§ ì§ê¸ ìì ìë ê·¸ë¤ì§ ì¢ì§ ìì ë°©ë²ì´ë¤.
- Register Globals: Register Globalsë CGI를 íµí´ ë¤ì´ì¤ë 리íì¤í¸ ë³ìë¤ì ì ì ë³ìë¡ ë§ë¤ì´ì£¼ë 기ë¥ì´ë¤. namespace를 ê°ì§ì§ëª»í PHPë¡ìë ì ì namespace를 ëë½íë ê²ì ìì²ëê² í´ë¡ì´ ì¼ì´ë¤. ë¬¼ë¡ ì¬ê¸°ìë "ì¹ íë¡ê·¸ë머ì í¸ì´"ë¼ë ì¸ì´ê° ë§ë¤ì´ì§ë ë¹ìì ê³ ë ¤ê° ë´ê²¨ìë¤. íì§ë§, ì¹ ì´í리ì¼ì´ì ì ê·ëª¨ê° 커ì§ë©´ì ì´ ê¸°ë¥ì PHP를 í´ì¹ë 기ë¥ì´ ëì´ë²ë ¸ë¤. ìµê·¼ìë ì´ ê¸°ë¥ì ì¼ê³ ë ììë ìµì ì 기본 ê°ì´ "ëë ê²"ì¼ë¡ ë°ëìë¤.
- Bad recursion support: ì¤í¼ë를 ìí´ì stackì ì ì¥íë ë°ì´í°ê° ë§ê¸° ë문ì recursionì ì¢ì§ ìë¤.
- Not thread-safe: 구íì ë³´ë©´ thread safety를 ìí ë ¸ë ¥ì íê³ ìì¼ë, ì¤ì ë¡ thread-safe íì§ë ìë¤.
- Magic quotes: Magic quotesë PHPê° ì¬ì©íë ë°ì´í°ìì í¹ì 문ìë¤ì ìëì¼ë¡ escaping í´ì£¼ë 기ë¥ì´ë¤. íë¡ê·¸ëë¨¸ê° ì§ì íëë¼ë í¬ê² ë¶í¸íì§ ìì ìì ì êµ³ì´ ìëì¼ë¡ í´ì£¼ì´ì ë³µì¡ë를 ì¦ê°ìí¤ë ê²ì ì¢ì§ ìì 기ë¥ì¸ ê² ê°ë¤.
Standard Library/3rd-party Library/Framework
- Inconsistency: PHPìì 기본ì¼ë¡ ì ê³µëë ë¼ì´ë¸ë¬ë¦¬ì ë¤ì´ìë í¨ìë¤ì ì´ë¦ì´ë íë¼ë¯¸í°ë¤ì ìë¹í ì¼ê´ì±ì´ ìë¤. ë¤ì ë§í¬ 참조.
- no crucial XXX library: html parser, MIME builder, WWW library, consistent database API, gd를 ì ì¸í graphics libraryê° ìë¤ë ê²ì ë¶ë§ì¤ë¬ìíê³ ìë¤. PEARìì ì´ë ì ë í´ê²°ë기를 기ëí´ë³¸ë¤.
- no CPAN: íì¬ë PEARê° ê³µìì ì¸ extension repositoryê° ëìì¼ë, CPAN ì²ë¼ ì¬ì©í기ì í¸ë¦¬í ê²ì ìëë¤.
People
- Knowledgeable people are in a serious minority: ì¸êµì PHP 커뮤ëí°ì¡°ì°¨ë ìì¤ì´ ë®ë¤ë ì§ì ì ë§ì´ ë°ê³ ìëë°, ë´ê° 보기ìë êµë´ì PHP 커뮤ëí°ë
í¬ê² ë¤ë¥´ì§ ìì ê² ê°ë¤. ê°ì¥ ì ëª íë¤ë PHPSCHOOLì ê°ë³´ë¼.