diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 000000000..6a81b4c83 --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +2.7.8 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e31d2f7ea..13f84879e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,7 +3,7 @@ 이 문서는 프로젝트의 중심이라고 할 수 있는 영어판 PHP The Right Way 프로젝트에 포함되어 있는 문서를 번역한 것이라서 영어판 프로젝트에 기여하는 방법을 설명하고 있습니다. -[PHP The Right Way](http://phptherightway.com) 를 즐기고 있습니까? +[PHP The Right Way](https://phptherightway.com) 를 즐기고 있습니까? 참여하고 싶습니까? 좋습니다! 도움을 줄 수 있는 많은 방법이 있습니다. 관련된 모두에게 쉽고 효과적인 프로젝트 기여 프로세스를 만들기 위해서 이 문서를 리뷰하는데에 @@ -21,7 +21,7 @@ 교환하는데에 좋은 채널입니다. 하지만 아래의 규칙을 유념해 주십시오. * 개인적인 질문이나 지원을 요청하는데에 이슈 트래커를 **사용하지 마십시오**. (그럴 때는 - [Stack Overflow](http://stackoverflow.com/questions/tagged/php) 나 + [Stack Overflow](https://stackoverflow.com/questions/tagged/php) 나 IRC를 사용해 주십시오) * 이슈의 논점을 흐리거나 논란을 일으키기 위한 도발은 **하지 마십시오**. 논의 주제에 맞게, @@ -37,7 +37,7 @@ 여러분의 작업 결과물을 반영하려면 아래와 같은 과정을 거치면 됩니다. -1. 이 프로젝트를 [Fork](http://help.github.com/fork-a-repo/)하여 생성된 여러분의 +1. 이 프로젝트를 [Fork](https://docs.github.com/en/get-started/quickstart/fork-a-repo)하여 생성된 여러분의 저장소를 clone 한 후에 리모트 저장소를 설정합니다. ```bash @@ -73,8 +73,8 @@ ``` 5. 논리적인 단위로 여러분의 수정 내용을 commit 합니다. [git commit - message guidelines](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)에 따라 메시지를 적절히 작성합니다. 여러분의 커밋을 공개하기 전에, - git의 [interactive rebase](https://help.github.com/articles/about-git-rebase) 기능을 사용해서 커밋을 깔끔하게 정리합니다. + message guidelines](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)에 따라 메시지를 적절히 작성합니다. 여러분의 커밋을 공개하기 전에, + git의 [interactive rebase](https://docs.github.com/en/get-started/using-git/about-git-rebase) 기능을 사용해서 커밋을 깔끔하게 정리합니다. 6. 로컬 저장소에서 upstream 개발 브랜치를 여러분의 토픽 브랜치로 merge(혹은 rebase)합니다. @@ -88,19 +88,19 @@ git push origin ``` -8. 알아보기 쉬운 제목과 설명을 붙여서 [풀 리퀘스트를 보냅니다.](https://help.github.com/articles/using-pull-requests/) +8. 알아보기 쉬운 제목과 설명을 붙여서 [풀 리퀘스트를 보냅니다.](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests) ## 프로젝트에 기여함으로써 동의하게 되는 내용 이 프로젝트의 저장소로 풀 리퀘스트를 보낸다는 것은, 이 프로젝트 관리자가 여러분의 저작 내용을 -[크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 3.0 Unported 라이선스](http://creativecommons.org/licenses/by-nc-sa/3.0/deed.ko)에 따라 +[크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 3.0 Unported 라이선스](https://creativecommons.org/licenses/by-nc-sa/3.0/deed.ko)에 따라 공개하고 사용허가를 한다는 것에 동의한다는 의미가 됩니다. 모든 PHP The Right Way 출판물은 아래에 나열된 출판 방식/위치와 미래에 추가될 수 있는 다른 방식/위치를 포함하여 동일한 내용과 동일한 라이선스에 따라 사용 허가됩니다. -* [phptherightway.com](http://phptherightway.com) +* [phptherightway.com](https://phptherightway.com) * phptherightway.com 을 다른 언어로 번역한 출판물 * [LeanPub: PHP The Right Way](https://leanpub.com/phptherightway/) * "LeanPub: PHP The Right Way"을 다른 언어로 번역한 출판물 @@ -114,7 +114,7 @@ 3. 한 줄 너비는 120글자로 합니다. (역주 : 한국어판의 경우 한 줄 너비를 60자로 쓰려고 합니다.) 4. 예제 코드는 PSR-1 이나 그 이상 버전을 준수해야 합니다. 5. 내용은 [GitHub Flavored Markdown](https://github.github.com/gfm/) 문서 형식으로 작성합니다. -6. [php.net](http://php.net/urlhowto.php) 매뉴얼 같은 외부 사이트 링크를 걸 때에는 가급적 언어 중립적인 주소를 사용합니다. +6. [php.net](https://php.net/urlhowto.php) 매뉴얼 같은 외부 사이트 링크를 걸 때에는 가급적 언어 중립적인 주소를 사용합니다. ## 외부 링크 컨텐트 번역 규칙 diff --git a/_includes/welcome.md b/_includes/welcome.md index 38ed652ba..ea3d1cb00 100644 --- a/_includes/welcome.md +++ b/_includes/welcome.md @@ -17,25 +17,25 @@ PHP를 사용하는 사람들이 그동안 생각해보지 않았을지도 모 _PHP: The Right Way_ 는 다양한 언어로 변역되어 있습니다. -* [English](http://www.phptherightway.com) -* [Español](http://phpdevenezuela.github.io/php-the-right-way) -* [Français](http://eilgin.github.io/php-the-right-way/) -* [Indonesia](http://id.phptherightway.com) -* [Italiano](http://it.phptherightway.com) -* [Polski](http://pl.phptherightway.com) -* [Português do Brasil](http://br.phptherightway.com) +* [English](https://www.phptherightway.com) +* [Español](https://phpdevenezuela.github.io/php-the-right-way) +* [Français](https://eilgin.github.io/php-the-right-way/) +* [Indonesia](https://id.phptherightway.com) +* [Italiano](https://it.phptherightway.com) +* [Polski](https://pl.phptherightway.com) +* [Português do Brasil](https://br.phptherightway.com) * [Română](https://bgui.github.io/php-the-right-way/) -* [Slovenščina](http://sl.phptherightway.com) -* [Srpski](http://phpsrbija.github.io/php-the-right-way/) -* [Türkçe](http://hkulekci.github.io/php-the-right-way/) -* [български](http://bg.phptherightway.com) -* [Русский язык](http://getjump.github.io/ru-php-the-right-way) -* [Українська](http://iflista.github.io/php-the-right-way/) +* [Slovenščina](https://sl.phptherightway.com) +* [Srpski](https://phpsrbija.github.io/php-the-right-way/) +* [Türkçe](https://hkulekci.github.io/php-the-right-way/) +* [български](https://bg.phptherightway.com) +* [Русский язык](https://getjump.github.io/ru-php-the-right-way) +* [Українська](https://iflista.github.io/php-the-right-way/) * [العربية](https://adaroobi.github.io/php-the-right-way/) -* [فارسى](http://novid.github.io/php-the-right-way/) +* [فارسى](https://novid.github.io/php-the-right-way/) * [ภาษาไทย](https://apzentral.github.io/php-the-right-way/) -* [한국어판](http://modernpug.github.io/php-the-right-way) -* [日本語](http://ja.phptherightway.com) +* [한국어판](https://modernpug.github.io/php-the-right-way) +* [日本語](https://ja.phptherightway.com) * [简体中文](https://laravel-china.github.io/php-the-right-way/) * [繁體中文](https://laravel-taiwan.github.io/php-the-right-way) diff --git a/_posts/01-02-01-Use-the-Current-Stable-Version.md b/_posts/01-02-01-Use-the-Current-Stable-Version.md index b3624300e..f5ee1b697 100644 --- a/_posts/01-02-01-Use-the-Current-Stable-Version.md +++ b/_posts/01-02-01-Use-the-Current-Stable-Version.md @@ -1,18 +1,21 @@ --- -title: 안정된 최신버전(8.1)을 사용하세요 +title: 안정된 최신버전(8.2)을 사용하세요 isChild: true anchor: use_the_current_stable_version --- -## 안정된 최신버전(8.1)을 사용하세요 {#use_the_current_stable_version_title} +## 안정된 최신버전(8.2)을 사용하세요 {#use_the_current_stable_version_title} -지금 PHP를 새로 시작하려는 경우, 현재 안정된 버전인 [PHP 8.1][php-release]를 사용하는 것이 좋습니다. PHP 8.x 에는 +지금 PHP를 새로 시작하려는 경우, 현재 안정된 버전인 [PHP 8.2][php-release]를 사용하는 것이 좋습니다. PHP 8.x 에는 [새로운 기능](#language_highlights)이 많이 추가되었습니다. 엔진이 대부분 재작성되어 이전 버전들보다 훨씬 빠릅니다. PHP 8 은 많은 새 기능과 성능 향상이 포함되어 있는 메이저 업데이트입니다. -최신 안정 버전으로 빠르게 업그레이드 하는게 좋습니다. - PHP 7.4 는 [이미 수명을 다했습니다](http://php.net/supported-versions.php). [하위 호환성 문제][php-bc]가 많지는 않기때문에 업그레이드는 간단합니다. 어떤 버전에 함수나 기능이 추가되었는지 잘 모르겠다면 +최신 안정 버전으로 빠르게 업그레이드 하는게 좋습니다. - PHP 7.4 는 [이미 수명을 다했습니다][php-supported]. 하위 호환성 문제[php-bc]가 많이 발생하지 않기 때문에 업그레이드는 쉽습니다 [PHP 8.0][php-bc-80], [PHP 8.1][php-bc-81], [PHP 8.2][php-bc-82]. 어떤 버전에 함수나 기능이 추가되었는지 잘 모르겠다면 [php.net][php-docs] 웹사이트에서 PHP 문서를 확인할 수 있습니다. -[php-release]: http://php.net/downloads.php -[php-docs]: http://php.net/manual/ -[php-bc]: http://php.net/manual/migration81.incompatible.php +[php-release]: https://www.php.net/downloads.php +[php-supported]: https://www.php.net/supported-versions.php +[php-docs]: https://www.php.net/manual/ +[php-bc-80]: https://www.php.net/manual/migration80.incompatible.php +[php-bc-81]: https://www.php.net/manual/migration81.incompatible.php +[php-bc-82]: https://www.php.net/manual/migration82.incompatible.php diff --git a/_posts/01-03-01-Built-in-Web-Server.md b/_posts/01-03-01-Built-in-Web-Server.md index 640de47fb..afbae2b54 100644 --- a/_posts/01-03-01-Built-in-Web-Server.md +++ b/_posts/01-03-01-Built-in-Web-Server.md @@ -16,4 +16,4 @@ PHP 5.4 이상의 버전은 다른 웹서버의 설치와 설정 없이 PHP를 * [내장 웹 서버에 대해서 배우기][cli-server] -[cli-server]: http://php.net/features.commandline.webserver +[cli-server]: https://www.php.net/features.commandline.webserver diff --git a/_posts/01-04-01-Mac-Setup.md b/_posts/01-04-01-Mac-Setup.md index 725253079..561e9b2b1 100644 --- a/_posts/01-04-01-Mac-Setup.md +++ b/_posts/01-04-01-Mac-Setup.md @@ -4,17 +4,17 @@ isChild: true anchor: mac_setup --- -## 맥(Mac)에서 사용하기 {#mac_setup_title} +## 맥(macOS)에서 사용하기 {#mac_setup_title} macOS에는 기본적으로 PHP 가 포함되어 있지만, 최신의 안정된 버전이 포함되어 있지는 않습니다. OS X에 PHP를 설치하기 위해선 여러가지 방법이 있습니다. ### Homebrew를 사용하여 설치하기 [Homebrew]는 macOS에서 PHP와 다양한 익스텐션을 쉽게 설치할 수 있도록 도와주는 패키지 관리자 도구입니다. -Homebrew core 저장소는 PHP 5.6, 7.0, 7.1, 7.2, 7.3, 7.4, 8.0, 8.1을 위한 "formulae"를 포함하고 있습니다. 아래 커맨드로 최신 버전을 설치하세요. +Homebrew core 저장소는 PHP 7.4, 8.0, 8.1 and PHP 8.2을 위한 "formulae"를 포함하고 있습니다. 아래 커맨드로 최신 버전을 설치하세요. ``` -brew install php@8.1 +brew install php@8.2 ``` `PATH` @@ -25,30 +25,30 @@ PHP 버전을 전환할 수 있는 또 다른 방법은 `unlink`, `link`로 원 ``` brew unlink php -brew link --overwrite php@8.0 +brew link --overwrite php@8.1 ``` ``` brew unlink php -brew link --overwrite php@8.1 +brew link --overwrite php@8.2 ``` ### Macports를 사용하여 설치하기 -[MacPorts]는 OS X에서 커맨드라인이나 X11, Aqua기반의 오픈소스 소프트웨어를 컴파일하고, 설치하고, 업그레이드하는 +[MacPorts]는 macOS에서 커맨드라인이나 X11, Aqua기반의 오픈소스 소프트웨어를 컴파일하고, 설치하고, 업그레이드하는 작업을 간편하게 할 수 있는 시스템을 설계하는 오픈소스 커뮤니티 프로젝트입니다. MacPorts는 미리 컴파일된 바이너리를 지원하여 의존성 패키지들을 설치할 때마다 매번 재컴파일하지 않아도 됩니다. 그래서 시스템에 어떠한 패키지도 갖고 있지 않다면 굉장한 시간을 절약할 수 있습니다. -`port install`이라는 커맨드를 이용하여 `php54`, `php55`, `php56`, `php70`, `php71`, `php72`, `php73`, `php74`, `php80`, `php81` 을 설치할 수 있습니다. 아래처럼 말이죠. +`port install`이라는 커맨드를 이용하여 `php54`, `php55`, `php56`, `php70`, `php71`, `php72`, `php73`, `php74`, `php80`, `php81`, `php82` 를 설치할 수 있습니다. 아래처럼 말이죠. sudo port install php74 - sudo port install php81 + sudo port install php82 그리고 `select` 커맨드를 이용하여 활성화된 PHP 버전을 변경할 수 있습니다. - sudo port select --set php php81 + sudo port select --set php php82 ### phpbrew를 사용하여 설치하기 @@ -62,7 +62,7 @@ PHP를 요구하지만, 가상 머신은 사용하고 있지 않을때 매우 ### 소스 컴파일하기 -설치한 PHP 버전을 조작할 수 있는 또 다른 옵션으로는 [직접 설치][mac-compile]가 있습니다. 이때 애플 맥 개발자 센터에서 +설치한 PHP 버전을 조작할 수 있는 또 다른 옵션으로는 [직접 설치][mac-compile]가 있습니다. 이때 애플 개발자 센터에서 내려받기 가능한 [Xcode][xcode-gcc-substitution] 또는 [XCode를 위한 커맨드라인 도구]["Command Line Tools for XCode"]를 설치하셔야 합니다. @@ -73,11 +73,10 @@ PHP를 요구하지만, 가상 머신은 사용하고 있지 않을때 매우 설치됩니다. 그러나 쉽게 설치할 수 있는 만큼 유연하지 못한 단점이 존재합니다. [Homebrew]: https://brew.sh/ -[Homebrew PHP]: https://github.com/Homebrew/homebrew-php#installation [MacPorts]: https://www.macports.org/install.php [phpbrew]: https://github.com/phpbrew/phpbrew -[php-osx.liip.ch]: https://php-osx.liip.ch/ -[mac-compile]: https://secure.php.net/install.macosx.compile +[php-osx.liip.ch]: https://web.archive.org/web/20220505163210/https://php-osx.liip.ch/ +[mac-compile]: https://www.php.net/install.macosx.compile [xcode-gcc-substitution]: https://github.com/kennethreitz/osx-gcc-installer ["Command Line Tools for XCode"]: https://developer.apple.com/downloads [apache]: https://httpd.apache.org/ diff --git a/_posts/01-06-01-linux-Setup.md b/_posts/01-06-01-linux-Setup.md new file mode 100644 index 000000000..df69d4d3f --- /dev/null +++ b/_posts/01-06-01-linux-Setup.md @@ -0,0 +1,69 @@ +--- +title: 리눅스(Linux)에서 사용하기 +isChild: true +anchor: windows_setup +--- + +## 리눅스(Linux)에서 사용하기 {#linux_setup_title} + +대부분의 GNU/Linux 배포판에는 공식 리포지토리에서 사용할 수 있는 PHP가 함께 제공되지만, 이러한 패키지는 일반적으로 현재 안정 버전보다 약간 뒤쳐져 있습니다. 이러한 배포판에서 최신 PHP 버전을 얻는 방법에는 여러 가지가 있습니다. 예를 들어 우분투와 데비안 기반 GNU/Linux 배포판의 경우, 기본 패키지를 대체할 수 있는 가장 좋은 방법은 [Ondřej Surý][Ondrej Sury Blog]가 우분투의 개인 패키지 아카이브(PPA)와 데비안의 DPA/bikeshed를 통해 제공하고 유지 관리하는 것입니다. 아래에서 각각에 대한 지침을 확인하십시오. 즉, 언제든지 컨테이너를 사용하고 PHP 소스 코드를 컴파일하는 등의 작업을 할 수 있습니다. + +### 우분투 기반 배포판 + +우분투 배포판의 경우, [PPA by Ondřej Surý][Ondrej Sury PPA]는 지원되는 PHP 버전들과 많은 PECL 확장들을 제공합니다. 이 PPA를 당신의 시스템에 추가하려면 터미널에서 다음 단계를 수행하십시오: + +1. 먼저 다음 명령을 사용하여 당신의 시스템 소프트웨어 소스에 PPA를 추가합니다: + + ```bash + sudo add-apt-repository ppa:ondrej/php + ``` + +2. PPA를 추가한 후 시스템의 패키지 목록을 업데이트합니다: + + ```bash + sudo apt update + ``` + +이렇게 하면 시스템이 PPA에서 사용 가능한 최신 PHP 패키지에 액세스하고 설치할 수 있습니다. + +#### 데비안 기반 배포판 + +데비안 기반 배포판의 경우, Ondřej Surý는 [bikeshed][bikeshed] (데비안에서 PPA에 해당하는 것)도 제공합니다. 시스템에 bikeshed를 추가하고 업데이트하려면 다음 단계를 따르세요: + +1. 루트 액세스 권한이 있는지 확인합니다. 그렇지 않은 경우 다음 명령에 `sudo`를 사용해야 할 수 있습니다. + +2. 시스템의 패키지 목록을 업데이트합니다: + + ```bash + sudo apt-get update + ``` + +3. `lsb-release`, `ca-certificates`, `curl`을 설치합니다: + + ```bash + sudo apt-get -y install lsb-release ca-certificates curl + ``` + +4. 리포지토리에 대한 서명 키를 다운로드합니다: + + ```bash + sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg + ``` + +5. 시스템의 소프트웨어 소스에 리포지토리를 추가합니다: + + ```bash + sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list' + ``` + +6. 마지막으로 시스템의 패키지 목록을 다시 업데이트합니다: + + ```bash + sudo apt-get update + ``` + +이 단계를 수행하면 시스템이 bikeshed에서 최신 PHP 패키지를 설치할 수 있습니다. + +[Ondrej Sury Blog]: https://deb.sury.org/ +[Ondrej Sury PPA]: https://launchpad.net/~ondrej/+archive/ubuntu/php +[bikeshed]: https://packages.sury.org/php/ \ No newline at end of file diff --git a/_posts/01-06-01-Common-Directory-Structure.md b/_posts/01-07-01-Common-Directory-Structure.md similarity index 97% rename from _posts/01-06-01-Common-Directory-Structure.md rename to _posts/01-07-01-Common-Directory-Structure.md index a88d9bc1c..b961e412e 100644 --- a/_posts/01-06-01-Common-Directory-Structure.md +++ b/_posts/01-07-01-Common-Directory-Structure.md @@ -14,6 +14,6 @@ anchor: common_directory_structure [Paul M. Jones]는 PHP 영역에서 수만 가지 github 프로젝트의 일반적인 관행에 대한 환상적인 연구를 수행했습니다. 그는 이 연구를 기반으로 표준 파일 및 디렉토리 구조 인 [Standard PHP Package Skeleton]을 컴파일했습니다. 이 디렉토리 구조에서 `DocumentRoot`는 `public/`을 가리키고, 단위 테스트는 `tests/` 디렉토리에 있어야하고, [composer]가 설치 한 타사 라이브러리는 `vendor/` 디렉토리에 있어야합니다. 다른 파일과 디렉토리의 경우 [표준 PHP 패키지 스켈레톤]을 준수하는 것이 프로젝트의 기여자들에게도 도움 될 것입니다. -[Paul M. Jones]: http://paul-m-jones.com/ +[Paul M. Jones]: https://paul-m-jones.com/ [Standard PHP Package Skeleton]: https://github.com/php-pds/skeleton [Composer]: /#composer_and_packagist diff --git a/_posts/02-01-01-Code-Style-Guide.md b/_posts/02-01-01-Code-Style-Guide.md index f9dd6e68f..3f951041a 100644 --- a/_posts/02-01-01-Code-Style-Guide.md +++ b/_posts/02-01-01-Code-Style-Guide.md @@ -10,7 +10,7 @@ PHP 커뮤니티는 매우 거대하고, 수많은 라이브러리와 프레임 수월하게 하려면, 가능한한 공통적인 코드 스타일을 적용하는 일은 매우 중요합니다. [프레임워크 운용 그룹(Framework Interoperability Group)][fig]에서는 [PSR-1][psr1], [PSR-12][psr12], -[PSR-4][psr4]라는 권장 스타일 가이드를 발표했습니다. 이들 가이드는 Drupal, Zend, Symfony, Laravel, CakePHP, phpBB, AWS SDK, +[PSR-4][psr4], [PER Coding Style][per-cs]라는 권장 스타일 가이드를 발표했습니다. 이들 가이드는 Drupal, Zend, Symfony, Laravel, CakePHP, phpBB, AWS SDK, FuelPHP, Lithium 등의 프로젝트에서 적용하기 시작한 스타일 규칙입니다. 여러분의 프로젝트에서 이러한 스타일 가이드를 사용할 수도있고, 혹은 여러분 자신만의 스타일을 그대로 사용할 수도 있습니다. @@ -21,6 +21,7 @@ FuelPHP, Lithium 등의 프로젝트에서 적용하기 시작한 스타일 규 * [읽을거리: PSR-1][psr1] * [읽을거리: PSR-12][psr12] * [읽을거리: PSR-4][psr4] +* [읽을거리: PER Coding Style][per-cs] * [읽을거리: PEAR 코딩 표준][pear-cs] * [읽을거리: Symfony 코딩 표준][symfony-cs] @@ -58,9 +59,10 @@ PHP_CodeSniffer 가 있다면, 확인된 코드 레이아웃 문제를 [PHP Code [psr1]: https://www.php-fig.org/psr/psr-1/ [psr12]: https://www.php-fig.org/psr/psr-12/ [psr4]: https://www.php-fig.org/psr/psr-4/ +[per-cs]: https://www.php-fig.org/per/coding-style/ [pear-cs]: https://pear.php.net/manual/en/standards.php [symfony-cs]: https://symfony.com/doc/current/contributing/code/standards.html -[phpcs]: https://pear.php.net/package/PHP_CodeSniffer/ +[phpcs]: https://github.com/squizlabs/PHP_CodeSniffer [phpcbf]: https://github.com/squizlabs/PHP_CodeSniffer/wiki/Fixing-Errors-Automatically [st-cs]: https://github.com/benmatselby/sublime-phpcs [phpcsfixer]: https://cs.symfony.com/ diff --git a/_posts/03-02-01-Programming-Paradigms.md b/_posts/03-02-01-Programming-Paradigms.md index 5afdedbd3..f036e00fa 100644 --- a/_posts/03-02-01-Programming-Paradigms.md +++ b/_posts/03-02-01-Programming-Paradigms.md @@ -51,14 +51,14 @@ PHP는 Reflection API와 특수 매서드(Magic Method)같은 메커니즘을 * [읽을거리: Overloading][overloading] -[oop]: https://secure.php.net/language.oop5 -[traits]: https://secure.php.net/language.oop5.traits -[anonymous-functions]: https://secure.php.net/functions.anonymous -[closure-class]: https://secure.php.net/class.closure +[oop]: https://www.php.net/language.oop5 +[traits]: https://www.php.net/language.oop5.traits +[anonymous-functions]: https://www.php.net/functions.anonymous +[closure-class]: https://www.php.net/class.closure [closures-rfc]: https://wiki.php.net/rfc/closures -[callables]: https://secure.php.net/language.types.callable -[call-user-func-array]: https://secure.php.net/function.call-user-func-array -[magic-methods]: https://secure.php.net/language.oop5.magic -[reflection]: https://secure.php.net/intro.reflection -[overloading]: https://secure.php.net/language.oop5.overloading +[callables]: https://www.php.net/language.types.callable +[call-user-func-array]: https://www.php.net/function.call-user-func-array +[magic-methods]: https://www.php.net/language.oop5.magic +[reflection]: https://www.php.net/intro.reflection +[overloading]: https://www.php.net/language.oop5.overloading diff --git a/_posts/03-03-01-Namespaces.md b/_posts/03-03-01-Namespaces.md index 7fb5eabf1..ffaab3511 100644 --- a/_posts/03-03-01-Namespaces.md +++ b/_posts/03-03-01-Namespaces.md @@ -30,6 +30,6 @@ _네임스페이스_ 기능은 이런 문제를 해결할 수 있습니다. PHP * [읽을거리: PSR-4][psr4] -[namespaces]: https://secure.php.net/language.namespaces +[namespaces]: https://www.php.net/language.namespaces [psr0]: https://www.php-fig.org/psr/psr-0/ [psr4]: https://www.php-fig.org/psr/psr-4/ diff --git a/_posts/03-04-01-Standard-PHP-Library.md b/_posts/03-04-01-Standard-PHP-Library.md index 1b5e46343..4c306c81a 100644 --- a/_posts/03-04-01-Standard-PHP-Library.md +++ b/_posts/03-04-01-Standard-PHP-Library.md @@ -14,5 +14,5 @@ anchor: standard_php_library * [링크드인에 있는 SPL 영상강의(유료)][linkedin] -[spl]: https://secure.php.net/book.spl +[spl]: https://www.php.net/book.spl [linkedin]: https://www.linkedin.com/learning/learning-the-standard-php-library?trk=lynda_redirect_learning diff --git a/_posts/03-05-01-Command-Line-Interface.md b/_posts/03-05-01-Command-Line-Interface.md index 9f8e46613..482706807 100644 --- a/_posts/03-05-01-Command-Line-Interface.md +++ b/_posts/03-05-01-Command-Line-Interface.md @@ -54,9 +54,9 @@ Hello, world * [알아보기: 커맨드라인 PHP 실행하기][php-cli] -[phpinfo]: https://secure.php.net/function.phpinfo -[cli-options]: https://secure.php.net/features.commandline.options -[argc]: https://secure.php.net/reserved.variables.argc -[argv]: https://secure.php.net/reserved.variables.argv +[phpinfo]: https://www.php.net/function.phpinfo +[cli-options]: https://www.php.net/features.commandline.options +[argc]: https://www.php.net/reserved.variables.argc +[argv]: https://www.php.net/reserved.variables.argv [exit-codes]: https://www.gsp.com/cgi-bin/man.cgi?section=3&topic=sysexits -[php-cli]: https://secure.php.net/features.commandline.options +[php-cli]: https://www.php.net/manual/en/features.commandline.php diff --git a/_posts/03-06-01-XDebug.md b/_posts/03-06-01-XDebug.md index 0bf906d9b..ef1ff7fb5 100644 --- a/_posts/03-06-01-XDebug.md +++ b/_posts/03-06-01-XDebug.md @@ -33,7 +33,7 @@ php_value xdebug.remote_port 9000 GUI가 제공되는 디버거를 사용하면 아주 쉽게 코드를 한 줄씩 실행해보거나 변수 값을 조사하고 실행 중에 코드를 실행시켜볼 수 있습니다. 많은 IDE가 Xdebug를 이용한 시각적인 디버깅을 내장하고 있거나 플러그인 방식으로 제공합니다. -MacGDBp는 IDE없이 독자적으로 동작하는, 오픈소스로 제공되는 Mac 용 무료 GUI 디버거입니다. +MacGDBp는 IDE없이 독자적으로 동작하는, 오픈소스로 제공되는 macOS 용 무료 GUI 디버거입니다. * [알아보기: XDebug][xdebug-docs] * [알아보기: MacGDBp][macgdbp-install] diff --git a/_posts/04-03-01-PEAR.md b/_posts/04-03-01-PEAR.md index 3f97b14ce..07b510f6b 100644 --- a/_posts/04-03-01-PEAR.md +++ b/_posts/04-03-01-PEAR.md @@ -39,19 +39,28 @@ pear install foo ### PEAR 의존관계를 Composer로 관리하기 [Composer][5]를 이미 사용하고 있을 때 PEAR 패키지도 설치하고 싶다면, PEAR 패키지 의존관계를 관리하는 데에 Composer를 -사용할 수도 있습니다. 아래 예제는 `pear2.php.net`에서 코드를 설치하는 예제입니다. +사용할 수도 있습니다. PEAR 리포지토리는 더 이상 Composer 버전 2에서 직접 지원되지 않으므로 PEAR 패키지를 설치하려면 리포지토리를 수동으로 추가해야 합니다: {% highlight json %} { "repositories": [ { - "type": "pear", - "url": "https://pear2.php.net" + "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": { - "pear-pear2/PEAR2_Text_Markdown": "*", - "pear-pear2/PEAR2_HTTP_Request": "*" + "pear2/pear2-http-request": "*" + }, + "autoload": { + "psr-4": {"PEAR2\\HTTP\\": "vendor/pear2/pear2-http-request/src/HTTP/"} } } {% endhighlight %} @@ -59,23 +68,27 @@ pear install foo `"repositories"` 섹션은 Composer가 PEAR 저장소를 "initialise"(PEAR 용어로는 "discover")해야 한다는 것을 알려주는 역할을 합니다. 그리고 `require` 섹션은 패키지 이름을 아래와 같은 형식으로 정의합니다. -> pear-채널/패키지 +> pear-channel/package "pear"라는 접두사는 혹시 모를 충돌을 방지하기 위해서 하드코딩된 것입니다. 예를들어 pear 채널 이름이 다른 패키지 벤더 이름과 동일하다면 짧은 이름이나 전체 URL을 사용하여 채널을 지정할 수 있습니다. 이 코드를 설치하면 vendor 디렉토리에 설치가 되어 Composer 오토로더(autoloader)에 의해 자동적으로 로드될 수 있습니다. -> vendor/pear-pear2.php.net/PEAR2_HTTP_Request/pear2/HTTP/Request.php +> vendor/pear2/pear2-http-request/pear2/HTTP/Request.php 이 PEAR 패키지를 사용하려면 아래와 같이 간단히 할 수 있습니다. {% highlight php %} +* +* [https://designpatternsphp.readthedocs.io/](https://designpatternsphp.readthedocs.io/en/latest/) ([PDF download](https://www.computer-pdf.com/web-programming/php/924-tutorial-designpatternsphp-documentation.html)) (역주 : 그리고 또 놀랍게도 한국어 번역 페이지가 존재합니다!) - +* diff --git a/_posts/05-05-01-PHP-and-UTF8.md b/_posts/05-05-01-PHP-and-UTF8.md index 96c8ae0fb..1c9c4d628 100644 --- a/_posts/05-05-01-PHP-and-UTF8.md +++ b/_posts/05-05-01-PHP-and-UTF8.md @@ -49,7 +49,7 @@ HTML 코드, SQL 쿼리, PHP 코드 등 웹 어플리케이션의 모든 레벨 사용하면, `mbstring` 익스텐션이 활성화되어 있으면 그쪽 함수들을 사용하고 활성화되어 있지 않으면 일반 문자열 함수가 대신 호출되는 식으로 동작하게 만들어줍니다. -[Multibyte String Extension]: https://secure.php.net/book.mbstring +[Multibyte String Extension]: https://www.php.net/book.mbstring [symfony/polyfill-mbstring]: https://packagist.org/packages/symfony/polyfill-mbstring ### 데이터베이스 수준에서의 UTF-8 @@ -149,19 +149,19 @@ header('Content-Type: text/html; charset=UTF-8'); // 만일 기본 문자셋을 ### 더 읽어보기 -* [PHP Manual: String Operations](https://secure.php.net/language.operators.string) -* [PHP Manual: String Functions](https://secure.php.net/ref.strings) - * [`strpos()`](https://secure.php.net/function.strpos) - * [`strlen()`](https://secure.php.net/function.strlen) - * [`substr()`](https://secure.php.net/function.substr) -* [PHP Manual: Multibyte String Functions](https://secure.php.net/ref.mbstring) - * [`mb_strpos()`](https://secure.php.net/function.mb-strpos) - * [`mb_strlen()`](https://secure.php.net/function.mb-strlen) - * [`mb_substr()`](https://secure.php.net/function.mb-substr) - * [`mb_internal_encoding()`](https://secure.php.net/function.mb-internal-encoding) - * [`mb_http_output()`](https://secure.php.net/function.mb-http-output) - * [`htmlentities()`](https://secure.php.net/function.htmlentities) - * [`htmlspecialchars()`](https://secure.php.net/function.htmlspecialchars) +* [PHP Manual: String Operations](https://www.php.net/language.operators.string) +* [PHP Manual: String Functions](https://www.php.net/ref.strings) + * [`strpos()`](https://www.php.net/function.strpos) + * [`strlen()`](https://www.php.net/function.strlen) + * [`substr()`](https://www.php.net/function.substr) +* [PHP Manual: Multibyte String Functions](https://www.php.net/ref.mbstring) + * [`mb_strpos()`](https://www.php.net/function.mb-strpos) + * [`mb_strlen()`](https://www.php.net/function.mb-strlen) + * [`mb_substr()`](https://www.php.net/function.mb-substr) + * [`mb_internal_encoding()`](https://www.php.net/function.mb-internal-encoding) + * [`mb_http_output()`](https://www.php.net/function.mb-http-output) + * [`htmlentities()`](https://www.php.net/function.htmlentities) + * [`htmlspecialchars()`](https://www.php.net/function.htmlspecialchars) * [Stack Overflow: What factors make PHP Unicode-incompatible?](https://stackoverflow.com/questions/571694/what-factors-make-php-unicode-incompatible) * [Stack Overflow: Best practices in PHP and MySQL with international strings](https://stackoverflow.com/questions/140728/best-practices-in-php-and-mysql-with-international-strings) * [How to support full Unicode in MySQL databases](https://mathiasbynens.be/notes/mysql-utf8mb4) diff --git a/_posts/05-06-01-Internationalization-and-Localization.md b/_posts/05-06-01-Internationalization-and-Localization.md index 06046b9e1..4495c91e2 100644 --- a/_posts/05-06-01-Internationalization-and-Localization.md +++ b/_posts/05-06-01-Internationalization-and-Localization.md @@ -42,7 +42,7 @@ Gettext 를 보조하는 방식이나, 직접 i18n 을 구현한 다른 라이 - [aura/intl][aura-intl]: I18N 도구를 제공하는데, 특히 패키지 지향적인 지역별 메시지 번역에 집중되어 있습니다. 메시지는 배열 형식으로 관리합니다. 메시지 추출기는 제공하지 않지만 `intl` 확장을 이용해서 (복수형 메시지를 포함한) 고급 메시지 포매팅 기능을 제공합니다. -- [oscarotero/Gettext][oscarotero]: Gettext 를 객체지향 인터페이스로 지원합니다. 향상된 헬퍼 함수들, +- [php-gettext/Gettext][php-gettext]: Gettext 를 객체지향 인터페이스로 지원합니다. 향상된 헬퍼 함수들, `gettext` 커맨드가 자체적으로는 지원하지 못하는 것을 포함한 여러가지 파일 포맷을 지원하는 강력한 메시지 추출기를 가지고 있습니다. 그리고 `.mo/.po` 같은 다른 파일 포맷으로 내보내기도 할 수 있습니다. - [symfony/translation][symfony]: 많은 종류의 파일 포맷을 지원하지만 조금 장황한 XLIFF 포맷을 권장합니다. @@ -387,14 +387,14 @@ Poedit의 "Catalog > Properties > Source keywords" 를 통해서 설정할 수 * [Wikipedia: i18n and l10n](https://en.wikipedia.org/wiki/Internationalization_and_localization) * [Wikipedia: Gettext](https://en.wikipedia.org/wiki/Gettext) * [LingoHub: PHP internationalization with gettext tutorial][lingohub] -* [PHP Manual: Gettext](https://secure.php.net/manual/book.gettext.php) +* [PHP Manual: Gettext](https://www.php.net/manual/book.gettext.php) * [Gettext Manual][manual] [Poedit]: https://poedit.net [poedit_download]: https://poedit.net/download [lingohub]: https://lingohub.com/blog/2013/07/php-internationalization-with-gettext-tutorial/ [lingohub_plurals]: https://lingohub.com/blog/2013/07/php-internationalization-with-gettext-tutorial/#Plurals -[plural]: http://docs.translatehouse.org/projects/localization-guide/en/latest/l10n/pluralforms.html +[plural]: https://docs.translatehouse.org/projects/localization-guide/en/latest/l10n/pluralforms.html [gettext]: https://en.wikipedia.org/wiki/Gettext [manual]: https://www.gnu.org/software/gettext/manual/gettext.html [639-1]: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes @@ -402,17 +402,17 @@ Poedit의 "Catalog > Properties > Source keywords" 를 통해서 설정할 수 [rare]: https://www.gnu.org/software/gettext/manual/gettext.html#Rare-Language-Codes [func_format]: https://www.gnu.org/software/gettext/manual/gettext.html#Language-specific-options [aura-intl]: https://github.com/auraphp/Aura.Intl -[oscarotero]: https://github.com/oscarotero/Gettext +[php-gettext]: https://github.com/php-gettext/Gettext [symfony]: https://symfony.com/components/Translation [laminas]: https://docs.laminas.dev/laminas-i18n/ [laravel]: https://laravel.com/docs/master/localization [yii]: https://www.yiiframework.com/doc/guide/2.0/en/tutorial-i18n -[intl]: https://secure.php.net/manual/intro.intl.php +[intl]: https://www.php.net/manual/intro.intl.php [ICU project]: https://icu.unicode.org/ [symfony-keys]: https://symfony.com/doc/current/translation.html#using-real-or-keyword-messages -[sprintf]: https://secure.php.net/manual/function.sprintf.php -[func]: https://secure.php.net/manual/function.gettext.php -[n_func]: https://secure.php.net/manual/function.ngettext.php -[d_func]: https://secure.php.net/manual/function.dgettext.php -[dn_func]: https://secure.php.net/manual/function.dngettext.php +[sprintf]: https://www.php.net/manual/function.sprintf.php +[func]: https://www.php.net/manual/function.gettext.php +[n_func]: https://www.php.net/manual/function.ngettext.php +[d_func]: https://www.php.net/manual/function.dgettext.php +[dn_func]: https://www.php.net/manual/function.dngettext.php diff --git a/_posts/06-02-01-Basic-Concept.md b/_posts/06-02-01-Basic-Concept.md index e874fd20c..6d7cde023 100644 --- a/_posts/06-02-01-Basic-Concept.md +++ b/_posts/06-02-01-Basic-Concept.md @@ -30,6 +30,7 @@ class MysqlAdapter {} {% endhighlight %} 아래와 같이 리팩터링하여 의존성 주입을 사용하도록 하면 의존 관계를 약화시킬 수 있습니다. +여기서는 생성자에 종속성을 주입하고 [constructor property promotion][php-constructor-promotion]을 사용하여 클래스 전체에서 프로퍼티로 사용할 수 있도록 합니다: {% highlight php %} adapter = $adapter; } } @@ -51,3 +49,5 @@ class MysqlAdapter {} 이제 `Database`는 내부에서 직접 의존 관계에 있는 클래스 인스턴스를 생성하지 않고, 외부에서 전달받게 되었습니다. 어댑터 인스턴스를 인자로 전달받는 메소드를 만들어서 해당 어댑터를 사용하도록 설정하는 방식을 적용하거나, `$adapter` 프로퍼티를 `public` 으로 만들어서 프로퍼티를 직접 설정하게 할 수도 있을 것입니다. + +[php-constructor-promotion]: https://www.php.net/manual/en/language.oop5.decon.php#language.oop5.decon.constructor.promotion \ No newline at end of file diff --git a/_posts/06-03-01-Complex-Problem.md b/_posts/06-03-01-Complex-Problem.md index 520fca147..ccdd78fc8 100644 --- a/_posts/06-03-01-Complex-Problem.md +++ b/_posts/06-03-01-Complex-Problem.md @@ -80,11 +80,8 @@ namespace Database; class Database { - protected $adapter; - - public function __construct(AdapterInterface $adapter) + public function __construct(protected AdapterInterface $adapter) { - $this->adapter = $adapter; } } diff --git a/_posts/07-01-01-Databases.md b/_posts/07-01-01-Databases.md index cef7b8435..2b78d71dd 100644 --- a/_posts/07-01-01-Databases.md +++ b/_posts/07-01-01-Databases.md @@ -15,6 +15,6 @@ PHP 어플리케이션에서 _단 하나의_ 데이터베이스만을 사용하 마련이죠. -[mysqli]: https://secure.php.net/mysqli -[pgsql]: https://secure.php.net/pgsql -[mssql]: https://secure.php.net/mssql +[mysqli]: https://www.php.net/mysqli +[pgsql]: https://www.php.net/pgsql +[mssql]: https://www.php.net/mssql diff --git a/_posts/07-02-01-Databases_MySQL.md b/_posts/07-02-01-Databases_MySQL.md index c0fe5f62d..dcd7f1c1e 100644 --- a/_posts/07-02-01-Databases_MySQL.md +++ b/_posts/07-02-01-Databases_MySQL.md @@ -11,12 +11,12 @@ PHP의 [MySQL][mysql]익스텐션은 아주 오래되었고, 다음 두 익스 - [mysqli] - [pdo] -[mysql] 익스텐션 개발은 오래전에 개발 중단되었을 뿐만 아니라, [PHP 5.5.0 부터는 공식적으로 사용을 권장하지 않는 상태(deprecated)][mysql_deprecated]였고, **[PHP 7.0에서는 공식적으로 제거][mysql_removed]** 되었습니다. +[mysql] 익스텐션 개발은 오래전에 개발 중단되었을 뿐만 아니라, **[PHP 7.0에서는 공식적으로 제거][mysql_removed]** 되었습니다. 어떤 모듈을 사용하고 있는지 `php.ini`을 뒤져보는 수고를 하지 않는 한가지 방법은, `mysql_*`을 여러분이 사용하는 에디터에서 검색해보는 것입니다. 만약 `mysql_connect()`나 `mysql_query()`와 같은 함수가 나온다면, `mysql`을 사용하고 있는 것입니다. -PHP 7.x을 아직 사용하지 않더라도 가능한 빨리 익스텐션 업그레이드를 고려하지 않으면, PHP 7.x 업그레이드를 해야할 때에 굉장히 고생하게 됩니다. +PHP 7.x 이상 버전을 아직 사용하지 않더라도 가능한 빨리 익스텐션 업그레이드를 고려하지 않으면, PHP 업그레이드를 해야할 때에 굉장히 고생하게 됩니다. 가장 좋은 방법은, 나중에 서두르게 되지 않도록 여러분의 개발 일정에 맞춰서 mysql을 사용하던 것을 [mysqli]나 [PDO]로 변경하는 것입니다. **[mysql]에서 [mysqli]로 업그레이드할때에는 단순히 `mysql_*`을 찾아서 `mysqli_*`로 치환하는 게으른 업그레이드 가이드를 조심하세요. @@ -25,10 +25,10 @@ PHP 7.x을 아직 사용하지 않더라도 가능한 빨리 익스텐션 업그 * [MySQLi Prepared Statements][mysqli_prepared_statements] * [PHP: MySQL을 위한 API 선택][mysql_api] -[mysql]: https://secure.php.net/mysqli -[mysql_deprecated]: https://secure.php.net/migration55.deprecated -[mysql_removed]: https://secure.php.net/manual/migration70.removed-exts-sapis.php -[mysqli]: https://secure.php.net/mysqli -[pdo]: https://secure.php.net/pdo -[mysql_api]: https://secure.php.net/mysqlinfo.api.choosing +[mysql]: https://www.php.net/mysqli +[mysql_deprecated]: https://www.php.net/migration55.deprecated +[mysql_removed]: https://www.php.net/manual/migration70.removed-exts-sapis.php +[mysqli]: https://www.php.net/mysqli +[pdo]: https://www.php.net/pdo +[mysql_api]: https://www.php.net/mysqlinfo.api.choosing [mysqli_prepared_statements]: MySQLi Prepared Statements diff --git a/_posts/07-03-01-Databases_PDO.md b/_posts/07-03-01-Databases_PDO.md index 2e24f1f47..13b5e2412 100644 --- a/_posts/07-03-01-Databases_PDO.md +++ b/_posts/07-03-01-Databases_PDO.md @@ -60,7 +60,7 @@ $stmt->execute(); 먼저 [데이터를 필터링](#_data_filtering)하고, 다른 위험한 요소(HTML 태그, 자바스크립트 등)를 제거하는 것은 INSERT나 UPDATE와 같은 쓰기 작업에 특히 중요합니다. PDO는 여러분이 작성하는 어플리케이션이 아니라, SQL에서만 위험한 요소를 제거합니다. -* [알아보기: PDO][Learn about PDO] +* [알아보기: PDO][Learn about PDO][pdo] 데이터베이스 연결을 사용할 때에는 데이터베이스 연결을 잘 닫는데 신경쓰지 않았을 경우에 한 번 열어 둔 데이터베이스 연결이 닫히지 않아서 더이상 새로운 연결을 할 수 없는 경우가 발생하기도 합니다. PDO를 사용하면 PDO 객체가 파괴될 때 @@ -70,7 +70,6 @@ $stmt->execute(); * [알아보기: PDO 연결][Learn about PDO connections] -[pdo]: https://secure.php.net/pdo -[SQL Injection]: http://wiki.hashphp.org/Validation -[Learn about PDO]: https://secure.php.net/book.pdo -[Learn about PDO connections]: https://secure.php.net/pdo.connections +[pdo]: https://www.php.net/pdo +[SQL Injection]: https://web.archive.org/web/20210413233627/http://wiki.hashphp.org/Validation +[Learn about PDO connections]: https://www.php.net/pdo.connections \ No newline at end of file diff --git a/_posts/07-04-01-Interacting-via-Code.md b/_posts/07-04-01-Interacting-via-Code.md index ff0bc5085..efb604a7f 100644 --- a/_posts/07-04-01-Interacting-via-Code.md +++ b/_posts/07-04-01-Interacting-via-Code.md @@ -72,11 +72,8 @@ include 'views/foo-list.php'; db = $db; } public function getAllFoos() { diff --git a/_posts/07-05-01-Abstraction-Layers.md b/_posts/07-05-01-Abstraction-Layers.md index 8b8e14e1c..0ab5b188b 100644 --- a/_posts/07-05-01-Abstraction-Layers.md +++ b/_posts/07-05-01-Abstraction-Layers.md @@ -20,15 +20,15 @@ anchor: databases_abstraction_layers * [Doctrine2 DBAL][2] * [Medoo][8] * [Propel][7] -* [Zend-db][4] +* [laminas-db][4] -[1]: https://secure.php.net/book.pdo +[1]: https://www.php.net/book.pdo [2]: https://www.doctrine-project.org/projects/dbal.html -[4]: https://packages.zendframework.com/docs/latest/manual/en/index.html#zendframework/zend-db +[4]: https://docs.laminas.dev/laminas-db/ [5]: https://atlasphp.io [6]: https://github.com/auraphp/Aura.Sql -[7]: http://propelorm.org/ +[7]: https://propelorm.org/ [8]: https://medoo.in/ [psr0]: https://www.php-fig.org/psr/psr-0/ [psr4]: https://www.php-fig.org/psr/psr-4/ diff --git a/_posts/08-03-01-Plain-PHP-Templates.md b/_posts/08-03-01-Plain-PHP-Templates.md index 76f2bec70..07bcd0468 100644 --- a/_posts/08-03-01-Plain-PHP-Templates.md +++ b/_posts/08-03-01-Plain-PHP-Templates.md @@ -62,5 +62,5 @@ PHP 구문 강조와 자동완성이 내장되어 있습니다. 더구나, 단 {% endhighlight %} -[plates]: http://platesphp.com/ +[plates]: https://platesphp.com/ [aura]: https://github.com/auraphp/Aura.View diff --git a/_posts/08-05-01-Further-Reading.md b/_posts/08-05-01-Further-Reading.md index ec7bda3fd..9c290428a 100644 --- a/_posts/08-05-01-Further-Reading.md +++ b/_posts/08-05-01-Further-Reading.md @@ -24,7 +24,7 @@ anchor: templating_further_reading * [Latte](https://github.com/nette/latte) *(compiled)* * [Mustache](https://github.com/bobthecow/mustache.php) *(compiled)* * [PHPTAL](https://phptal.org/) *(compiled)* -* [Plates](http://platesphp.com/) *(native)* +* [Plates](https://platesphp.com/) *(native)* * [Smarty](https://www.smarty.net/) *(compiled)* * [Twig](https://twig.symfony.com/) *(compiled)* -* [Zend-View](https://docs.zendframework.com/zend-view/) *(native, framework specific)* +* [laminas-view](https://docs.laminas.dev/laminas-view/) *(native, framework specific)* diff --git a/_posts/09-02-01-Errors.md b/_posts/09-02-01-Errors.md index 7c6a8c166..7fcc1e544 100644 --- a/_posts/09-02-01-Errors.md +++ b/_posts/09-02-01-Errors.md @@ -25,7 +25,7 @@ Notice: Undefined variable: foo in php shell code on line 1 {% highlight console %} $ python ->>> print foo +>>> print food Traceback (most recent call last): File "", line 1, in NameError: name 'foo' is not defined @@ -113,8 +113,6 @@ xdebug.scream = On ini_set('xdebug.scream', '1') {% endhighlight %} -"[Scream]"이라는 PHP 익스텐션도 Xdebug와 같은 기능을 제공합니다. Scream의 ini 설정 이름은 `scream.enabled` 입니다. - 이런 기능은 뭔가 도움이 될만한 중요한 에러 메시지가 표시되지 않는 것 같다고 의심될 때 아주 요긴합니다. 하지만 디버깅 용으로 잠시 사용하고 나서 다시 원래대로 설정을 돌려 놓아야 합니다. 에러 제어 연산자가 동작하지 않는 상태에서는 제대로 동작하지 않는 라이브러리들이 많이 있기 때문입니다. @@ -123,7 +121,6 @@ ini_set('xdebug.scream', '1') * [Error Control Operators] * [SitePoint] * [Xdebug] -* [Scream] ### ErrorException @@ -152,10 +149,9 @@ PHP도 완벽하게 "예외를 적극적으로 사용하는" 프로그래밍 언 [errorreport]: /#error_reporting [Xdebug]: https://xdebug.org/docs/basic -[Scream]: https://secure.php.net/book.scream -[Error Control Operators]: https://secure.php.net/language.operators.errorcontrol +[Error Control Operators]: https://www.php.net/language.operators.errorcontrol [SitePoint]: https://www.sitepoint.com/ [Whoops!]: https://filp.github.io/whoops/ -[errorexception]: https://secure.php.net/class.errorexception -[Predefined Constants for Error Handling]: https://secure.php.net/errorfunc.constants -[error_reporting]: https://secure.php.net/function.error-reporting +[errorexception]: https://www.php.net/class.errorexception +[Predefined Constants for Error Handling]: https://www.php.net/errorfunc.constants +[error_reporting]: https://www.php.net/function.error-reporting \ No newline at end of file diff --git a/_posts/09-03-01-Exceptions.md b/_posts/09-03-01-Exceptions.md index 28a31d362..8ad909851 100644 --- a/_posts/09-03-01-Exceptions.md +++ b/_posts/09-03-01-Exceptions.md @@ -72,7 +72,7 @@ Exception을 던지거나 Exception 클래스를 상속받은 예외 클래스 [splext]: /#standard_php_library -[exceptions]: https://secure.php.net/language.exceptions -[splexe]: https://secure.php.net/spl.exceptions +[exceptions]: https://www.php.net/language.exceptions +[splexe]: https://www.php.net/spl.exceptions [nesting-exceptions-in-php]: https://www.brandonsavage.net/exceptional-php-nesting-exceptions-in-php/ diff --git a/_posts/10-03-01-Password-Hashing.md b/_posts/10-03-01-Password-Hashing.md index c77c8359a..5c6e8bc0a 100644 --- a/_posts/10-03-01-Password-Hashing.md +++ b/_posts/10-03-01-Password-Hashing.md @@ -64,7 +64,7 @@ if (password_verify('bad-password', $passwordHash)) { * [PHP `password_hash()` RFC] [4] -[1]: https://secure.php.net/function.password-hash +[1]: https://www.php.net/function.password-hash [2]: https://github.com/ircmaxell/password_compat [3]: https://wikipedia.org/wiki/Cryptographic_hash_function [4]: https://wiki.php.net/rfc/password_hash diff --git a/_posts/10-04-01-Data-Filtering.md b/_posts/10-04-01-Data-Filtering.md index a709ca879..c4666151b 100644 --- a/_posts/10-04-01-Data-Filtering.md +++ b/_posts/10-04-01-Data-Filtering.md @@ -58,8 +58,7 @@ Cross-Site Scripting (XSS)이라고 합니다. 매우 위험한 공격 기법이 이는 악의를 가진 사용자가 사용자 정의 프로퍼티를 가지고 소멸자(destructors)는 실행하게되는 객체를 만들어내도록 허용하게 됩니다. 따라서 신뢰할 수 없는 데이터는 역직렬화하지 말아야합니다. -신뢰할 수 없는 곳으로부터의 데이터를 역직렬화해야만 한다면, PHP 7의 [`allowed_classes`][unserialize] 옵션을 사용하여 -역직렬화 가능한 객체 형식을 제한하세요. +사용자에게 직렬화된 데이터를 전달해야 하는 경우 JSON과 같은 안전한 표준 데이터 교환 형식([`json_decode`][json_decode] 및 [`json_encode`][json_encode])을 사용하세요. ### 데이터 검증 @@ -69,11 +68,12 @@ Cross-Site Scripting (XSS)이라고 합니다. 매우 위험한 공격 기법이 [PHP의 검증 필터 문서 보기][3] -[1]: https://secure.php.net/book.filter -[2]: https://secure.php.net/filter.filters.sanitize -[3]: https://secure.php.net/filter.filters.validate -[4]: https://secure.php.net/function.filter-var -[5]: https://secure.php.net/function.filter-input -[6]: https://secure.php.net/security.filesystem.nullbytes +[1]: https://www.php.net/book.filter +[2]: https://www.php.net/filter.filters.sanitize +[3]: https://www.php.net/filter.filters.validate +[4]: https://www.php.net/function.filter-var +[5]: https://www.php.net/function.filter-input +[6]: https://www.php.net/security.filesystem.nullbytes [html-purifier]: http://htmlpurifier.org/ -[unserialize]: https://secure.php.net/manual/function.unserialize.php +[json_decode]: https://www.php.net/manual/function.json-decode.php +[json_encode]: https://www.php.net/manual/function.json-encode.php diff --git a/_posts/10-06-01-Register-Globals.md b/_posts/10-06-01-Register-Globals.md index ac4daf0e0..14e3be0fb 100644 --- a/_posts/10-06-01-Register-Globals.md +++ b/_posts/10-06-01-Register-Globals.md @@ -14,5 +14,3 @@ anchor: register_globals 예를 들어 `$_GET['foo']` 는 `$foo`라는 변수로 접근할 수 있게 됩니다. 이미 선언된 변수를 오버라이드하게 될 수도 있습니다. 만약 PHP 5.4.0 이전 버전을 사용한다면 `register_globals` 설정을 __반드시__ __off__ 로 설정하시기 바랍니다. - -* [PHP 매뉴얼의 register_globals 항목 보기](https://secure.php.net/security.globals) diff --git a/_posts/10-07-01-Error-Reporting.md b/_posts/10-07-01-Error-Reporting.md index daec5dd9f..0afe00b26 100644 --- a/_posts/10-07-01-Error-Reporting.md +++ b/_posts/10-07-01-Error-Reporting.md @@ -22,7 +22,7 @@ log_errors = On > `-1`로 설정하는 것은 앞으로 나올 PHP 버전에서 새로운 레벨이나 상수가 추가되더라도, 새로 추가된 것들까지 포함해서 모든 > 에러를 표시하게 만드는 설정입니다. PHP 5.4에서는 `E_ALL` 상수가 같은 역할을 합니다. - -> [php.net](https://secure.php.net/function.error-reporting) +> [php.net](https://www.php.net/function.error-reporting) PHP 5.3.0에서 `E_STRICT` 에러 레벨이 추가되었는데, `E_ALL`에 포함되지 않는 레벨이었습니다. 하지만 5.4.0 에서는 `E_ALL`에 포함되는 것으로 변경되었습니다. 이것은 무슨 의미일까요? 모든 가능한 에러를 표시하도록 설정하려면 PHP @@ -48,7 +48,7 @@ log_errors = On 이렇게 설정하면, 에러가 발생하면 웹 서버의 에러 로그에 여전히 기록은 되지만 사용자에게 표시하지는 않습니다. PHP 매뉴얼을 보면 더 많은 정보를 얻을 수 있습니다. -* [error_reporting](https://secure.php.net/errorfunc.configuration#ini.error-reporting) -* [display_errors](https://secure.php.net/errorfunc.configuration#ini.display-errors) -* [display_startup_errors](https://secure.php.net/errorfunc.configuration#ini.display-startup-errors) -* [log_errors](https://secure.php.net/errorfunc.configuration#ini.log-errors) +* [error_reporting](https://www.php.net/errorfunc.configuration#ini.error-reporting) +* [display_errors](https://www.php.net/errorfunc.configuration#ini.display-errors) +* [display_startup_errors](https://www.php.net/errorfunc.configuration#ini.display-startup-errors) +* [log_errors](https://www.php.net/errorfunc.configuration#ini.log-errors) diff --git a/_posts/11-02-01-Test-Driven-Development.md b/_posts/11-02-01-Test-Driven-Development.md index 65e931b7b..1c4030c77 100644 --- a/_posts/11-02-01-Test-Driven-Development.md +++ b/_posts/11-02-01-Test-Driven-Development.md @@ -41,8 +41,9 @@ anchor: test_driven_development 프레임워크들도 상당수 존재합니다. * [atoum](https://github.com/atoum/atoum) -* [Kahlan](https://github.com/crysalead/kahlan) +* [Kahlan](https://github.com/kahlan/kahlan) * [Peridot](https://peridot-php.github.io/) +* [Pest](https://pestphp.com/) * [SimpleTest](https://github.com/simpletest/simpletest) ### 통합 테스트 diff --git a/_posts/12-03-01-Virtual-or-Dedicated-Servers.md b/_posts/12-03-01-Virtual-or-Dedicated-Servers.md index d4a7ac975..a54e9a8ca 100644 --- a/_posts/12-03-01-Virtual-or-Dedicated-Servers.md +++ b/_posts/12-03-01-Virtual-or-Dedicated-Servers.md @@ -26,10 +26,10 @@ PHP와 Apache는 함께한 역사가 아주 깁니다. Apache는 설정으로 서버이기도 하고, WordPress 같은 오픈소스 어플리케이션이나 PHP 프레임워크를 설치하기에도 쉽습니다. 하지만 nginx에 비교하면 기본적으로 Apache가 더 많은 리소스를 사용하고, 처리할 수 있는 동시접속 수도 적습니다. -PHP를 위한 다양한 설정을 Apache에서 할 수 있습니다. 공통적으로 가장 많이 사용하고 쉽게 할 수 있는 설정은 mod_php5 +PHP를 위한 다양한 설정을 Apache에서 할 수 있습니다. 공통적으로 가장 많이 사용하고 쉽게 할 수 있는 설정은 `mod_php` 모듈을 사용하는 [prefork MPM] 방식입니다. 메모리 활용이 가장 효율적인 선택은 아니지만 가장 쉽게 어플리케이션을 설치하여 동작시킬 수 있습니다. 시스템과 서버 관리 측면을 너무 깊이 파고들고 싶지 않다면 이 방식이 가장 좋습니다. -mod_php5 모듈을 사용한다면 prefork MPM도 반드시 사용해야 한다는 것을 기억하세요. +`mod_php` 모듈을 사용한다면 prefork MPM도 반드시 사용해야 한다는 것을 기억하세요. 다른 방법으로, Apache 로부터 성능과 안정성을 더 짜내고 싶다면 nginx에서와 같이 FastCGI를 사용하는 방법이 있습니다. [worker MPM]이나 [event MPM]을 mod_fastcgi나 mod_fcgid 모듈과 함께 사용하는 것입니다. 앞에서 얘기한 방식이 비하면 @@ -46,7 +46,7 @@ If you are running Apache 2.4 or later, you can use [mod_proxy_fcgi] to get grea [nginx]: https://nginx.org/ -[phpfpm]: https://secure.php.net/install.fpm +[phpfpm]: https://www.php.net/install.fpm [secure-nginx-phpfpm]: https://nealpoole.com/blog/2011/04/setting-up-php-fastcgi-and-nginx-dont-trust-the-tutorials-check-your-configuration/ [apache-modules]: https://httpd.apache.org/docs/2.4/mod/ [prefork MPM]: https://httpd.apache.org/docs/2.4/mod/prefork.html @@ -55,6 +55,6 @@ If you are running Apache 2.4 or later, you can use [mod_proxy_fcgi] to get grea [apache]: https://httpd.apache.org/ [apache-MPM]: https://httpd.apache.org/docs/2.4/mod/mpm_common.html [mod_fastcgi]: https://blogs.oracle.com/opal/post/php-fpm-fastcgi-process-manager-with-apache-2 -[mod_fcgid]: hhttps://httpd.apache.org/mod_fcgid/ +[mod_fcgid]: https://httpd.apache.org/mod_fcgid/ [mod_proxy_fcgi]: https://httpd.apache.org/docs/current/mod/mod_proxy_fcgi.html [tutorial-mod_proxy_fcgi]: https://serversforhackers.com/video/apache-and-php-fpm diff --git a/_posts/12-04-01-Shared-Servers.md b/_posts/12-04-01-Shared-Servers.md index f78fc0b82..452fd65a2 100644 --- a/_posts/12-04-01-Shared-Servers.md +++ b/_posts/12-04-01-Shared-Servers.md @@ -13,4 +13,4 @@ PHP는 인기있는 언어라서 공유 서버에서 PHP를 사용할 수도 있 노출시켜서 여러분도 같이 위험에 빠질 가능성이 있다는 것이 고려할만한 내용입니다. 공유 서버를 사용하지 않을 정도의 프로젝트 예산이 있다면 당연히 피하는 것이 좋겠습니다. -공유서버가 최신 버전의 PHP를 제공하는지 확인하기 위해서는, [PHP Versions](http://phpversions.info/shared-hosting/)를 확인하세요. \ No newline at end of file +공유 서버가 최신 버전의 PHP를 제공하는지 확인하세요. \ No newline at end of file diff --git a/_posts/12-05-01-Building-your-Application.md b/_posts/12-05-01-Building-your-Application.md index c114946c4..76b5838f6 100644 --- a/_posts/12-05-01-Building-your-Application.md +++ b/_posts/12-05-01-Building-your-Application.md @@ -33,8 +33,6 @@ anchor: building_and_deploying_your_application [Ansistrano]는 PHP, Python 및 Ruby와 같은 스크립팅 응용 프로그램의 배포 프로세스(배포 및 롤백)를 쉽게 관리할 수 있는 Ansible과 같은 역할을 합니다. [Capistrano]를 위한 Ansible 포트입니다. 이미 많은 PHP 회사에서 사용되고 있습니다. -[Rocketeer]는 라라벨 프레임워크로부터 그 철학과 영감을 얻었습니다. 빠르고, 우아하며, 효과적인 기본값으로 쉽게 사용할 수 있는 것이 목표입니다. 여러 서버, 스테이지(stage), 원자적 배치와 배포를 병렬적으로 수행할 수 있습니다. 이 도구의 모든 것은 핫 스왑(hot swap)하거나 확장할 수 있으며, PHP로 작성되었습니다. - [Deployer]는 PHP로 작성된 배포도구이며, 단순하고 함수형으로 작성되었습니다. 병렬적으로 태스크들을 실행하고, 원자적으로 배포하며, 서버간의 일관성을 유지하는 기능들을 포함하고 있습니다. Symfony, Laravel, Zend Framework, Yii를 위한 일반적인 레시피가 있습니다. Younes Rafie의 [Easy Deployment of PHP Applications with Deployer][phpdeploy_deployer]라는 글은 Deployer를 사용하여 어플리케이션을 배포하기 위한 좋은 튜토리얼입니다. [Magallanes]는 YAML 파일로 간단하게 설정할 수 있는 PHP로 작성된 도구입니다. 여러 서버와 환경, 원자적 배포와 함께, 일반적인 도구와 프레임워크에 활용할 수 있는 몇몇 내장 태스크가 있습니다. @@ -73,9 +71,9 @@ anchor: building_and_deploying_your_application *-- Martin Fowler* PHP 프로젝트에서 지속적인 통합 기법을 사용하는 방법에는 여러가지 방법이 있습니다. [Travis CI]가 작은 규모의 -프로젝트에도 현실성있게 적용할 수 있도록 멋진 결과물을 내놓고 있습니다. Travis CI는 오픈소스 커뮤니티를 위한, 인터넷에서 -호스팅되는 지속적인 통합 서비스입니다. GitHub와 통합되어 있기도 하고, PHP를 포함한 많은 프로그래밍 언어를 아주 잘 -지원하고 있습니다. +프로젝트에도 현실성있게 적용할 수 있도록 멋진 결과물을 내놓고 있습니다. Travis CI는 인터넷에서 호스팅되는 지속적인 통합 서비스입니다. +GitHub와 통합할 수 있으며 PHP를 비롯한 다양한 언어를 지원합니다. +GitHub에는 [GitHub Actions][github_actions]와의 지속적인 통합 워크플로가 있습니다. #### 더 읽어볼 만한 것들: @@ -92,8 +90,8 @@ PHP 프로젝트에서 지속적인 통합 기법을 사용하는 방법에는 [phpdeploy_deployer]: https://www.sitepoint.com/deploying-php-applications-with-deployer/ [Chef]: https://www.chef.io/ [chef_vagrant_and_ec2]: https://web.archive.org/web/20190307220000/http://www.jasongrimes.org/2012/06/managing-lamp-environments-with-chef-vagrant-and-ec2-1-of-3/ -[Chef_cookbook]: https://github.com/chef-cookbooks/php -[Chef_tutorial]: https://www.youtube.com/playlist?list=PL11cZfNdwNyPnZA9D1MbVqldGuOWqbumZ +[Chef_cookbook]: https://github.com/sous-chefs/php +[Chef_tutorial]: https://www.youtube.com/playlist?list=PL11cZfNdwNyNYcpntVe6js-prb80LBZuc [apache_ant_tutorial]: https://code.tutsplus.com/tutorials/automate-your-projects-with-apache-ant--net-18595 [Travis CI]: https://www.travis-ci.com/ [Jenkins]: https://jenkins.io/ @@ -101,7 +99,6 @@ PHP 프로젝트에서 지속적인 통합 기법을 사용하는 방법에는 [PHP Censor]: https://github.com/php-censor/php-censor [Teamcity]: https://www.jetbrains.com/teamcity/ [Deployer]: https://deployer.org/ -[Rocketeer]: http://rocketeer.autopergamene.eu/ [Magallanes]: https://www.magephp.com/ [deploying_php_applications]: https://deployingphpapplications.com/ [Ansible]: https://www.ansible.com/ @@ -109,3 +106,4 @@ PHP 프로젝트에서 지속적인 통합 기법을 사용하는 방법에는 [ansible_for_devops]: https://leanpub.com/ansible-for-devops [ansible_for_aws]: https://leanpub.com/ansible-for-aws [an_ansible_tutorial]: https://serversforhackers.com/an-ansible-tutorial +[github_actions]: https://docs.github.com/en/actions diff --git a/_posts/13-02-01-Vagrant.md b/_posts/13-02-01-Vagrant.md index c764592b1..92c0fa5e4 100644 --- a/_posts/13-02-01-Vagrant.md +++ b/_posts/13-02-01-Vagrant.md @@ -16,19 +16,7 @@ anchor: vagrant Vagrant는 여러분의 호스트 컴퓨터와 가상 머신 사이에 공유 폴더를 만들어줍니다. 그래서 호스트 컴퓨터에서 파일을 수정하고 가상 머신에서 실행하는 식으로 작업할 수 있습니다. -### 도움되는 내용들 - -Vargrant 사용을 시작하는데 약간의 도움이 필요하신 분은 아래 서비스들이 유용할 것 같습니다. - -- [Puphpet][Puphpet]: PHP 개발에 사용할 가상 머신을 설정할 수 있는 단순한 GUI를 제공합니다. **매우 PHP에 특화되어 -있습니다**. 로컬 가상 머신외에도 클라우드 서비스에 배포하는데에도 사용할 수 있습니다. 프로비저닝은 Puppet으로 하게 -되어 있습니다. -- [Phansible][Phansible]: PHP를 기반으로 한 프로젝트를 위한 Ansible Playbooks 생성을 도와주는 사용하기 쉬운 -인터페이스를 제공합니다. - [Vagrant]: https://www.vagrantup.com/ [Puppet]: https://puppet.com/ [Chef]: https://www.chef.io/ -[Puphpet]: https://github.com/puphpet/puphpet -[Phansible]: http://phansible.com/ diff --git a/_posts/14-02-01-Opcode-Cache.md b/_posts/14-02-01-Opcode-Cache.md index a5741d905..4754a080f 100644 --- a/_posts/14-02-01-Opcode-Cache.md +++ b/_posts/14-02-01-Opcode-Cache.md @@ -11,22 +11,18 @@ PHP 파일을 실행하면 가장 먼저 이 파일은 컴파일해서 [opcode]( opcode 캐시는 opcode를 메모리에 보관하고, 이후 호출 시에 재사용하여 불필요한 컴파일 과정이 일어나지 않게 합니다. 보통 시그니처나 파일의 수정 시각을 먼저 확인하여 변경이 있는지 검사합니다. -opcode 캐시는 아마 여러분의 어플리케이션을 상당히 빠르게 개선할 것입니다. PHP 5.5 부터는 [Zend OPcache][opcache-book] 라는 opcode 캐시가 내장되어 있습니다. PHP 패키지/배포판에 따라서 기본으로 활성화 되어있습니다. [opcache.enable](https://secure.php.net/manual/opcache.configuration.php#ini.opcache.enable) 에서 확인하고, `phpinfo()` 출력값으로 확인하세요. 이전 버전의 PHP를 위해서는 PECL 확장이 있습니다. +opcode 캐시는 아마 여러분의 어플리케이션을 상당히 빠르게 개선할 것입니다. PHP 5.5 부터는 [Zend OPcache][opcache-book] 라는 opcode 캐시가 내장되어 있습니다. PHP 패키지/배포판에 따라서 기본으로 활성화 되어있습니다. [opcache.enable](https://www.php.net/manual/opcache.configuration.php#ini.opcache.enable) 에서 확인하고, `phpinfo()` 출력값으로 확인하세요. 이전 버전의 PHP를 위해서는 PECL 확장이 있습니다. 아래는 인기있는 opcode 캐시들입니다. * [Zend OPcache][opcache-book] (PHP 5.5 이후 내장) * Zend OPcache (구 Zend Optimizer+) 는 이제 [오픈소스][Zend Optimizer+]가 되었습니다. -* [APC] - PHP 5.4 혹은 그 이전 버전 -* [XCache] * [WinCache] (MS Windows Server를 위한 익스텐션) * [위키백과: PHP 가속화도구(Acceleratior) 목록][PHP_accelerators] * [PHP Preloading] - PHP >= 7.4 -[opcache-book]: https://secure.php.net/book.opcache -[APC]: https://www.php.net/book.apcu -[XCache]: https://github.com/lighttpd/xcache +[opcache-book]: https://www.php.net/book.opcache [Zend Optimizer+]: https://github.com/zendtech/ZendOptimizerPlus [WinCache]: https://www.iis.net/downloads/microsoft/wincache-extension [PHP_accelerators]: https://wikipedia.org/wiki/List_of_PHP_accelerators diff --git a/_posts/14-03-01-Object-Caching.md b/_posts/14-03-01-Object-Caching.md index 721f7f6c9..435bf1f32 100644 --- a/_posts/14-03-01-Object-Caching.md +++ b/_posts/14-03-01-Object-Caching.md @@ -12,7 +12,7 @@ anchor: object_caching 수 있고 데이터베이스 접속 횟수가 줄어 데이터베이스 서버의 부담도 줄어듭니다. 인기있는 바이트코드 캐시 도구들은 여러분의 커스텀 데이터 또한 캐시해주는 기능을 가진 경우가 많습니다. 바이트코드 캐시 -도구를 사용할만한 이유가 또 있었네요. APCu, XCache, WinCache 모두 메모리 캐시에 여러분의 데이터를 보관할 수 있는 API를 +도구를 사용할만한 이유가 또 있었네요. APCu, WinCache 모두 메모리 캐시에 여러분의 데이터를 보관할 수 있는 API를 제공합니다. 가장 널리 사용되고 있는 메모리 객체 캐시 도구는 APCu와 memcached입니다. APCu는 객체 캐싱을 위한 훌륭한 선택지입니다. @@ -33,10 +33,10 @@ APCu를 사용하는 예제 코드입니다. {% highlight php %} - * @link http://www.phpdoc.org/docs/latest/index.html + * @link https://www.phpdoc.org/docs/latest/index.html */ class DateTimeHelper { diff --git a/_posts/16-02-01-From-the-Source.md b/_posts/16-02-01-From-the-Source.md index 36256bc7f..f440cd93d 100644 --- a/_posts/16-02-01-From-the-Source.md +++ b/_posts/16-02-01-From-the-Source.md @@ -6,5 +6,5 @@ anchor: from_the_source ## 공식사이트 {#from_the_source_title} -* [PHP 웹사이트](https://secure.php.net/) -* [PHP Documentation](https://secure.php.net/docs.php) +* [PHP 웹사이트](https://www.php.net/) +* [PHP Documentation](https://www.php.net/docs.php) diff --git a/_posts/16-05-01-PHP-PaaS-Providers.md b/_posts/16-05-01-PHP-PaaS-Providers.md index ca2405753..bdc80ca30 100644 --- a/_posts/16-05-01-PHP-PaaS-Providers.md +++ b/_posts/16-05-01-PHP-PaaS-Providers.md @@ -21,5 +21,3 @@ anchor: php_paas_providers * [Pivotal Web Services](https://run.pivotal.io/) * [Platform.sh](https://platform.sh/) * [Red Hat OpenShift](https://www.openshift.com/) - -위의 PaaS 제공자들이 어떤 버전을 사용하는지 확인하려면, [PHP Versions](http://phpversions.info/paas-hosting/)를 확인하세요. \ No newline at end of file diff --git a/_posts/16-07-01-Components.md b/_posts/16-07-01-Components.md index 87a74fabb..93e91cb57 100644 --- a/_posts/16-07-01-Components.md +++ b/_posts/16-07-01-Components.md @@ -47,7 +47,7 @@ _Laravel의 [Illuminate 컴포넌트][Illuminate components]는 Laravel 프레 [PEAR]: /#pear [Dependency Management]: /#dependency_management [FuelPHP Validation package]: https://github.com/fuelphp/validation -[Aura]: http://auraphp.com/framework/ +[Aura]: https://auraphp.com/framework/ [FuelPHP]: https://github.com/fuelphp [Hoa Project]: https://github.com/hoaproject [Symfony Components]: https://symfony.com/components diff --git a/_posts/16-08-01-Sites.md b/_posts/16-08-01-Sites.md index 2ae394fb0..bc1b247e7 100644 --- a/_posts/16-08-01-Sites.md +++ b/_posts/16-08-01-Sites.md @@ -8,7 +8,7 @@ title: 그외 유용한 자료들 ### 치트시트 -* [PHP Cheatsheets](http://phpcheatsheets.com/) - 다양한 버전의 PHP에서 변수 비교(Variable Comparison), +* [PHP Cheatsheets](https://phpcheatsheets.com/) - 다양한 버전의 PHP에서 변수 비교(Variable Comparison), 수식들(Variable Arithmetic), 변수 테스트(Variable Testing)을 다루고 있습니다. * [Modern PHP Cheatsheet](https://github.com/smknstd/modern-php-cheatsheet) - 최신 (PHP 7.0+) 이디엄을 문서화해 두었습니다. * [OWASP Security Cheatsheets](https://owasp.org/www-project-cheat-sheets/) - 어플리케이션 보안에 대해 중요한 정보를 모아두었습니다. diff --git a/_posts/16-09-01-Videos.md b/_posts/16-09-01-Videos.md index 08961b188..65f00a95a 100644 --- a/_posts/16-09-01-Videos.md +++ b/_posts/16-09-01-Videos.md @@ -7,6 +7,8 @@ title: 동영상 튜토리얼 ## 동영상 튜토리얼 {#videos} ### YouTube 채널 + +* [Learn PHP The Right Way Series](https://github.com/ggelashvili/learnphptherightway-outline) * [PHP Academy](https://www.youtube.com/user/phpacademy) * [The New Boston](https://www.youtube.com/user/thenewboston) * [Sherif Ramadan](https://www.youtube.com/user/businessgeek) @@ -19,3 +21,4 @@ title: 동영상 튜토리얼 * [PHP Training on LinkedIn.com](https://www.linkedin.com/learning/search?trk=lynda_redirect_learning&sortBy=RELEVANCE&softwareNames=PHP) * [PHP Training on Tutsplus](https://code.tutsplus.com/categories/php/courses) * [Laracasts](https://laracasts.com/) +* [SymfonyCasts](https://symfonycasts.com/) \ No newline at end of file diff --git a/_posts/16-10-01-Books.md b/_posts/16-10-01-Books.md index 2f34d5eb1..d33d429f7 100644 --- a/_posts/16-10-01-Books.md +++ b/_posts/16-10-01-Books.md @@ -15,22 +15,23 @@ PHP를 다루는 책은 아주 많지만, 슬프게도 너무 오래되어서 ### 무료도서 -* [PHP Pandas](http://daylerees.com/php-pandas/) - 웹 개발자가 되는 방법을 모두에게 가르치는 것을 목표로 합니다. +* [PHP Pandas](https://daylerees.com/php-pandas/) - 웹 개발자가 되는 방법을 모두에게 가르치는 것을 목표로 합니다. * [PHP The Right Way](https://leanpub.com/phptherightway/) - 이 웹 사이트는 책으로도 완전히 무료로 만나볼 수 있습니다. * [Using Libsodium in PHP Projects](https://paragonie.com/book/pecl-libsodium) - 모던하고, 안전하며 빠른 암호 익스텐션인 Libsodium PHP 사용 가이드 ### 유료도서 +* [PHP & MySQL](https://phpandmysql.com/) - PHP book with excellent illustrations that covers all the fundamentals of PHP and MySQL with practical examples. * [Build APIs You Won't Hate](https://leanpub.com/build-apis-you-wont-hate) - 개나 소나 API를 원하기 때문에, 여러분은 API를 만드는 방법을 배워야할 것입니다. * [Modern PHP](https://www.oreilly.com/library/view/modern-php/9781491905173/) - 모던 PHP의 특성과 모범 사례들, 테스트, 튜닝, 배포, 개발 환경 구성 등에 대한 내용을 다룹니다. * [Building Secure PHP Apps](https://leanpub.com/buildingsecurephpapps) - 시니어 개발자가 몇 해에 걸친 경험 끝에 얻은 -안전한 코드에 관한 지식을 모아 쉽고 빠르게 읽을 수 있는 한 권의 책으로 압축한 핸드북 +안전한 코드에 관한 지식을 모아 쉽고 빠르게 읽을 수 있는 한 권의 책으로 압축한 핸드북. * [Modernizing Legacy Applications In PHP](https://leanpub.com/mlaphp) - 조금씩 여러번 수정해서 여러분의 코드를 깔끔하게, 여러분의 통제하에 둘 수 있게 될 것입니다. * [Securing PHP: Core Concepts](https://leanpub.com/securingphp-coreconcepts) - 매일 PHP 코드를 작성할 때 잊지 말아야 -할, 안전한 코드를 작성하는데 필요한 가장 공통적인 내용들 -* [Scaling PHP](http://www.scalingphpbook.com/) - 시스템 관리자인 척하지 말고 개발자로 돌아오자 +할, 안전한 코드를 작성하는데 필요한 가장 공통적인 내용들. +* [Scaling PHP](https://www.scalingphpbook.com/) - 시스템 관리자인 척하지 말고 개발자로 돌아오자. * [Signaling PHP](https://leanpub.com/signalingphp) - 커맨드라인에서 실행되는 PHP 스크립트를 작성할 때 PCNTL 시그널이 아주 도움이 됩니다. * [Minimum Viable Tests](https://leanpub.com/minimumviabletests) - 오랫동안 PHP 테스트 에반젤리스트로 활동한 Chris Hartjes가 시작하기 위해 알아야 할 최소한의 것이라고 생각는 것 다룹니다. diff --git a/_posts/17-01-01-Community.md b/_posts/17-01-01-Community.md index 7e85318fe..078871e12 100644 --- a/_posts/17-01-01-Community.md +++ b/_posts/17-01-01-Community.md @@ -7,8 +7,8 @@ anchor: community PHP 커뮤니티는 매우 거대하고 널리 퍼져있습니다. 멤버들은 모두 새로운 PHP 프로그래머를 도와줄 준비가 되어 있습니다. 이 사이트에 정리된 베스트 프랙티스에 관해서 더 알아보고 싶다면 여러분의 근처에 있는 PHP 사용자 그룹에 가입하거나 PHP -컨퍼런스에 참석해보세요. [irc.freenode.com][php-irc]에 있는 #phpc 채널에서 IRC로 대화를 하거나 [@phpc][phpc-twitter] -트위터 계정을 팔로우 할 수도 있습니다. 여러가지 방법으로 새로운 개발자들을 만나고, 새로운 내용을 배우고, 새로운 친구를 +컨퍼런스에 참석해보세요. [irc.freenode.com][php-irc]에 있는 #phpc 채널에서 IRC로 대화를 하거나 [@phpc][phpc-twitter] 또는 +[Mastodon][phpc-mastodon]을 팔로우 할 수도 있습니다. 여러가지 방법으로 새로운 개발자들을 만나고, 새로운 내용을 배우고, 새로운 친구를 만드세요! [StackOverflow][php-so]도 활용해 보세요. [PHP 공식 이벤트 달력 보기][php-calendar] @@ -16,5 +16,6 @@ PHP 커뮤니티는 매우 거대하고 널리 퍼져있습니다. 멤버들은 [php-irc]: https://webchat.freenode.net/?channels=phpc [phpc-twitter]: https://twitter.com/phpc +[phpc-mastodon]: https://phpc.social/ [php-so]: https://stackoverflow.com/questions/tagged/php -[php-calendar]: https://secure.php.net/cal.php +[php-calendar]: https://www.php.net/cal.php \ No newline at end of file diff --git a/_posts/17-03-01-Conferences.md b/_posts/17-03-01-Conferences.md index bc7aa3374..e0ac8cf50 100644 --- a/_posts/17-03-01-Conferences.md +++ b/_posts/17-03-01-Conferences.md @@ -12,4 +12,4 @@ anchor: conferences [PHP 컨퍼런스 찾아보기][php-conf] -[php-conf]: https://secure.php.net/conferences/index.php +[php-conf]: https://www.php.net/conferences/index.php diff --git a/_posts/17-04-01-Elephpants.md b/_posts/17-04-01-Elephpants.md index 100b22af6..44af71aa6 100644 --- a/_posts/17-04-01-Elephpants.md +++ b/_posts/17-04-01-Elephpants.md @@ -10,6 +10,6 @@ anchor: elephpants [Vincent Pontier 인터뷰][vincent-pontier-interview] -[elephpant]: https://secure.php.net/elephpant.php +[elephpant]: https://www.php.net/elephpant.php [vincent-pontier-interview]: https://7php.com/elephpant/ [vincent-pontier]: http://www.elroubio.net/ diff --git a/banners.md b/banners.md index 09055ebe4..a42ab806d 100644 --- a/banners.md +++ b/banners.md @@ -15,8 +15,8 @@ _PHP: The Right Way_ 배너 이미지를 사용해 널리 알려주세요! 새

PHP: The Right Way

{% highlight html %} - - PHP: The Right Way + + PHP: The Right Way {% endhighlight %} @@ -25,8 +25,8 @@ _PHP: The Right Way_ 배너 이미지를 사용해 널리 알려주세요! 새

PHP: The Right Way

{% highlight html %} - - PHP: The Right Way + + PHP: The Right Way {% endhighlight %} @@ -35,8 +35,8 @@ _PHP: The Right Way_ 배너 이미지를 사용해 널리 알려주세요! 새

PHP: The Right Way

{% highlight html %} - - PHP: The Right Way + + PHP: The Right Way {% endhighlight %} @@ -45,8 +45,8 @@ _PHP: The Right Way_ 배너 이미지를 사용해 널리 알려주세요! 새

PHP: The Right Way

{% highlight html %} - - PHP: The Right Way + + PHP: The Right Way {% endhighlight %} @@ -55,8 +55,8 @@ _PHP: The Right Way_ 배너 이미지를 사용해 널리 알려주세요! 새

PHP: The Right Way

{% highlight html %} - - PHP: The Right Way + + PHP: The Right Way {% endhighlight %} @@ -65,8 +65,8 @@ _PHP: The Right Way_ 배너 이미지를 사용해 널리 알려주세요! 새

PHP: The Right Way

{% highlight html %} - - PHP: The Right Way + + PHP: The Right Way {% endhighlight %} @@ -75,8 +75,8 @@ _PHP: The Right Way_ 배너 이미지를 사용해 널리 알려주세요! 새

PHP: The Right Way

{% highlight html %} - - PHP: The Right Way + + PHP: The Right Way {% endhighlight %} @@ -85,7 +85,7 @@ _PHP: The Right Way_ 배너 이미지를 사용해 널리 알려주세요! 새

PHP: The Right Way

{% highlight html %} - - PHP: The Right Way + + PHP: The Right Way {% endhighlight %} diff --git a/pages/Design-Patterns.md b/pages/Design-Patterns.md index f7c6709ff..ebe51af42 100644 --- a/pages/Design-Patterns.md +++ b/pages/Design-Patterns.md @@ -12,7 +12,7 @@ sitemap: true * [위키백과: Architectural pattern](https://en.wikipedia.org/wiki/Architectural_pattern) * [위키백과: Software design pattern](https://en.wikipedia.org/wiki/Software_design_pattern) -* [Collection of implementation examples](http://designpatternsphp.readthedocs.io/en/latest/) +* [Collection of implementation examples](https://designpatternsphp.readthedocs.io/en/latest/) ## 팩토리(Factory) {#factory} @@ -71,20 +71,20 @@ print_r($veyron->getMakeAndModel()); // "Bugatti Veyron"을 출력 **TODO: NEED NEW SINGLETON CODE EXAMPLE** -이 코드에서는 [*정적(static)* 변수](http://php.net/language.variables.scope#language.variables.scope.static)와 정적 +이 코드에서는 [*정적(static)* 변수](https://php.net/language.variables.scope#language.variables.scope.static)와 정적 생성 메소드(`getInstance()`)를 사용한 싱글턴 구현을 보여주고 있습니다. 아래 내용을 유념하세요. 다음 내용을 유의하세요: -* 생성자 [`__construct()`](http://php.net/language.oop5.decon#object.construct)는 `new` 연산자를 사용해서 다른 곳에서 +* 생성자 [`__construct()`](https://php.net/language.oop5.decon#object.construct)는 `new` 연산자를 사용해서 다른 곳에서 함부로 생성할 수 없도록 protected 로 제한되어 있습니다. -* 특수 매서드(Magic Method) [`__clone()`](http://php.net/language.oop5.cloning#object.clone)은 -[`clone`](http://php.net/language.oop5.cloning) 연산자를 사용해서 복제할 수 없도록 private 으로 제한되어 있습니다. -* 특수 매서드(Magic Method) [`__wakeup()`](http://php.net/language.oop5.magic#object.wakeup)은 전역 함수 -[`unserialize()`](http://php.net/function.unserialize)를 이용해서 unserialize 할 수 없도록 private 으로 제한되어 +* 특수 매서드(Magic Method) [`__clone()`](https://php.net/language.oop5.cloning#object.clone)은 +[`clone`](https://php.net/language.oop5.cloning) 연산자를 사용해서 복제할 수 없도록 private 으로 제한되어 있습니다. +* 특수 매서드(Magic Method) [`__wakeup()`](https://php.net/language.oop5.magic#object.wakeup)은 전역 함수 +[`unserialize()`](https://php.net/function.unserialize)를 이용해서 unserialize 할 수 없도록 private 으로 제한되어 있습니다. * 새 인스턴스 생성 시에는 정적 메소드인 `getInstance()` 내에서 -[지연된 정적 바인딩](http://php.net/language.oop5.late-static-bindings)을 통해서 생성됩니다. `static` 키워드가 +[지연된 정적 바인딩](https://php.net/language.oop5.late-static-bindings)을 통해서 생성됩니다. `static` 키워드가 사용되고 있는데요, 지연된 정적 바인딩을 사용함으로써 `Singleton` 클래스를 상속해서 싱글턴 패턴을 사용하는 자식 클래스들을 만들 수 있게 됩니다. @@ -147,7 +147,7 @@ class ArrayOutput implements OutputInterface 각각의 '출력' 클래스들이 어떻게 OutputInterface를 구현하고 있는지 보이실 겁니다. 이러한 방식에는 두 가지 목적이 있는데, 첫 번째는 각각의 출력 클래스 구현체들이 준수해야하는 구현 규칙을 제공하는 것이고, 두 번째는 공통적으로 -'OutputInterface' 인터페이스를 구현함으로써 [타입 힌팅](http://php.net/language.oop5.typehinting)을 통해 알고리즘을 +'OutputInterface' 인터페이스를 구현함으로써 [타입 힌팅](https://php.net/language.oop5.typehinting)을 통해 알고리즘을 사용하는 코드 쪽도 정확한 타입을 사용하도록 보장하는 것입니다. 아래 코드는 알고리즘을 사용하는 코드 쪽에서는 어떻게 구현해야 런타임에 동적으로 적당한 알고리즘을 설정하여 사용하게 할 @@ -188,7 +188,7 @@ $data = $client->loadOutput(); {% endhighlight %} -* [위키백과: Strategy pattern](http://en.wikipedia.org/wiki/Strategy_pattern) +* [위키백과: Strategy pattern](https://en.wikipedia.org/wiki/Strategy_pattern) ## 프론트 컨트롤러(Front Controller) {#front-controller} diff --git a/pages/Functional-Programming.md b/pages/Functional-Programming.md index 00f7ef9c0..9dd16b3fd 100644 --- a/pages/Functional-Programming.md +++ b/pages/Functional-Programming.md @@ -82,6 +82,6 @@ print_r($output); // 3보다 큰 숫자만 출력된다. * [클로저 RFC에서 좀 더 상세한 내용 보기][closures-rfc] * [`call_user_func_array()` 내장 함수로 동적으로 호출하는 방법에 대해 PHP 매뉴얼 보기][call-user-func-array] -[anonymous-functions]: http://php.net/functions.anonymous +[anonymous-functions]: https://www.php.net/functions.anonymous [closures-rfc]: https://wiki.php.net/rfc/closures -[call-user-func-array]: http://php.net/function.call-user-func-array +[call-user-func-array]: https://www.php.net/function.call-user-func-array diff --git a/pages/The-Basics.md b/pages/The-Basics.md index f2c211c54..2f843974a 100644 --- a/pages/The-Basics.md +++ b/pages/The-Basics.md @@ -32,9 +32,9 @@ if (strpos('testing', 'test') !== false) { // (0 !== false)의 비교 결과 } {% endhighlight %} -* [비교 연산자](http://php.net/language.operators.comparison) -* [비교 연산자 테이블](http://php.net/types.comparisons) -* [비교 연산자 도움말](http://phpcheatsheets.com/index.php?page=compare) +* [비교 연산자](https://www.php.net/language.operators.comparison) +* [비교 연산자 테이블](https://www.php.net/types.comparisons) +* [비교 연산자 도움말](https://phpcheatsheets.com/index.php?page=compare) ## 조건 구문 {#conditional-statements} @@ -73,7 +73,7 @@ function test($a) {% endhighlight %} -* [If 구문](http://php.net/control-structures.if) +* [If 구문](https://www.php.net/control-structures.if) ### Switch 구문 {#switch-statements} @@ -108,7 +108,7 @@ function test($a) } {% endhighlight %} -* [Switch 구문](http://php.net/control-structures.switch) +* [Switch 구문](https://www.php.net/control-structures.switch) * [PHP switch](http://phpswitch.com/) ## 전역 네임스페이스 {#global-namespace} @@ -133,8 +133,8 @@ function array() } {% endhighlight %} -* [Global space](http://php.net/language.namespaces.global) -* [Global rules](http://php.net/userlandnaming.rules) +* [Global space](https://www.php.net/language.namespaces.global) +* [Global rules](https://www.php.net/userlandnaming.rules) ## 문자열 {#strings} @@ -158,7 +158,7 @@ $a = 'Multi-line example' // 연결 연산자 (.) . 'of what to do'; {% endhighlight %} -* [문자열 연산자](http://php.net/language.operators.string) +* [문자열 연산자](https://www.php.net/language.operators.string) ### 문자열의 유형 {#string-types} @@ -182,7 +182,7 @@ echo 'This is my string, look at how pretty it is.'; // 단순히 텍스트 */ {% endhighlight %} -* [작은따옴표](http://php.net/language.types.string#language.types.string.syntax.single) +* [작은따옴표](https://www.php.net/language.types.string#language.types.string.syntax.single) #### 큰따옴표 {#double-quotes} @@ -232,7 +232,7 @@ $juice = array('apple', 'orange', 'plum'); echo "I drank some juice made of {$juice[1]}s"; // $juice[1] 이 잘 분석된다. {% endhighlight %} -* [큰따옴표](http://php.net/language.types.string#language.types.string.syntax.double) +* [큰따옴표](https://www.php.net/language.types.string#language.types.string.syntax.double) #### Nowdoc 문법 {#nowdoc-syntax} @@ -257,7 +257,7 @@ EOD; // 끝을 나타내는 'EOD'는 반드시 줄의 가 */ {% endhighlight %} -* [Nowdoc 문법](http://php.net/language.types.string#language.types.string.syntax.nowdoc) +* [Nowdoc 문법](https://www.php.net/language.types.string#language.types.string.syntax.nowdoc) #### Heredoc 문법 {#heredoc-syntax} @@ -284,7 +284,7 @@ EOD; // 끝을 나타내는 'EOD'는 반드시 줄의 가 */ {% endhighlight %} -* [Heredoc 문법](http://php.net/language.types.string#language.types.string.syntax.heredoc) +* [Heredoc 문법](https://www.php.net/language.types.string#language.types.string.syntax.heredoc) > It should be noted that multiline strings can also be formed by continuing them across multilines in a statement. _e.g._ > 여러 줄에 걸쳐 계속 입력하는 방식으로 여러 줄을 작성할 수도 있다는 것에도 주목할 필요가 있습니다. _예를 들어_ @@ -322,7 +322,7 @@ $a are parsed. 다시 작성하는 것은 굉장히 무의미한 일입니다. 그렇기 때문에 두 차이가 갖는 의미와 효과를 완전히 이해하지 않았다면 이러한 작은 최적화(micro-optimization)는 피해야 합니다. -* [작은따옴표의 성능에 대한 반증](http://nikic.github.io/2012/01/09/Disproving-the-Single-Quotes-Performance-Myth.html) +* [작은따옴표의 성능에 대한 반증](https://www.npopov.com/2012/01/09/Disproving-the-Single-Quotes-Performance-Myth.html) ## 삼항 연산자 {#ternary-operators} @@ -405,4 +405,4 @@ return ($a != 3 && $b != 4) || $c == 5; PHP 5.3부터 삼항 연사자의 중간 부분을 생략 가능합니다. "expr1 ?: expre3" 표현식은 expr1이 TRUE로 평가되는 경우 expr1을 리턴하고, 아닌 경우에 expr3을 리턴합니다. -* [삼항 연산자](http://php.net/language.operators.comparison) +* [삼항 연산자](https://www.php.net/language.operators.comparison)