symfony-si / php-the-right-way

🐘 🇸🇮 An easy-to-read, quick reference for PHP best practices, accepted coding standards, and links to authoritative tutorials around the Web
https://sl.phptherightway.com
Other
5 stars 3 forks source link

Sync translation with upstream #2

Closed petk closed 2 years ago

petk commented 6 years ago

Diff:

diff -r php-the-right-way-en-previous/_posts/01-02-01-Use-the-Current-Stable-Version.md php-the-right-way-en-master/_posts/01-02-01-Use-the-Current-Stable-Version.md
2c2
< title:   Use the Current Stable Version (7.1)
---
> title:   Use the Current Stable Version (7.2)
7c7
< ## Use the Current Stable Version (7.1) {#use_the_current_stable_version_title}
---
> ## Use the Current Stable Version (7.2) {#use_the_current_stable_version_title}
9,10c9
< If you are getting started with PHP, start with the current stable release of [PHP 7.1][php-release]. PHP 7.1 is very
< new, and adds many amazing [new features](#language_highlights) over the older 5.x versions. The engine has been largely re-written, and PHP is now even quicker than older versions.
---
> If you are getting started with PHP, start with the current stable release of [PHP 7.2][php-release]. PHP 7.x adds many [new features](#language_highlights) over the older 5.x versions. The engine has been largely re-written, and PHP is now even quicker than older versions.
12c11
< Most commonly in the near future you will find PHP 5.x being used, and the latest 5.x version is 5.6. This is not a bad option, but you should try to upgrade to the latest stable quickly - PHP 5.6 [will not receive security updates beyond 2018](http://php.net/supported-versions.php).  Upgrading is really quite easy, as there are not many [backwards compatibility breaks][php71-bc]. If you are not sure which version a function or feature is in, you can check the PHP documentation on the [php.net][php-docs] website.
---
> You should try to upgrade to the latest stable version quickly - PHP 5.6 [will not receive security updates beyond 2018](http://php.net/supported-versions.php).  Upgrading is easy, as there are not many [backwards compatibility breaks][php72-bc]. If you are not sure which version a function or feature is in, you can check the PHP documentation on the [php.net][php-docs] website.
16c15
< [php71-bc]: http://php.net/manual/migration71.incompatible.php
---
> [php72-bc]: http://php.net/manual/migration72.incompatible.php
diff -r php-the-right-way-en-previous/_posts/01-04-01-Mac-Setup.md php-the-right-way-en-master/_posts/01-04-01-Mac-Setup.md
8,11c8
< OS X comes prepackaged with PHP but it is normally a little behind the latest stable. Mavericks has 5.4.17,
< Yosemite 5.5.9, El Capitan 5.5.29 and Sierra 5.6.24, but with PHP 7.1 out that is often not good enough.
< 
< There are multiple ways to install PHP on OS X.
---
> macOS comes prepackaged with PHP but it is normally a little behind the latest stable release. There are multiple ways to install the latest PHP version on macOS.
15,16c12,16
< [Homebrew] is a powerful package manager for OS X, which can help you install PHP and various extensions easily.
< [Homebrew PHP] is a repository that contains PHP-related "formulae" for Homebrew, and will let you install PHP.
---
> [Homebrew] is a package manager for macOS that helps you easily install PHP and various extensions. The Homebrew core repository provides "formulae" for PHP 5.6, 7.0, 7.1, and 7.2. Install the latest version with this command:
> 
> ```
> brew install php@7.2
> ```
18,19c18
< At this point, you can install `php53`, `php54`, `php55`, `php56`, `php70` or `php71` using the `brew install` command, and switch
< between them by modifying your `PATH` variable. Alternatively, you can use [brew-php-switcher][brew-php-switcher] which will switch automatically for you.
---
> You can switch between Homebrew PHP versions by modifying your `PATH` variable. Alternatively, you can use [brew-php-switcher][brew-php-switcher] to switch PHP versions automatically.
63,64c62
< 
< [Homebrew]: http://brew.sh/
---
> [Homebrew]: https://brew.sh/
68,69c66,67
< [php-osx.liip.ch]: http://php-osx.liip.ch/
< [mac-compile]: http://php.net/install.macosx.compile
---
> [php-osx.liip.ch]: https://php-osx.liip.ch/
> [mac-compile]: https://secure.php.net/install.macosx.compile
72,73c70,71
< [mamp-downloads]: http://www.mamp.info/en/downloads/
< [xampp]: http://www.apachefriends.org/en/xampp.html
---
> [mamp-downloads]: https://www.mamp.info/en/downloads/
> [xampp]: https://www.apachefriends.org/index.html
Only in php-the-right-way-en-master/_posts: 01-06-01-Common-Directory-Structure.md
diff -r php-the-right-way-en-previous/_posts/02-01-01-Code-Style-Guide.md php-the-right-way-en-master/_posts/02-01-01-Code-Style-Guide.md
13c13
< to code-style, but those that do are [PSR-0][psr0], [PSR-1][psr1], [PSR-2][psr2] and [PSR-4][psr4]. These
---
> to code-style, but those that do are [PSR-1][psr1], [PSR-2][psr2] and [PSR-4][psr4]. These
22d21
< * [Read about PSR-0][psr0]
58a58
> Finally, a good supplementary resource for writing clean PHP code is [Clean Code PHP][cleancode].
60,67c60,66
< [fig]: http://www.php-fig.org/
< [psr0]: http://www.php-fig.org/psr/psr-0/
< [psr1]: http://www.php-fig.org/psr/psr-1/
< [psr2]: http://www.php-fig.org/psr/psr-2/
< [psr4]: http://www.php-fig.org/psr/psr-4/
< [pear-cs]: http://pear.php.net/manual/en/standards.php
< [symfony-cs]: http://symfony.com/doc/current/contributing/code/standards.html
< [phpcs]: http://pear.php.net/package/PHP_CodeSniffer/
---
> [fig]: https://www.php-fig.org/
> [psr1]: https://www.php-fig.org/psr/psr-1/
> [psr2]: https://www.php-fig.org/psr/psr-2/
> [psr4]: https://www.php-fig.org/psr/psr-4/
> [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/
70c69,70
< [phpcsfixer]: http://cs.sensiolabs.org/
---
> [phpcsfixer]: https://cs.sensiolabs.org/
> [cleancode]: https://github.com/jupeter/clean-code-php
diff -r php-the-right-way-en-previous/_posts/03-02-01-Programming-Paradigms.md php-the-right-way-en-master/_posts/03-02-01-Programming-Paradigms.md
53,56c53,56
< [oop]: http://php.net/language.oop5
< [traits]: http://php.net/language.oop5.traits
< [anonymous-functions]: http://php.net/functions.anonymous
< [closure-class]: http://php.net/class.closure
---
> [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
58,62c58,62
< [callables]: http://php.net/language.types.callable
< [call-user-func-array]: http://php.net/function.call-user-func-array
< [magic-methods]: http://php.net/language.oop5.magic
< [reflection]: http://php.net/intro.reflection
< [overloading]: http://php.net/language.oop5.overloading
---
> [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
diff -r php-the-right-way-en-previous/_posts/03-03-01-Namespaces.md php-the-right-way-en-master/_posts/03-03-01-Namespaces.md
31,33c31,33
< [namespaces]: http://php.net/language.namespaces
< [psr0]: http://www.php-fig.org/psr/psr-0/
< [psr4]: http://www.php-fig.org/psr/psr-4/
---
> [namespaces]: https://secure.php.net/language.namespaces
> [psr0]: https://www.php-fig.org/psr/psr-0/
> [psr4]: https://www.php-fig.org/psr/psr-4/
diff -r php-the-right-way-en-previous/_posts/03-04-01-Standard-PHP-Library.md php-the-right-way-en-master/_posts/03-04-01-Standard-PHP-Library.md
17,18c17,18
< [spl]: http://php.net/book.spl
< [spllynda]: http://www.lynda.com/PHP-tutorials/Up-Running-Standard-PHP-Library/175038-2.html
---
> [spl]: https://secure.php.net/book.spl
> [spllynda]: https://www.lynda.com/PHP-tutorials/Up-Running-Standard-PHP-Library/175038-2.html
diff -r php-the-right-way-en-previous/_posts/03-05-01-Command-Line-Interface.md php-the-right-way-en-master/_posts/03-05-01-Command-Line-Interface.md
55d54
<  * [Learn about setting up Windows to run PHP from the command line][php-cli-windows]
57,64c56,61
< 
< [phpinfo]: http://php.net/function.phpinfo
< [cli-options]: http://php.net/features.commandline.options
< [argc]: http://php.net/reserved.variables.argc
< [argv]: http://php.net/reserved.variables.argv
< [exit-codes]: http://www.gsp.com/cgi-bin/man.cgi?section=3&amp;topic=sysexits
< [php-cli]: http://php.net/features.commandline
< [php-cli-windows]: http://php.net/install.windows.commandline
---
> [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
> [exit-codes]: https://www.gsp.com/cgi-bin/man.cgi?section=3&amp;topic=sysexits
> [php-cli]: https://secure.php.net/features.commandline.options
diff -r php-the-right-way-en-previous/_posts/03-06-01-XDebug.md php-the-right-way-en-master/_posts/03-06-01-XDebug.md
44,46c44,46
< [xdebug-install]: http://xdebug.org/docs/install
< [xdebug-docs]: http://xdebug.org/docs/
< [macgdbp-install]: http://www.bluestatic.org/software/macgdbp/
---
> [xdebug-install]: https://xdebug.org/docs/install
> [xdebug-docs]: https://xdebug.org/docs/
> [macgdbp-install]: https://www.bluestatic.org/software/macgdbp/
diff -r php-the-right-way-en-previous/_posts/04-02-01-Composer-and-Packagist.md php-the-right-way-en-master/_posts/04-02-01-Composer-and-Packagist.md
9c9
< Composer is a **brilliant** dependency manager for PHP. List your project's dependencies in a `composer.json` file and,
---
> Composer is the recommended dependency manager for PHP. List your project's dependencies in a `composer.json` file and,
13c13
< There are already a lot of PHP libraries that are compatible with Composer, ready to be used in your project. These
---
> There is a plethora of PHP libraries that are compatible with Composer and ready to be used in your project. These
18,20c18,20
< The safest way to download composer is by [following the official instructions](https://getcomposer.org/download/).   
< This will verify the installer is not corrupt or tampered with.  
< The installer installs Composer *locally*, in your current working directory.
---
> The safest way to download composer is by [following the official instructions](https://getcomposer.org/download/).
> This will verify the installer is not corrupt or tampered with.
> The installer installs a `composer.phar` binary in your _current working directory_.
22c22
< We recommend installing it *globally* (e.g. a single copy in /usr/local/bin) - to do so, run this afterwards:
---
> We recommend installing Composer *globally* (e.g. a single copy in `/usr/local/bin`). To do so, run this command next:
38,69d37
< ### How to Install Composer (manually)
< 
< Manually installing Composer is an advanced technique; however, there are various reasons why a 
< developer might prefer this method vs. using the interactive installation routine. The interactive
< installation checks your PHP installation to ensure that:
< 
< - a sufficient version of PHP is being used
< - `.phar` files can be executed correctly
< - certain directory permissions are sufficient
< - certain problematic extensions are not loaded
< - certain `php.ini` settings are set
< 
< Since a manual installation performs none of these checks, you have to decide whether the trade-off is 
< worth it for you. As such, below is how to obtain Composer manually:
< 
< {% highlight console %}
< curl -s https://getcomposer.org/composer.phar -o $HOME/local/bin/composer
< chmod +x $HOME/local/bin/composer
< {% endhighlight %}
< 
< The path `$HOME/local/bin` (or a directory of your choice) should be in your `$PATH` environment 
< variable. This will result in a `composer` command being available.
< 
< When you come across documentation that states to run Composer as `php composer.phar install`, you can
< substitute that with:
< 
< {% highlight console %}
< composer install
< {% endhighlight %}
< 
< This section will assume you have installed composer globally.
< 
73c41
< by hand if you like, or use Composer itself. The `composer require` command adds a project dependency 
---
> by hand if you like, or use Composer itself. The `composer require` command adds a project dependency
78c46
< composer require twig/twig:~1.8
---
> composer require twig/twig:^2.0
83c51
< download and install your dependencies into the `vendor/` directory. This also applies to projects 
---
> download and install your dependencies into the `vendor/` directory. This also applies to projects
90c58
< Next, add this line to your application's primary PHP file; this will tell PHP to use Composer's 
---
> Next, add this line to your application's primary PHP file; this will tell PHP to use Composer's
103,106c71,74
< downloaded when you first ran `composer install`. If you share your project with others, 
< ensure the `composer.lock` file is included, so that when they run `composer install` they'll 
< get the same versions as you.  To update your dependencies, run `composer update`. Don't use 
< `composer update` when deploying, only `composer install`, otherwise you may end up with different 
---
> downloaded when you first ran `composer install`. If you share your project with others,
> ensure the `composer.lock` file is included, so that when they run `composer install` they'll
> get the same versions as you.  To update your dependencies, run `composer update`. Don't use
> `composer update` when deploying, only `composer install`, otherwise you may end up with different
110c78
< requirement of `~1.8` means "anything newer than `1.8.0`, but less than `2.0.x-dev`". You can also use 
---
> requirement of `~1.8` means "anything newer than `1.8.0`, but less than `2.0.x-dev`". You can also use
128c96
< to do is prefix your command with `global`. If for example you wanted to install PHPUnit and have it 
---
> to do is prefix your command with `global`. If for example you wanted to install PHPUnit and have it
136c104
< packages' binaries available everywhere, you'd then add the `~/.composer/vendor/bin` folder to your 
---
> packages' binaries available everywhere, you'd then add the `~/.composer/vendor/bin` folder to your
141,142c109,110
< [Packagist]: http://packagist.org/
< [Twig]: http://twig.sensiolabs.org
---
> [Packagist]: https://packagist.org/
> [Twig]: https://twig.symfony.com/
145c113
< [Learn about Composer]: http://getcomposer.org/doc/00-intro.md
---
> [Learn about Composer]: https://getcomposer.org/doc/00-intro.md
diff -r php-the-right-way-en-previous/_posts/04-03-01-PEAR.md php-the-right-way-en-master/_posts/04-03-01-PEAR.md
21c21
< You can install PEAR by downloading the `.phar` installer and executing it. The PEAR documentation has 
---
> You can install PEAR by downloading the `.phar` installer and executing it. The PEAR documentation has
24c24
< If you are using Linux, you can also have a look at your distribution package manager. Debian and Ubuntu, 
---
> If you are using Linux, you can also have a look at your distribution package manager. Debian and Ubuntu,
50c50
<             "url": "http://pear2.php.net"
---
>             "url": "https://pear2.php.net"
83,86c83,86
< [1]: http://pear.php.net/
< [2]: http://pear.php.net/manual/en/installation.getting.php
< [3]: http://pear.php.net/packages.php
< [4]: http://pear.php.net/manual/en/guide.users.commandline.channels.php
---
> [1]: https://pear.php.net/
> [2]: https://pear.php.net/manual/installation.getting.php
> [3]: https://pear.php.net/packages.php
> [4]: https://pear.php.net/manual/guide.users.commandline.channels.php
88c88
< [6]: http://getcomposer.org/doc/05-repositories.md#pear
---
> [6]: https://getcomposer.org/doc/05-repositories.md#pear
diff -r php-the-right-way-en-previous/_posts/05-03-01-Date-and-Time.md php-the-right-way-en-master/_posts/05-03-01-Date-and-Time.md
64c64
< A popular PHP API extension is [Carbon](http://carbon.nesbot.com). It inherits everything in the DateTime class, so involves minimal code alterations, but extra features include Localization support, further ways to add, subtract and format a DateTime object, plus a means to test your code by simulating a date and time of your choosing.
---
> A popular PHP API extension is [Carbon](https://carbon.nesbot.com/). It inherits everything in the DateTime class, so involves minimal code alterations, but extra features include Localization support, further ways to add, subtract and format a DateTime object, plus a means to test your code by simulating a date and time of your choosing.
69,70c69,70
< [datetime]: http://php.net/book.datetime
< [dateformat]: http://php.net/function.date
---
> [datetime]: https://secure.php.net/book.datetime
> [dateformat]: https://secure.php.net/function.date
diff -r php-the-right-way-en-previous/_posts/05-04-01-Design-Patterns.md php-the-right-way-en-master/_posts/05-04-01-Design-Patterns.md
17c17,19
< * Continue reading on [Design Patterns](/pages/Design-Patterns.html)
---
> You can learn more about PHP design patterns and see working examples at:
> 
> <https://designpatternsphp.readthedocs.io/>
diff -r php-the-right-way-en-previous/_posts/05-05-01-PHP-and-UTF8.md php-the-right-way-en-master/_posts/05-05-01-PHP-and-UTF8.md
9c9
< _This section was originally written by [Alex Cabal](https://alexcabal.com/) over at 
---
> _This section was originally written by [Alex Cabal](https://alexcabal.com/) over at
47c47
< [Multibyte String Extension]: http://php.net/book.mbstring
---
> [Multibyte String Extension]: https://secure.php.net/book.mbstring
66,69c66,73
< The browser will then need to be told by the HTTP response that this page should be considered as UTF-8. The historic
< approach to doing that was to include the [charset `<meta>` tag](http://htmlpurifier.org/docs/enduser-utf8.html) in
< your page's `<head>` tag. This approach is perfectly valid, but setting the charset in the `Content-Type` header is
< actually [much faster](https://developers.google.com/speed/docs/best-practices/rendering#SpecifyCharsetEarly).
---
> The browser will then need to be told by the HTTP response that this page should be considered as UTF-8. Today, it is common to set the character set in the HTTP response header like this:
> 
> {% highlight php %}
> <?php
> header('Content-Type: text/html; charset=UTF-8')
> {% endhighlight %}
> 
> The historic approach to doing that was to include the [charset `<meta>` tag](http://htmlpurifier.org/docs/enduser-utf8.html) in your page's `<head>` tag.
75c79
<  
---
> 
78c82
<  
---
> 
81c85
<  
---
> 
85c89
<  
---
> 
98c102
<  
---
> 
105c109
<  
---
> 
110c114
<  
---
> 
133,152c137,154
< * [PHP Manual: String Operations](http://php.net/language.operators.string)
< * [PHP Manual: String Functions](http://php.net/ref.strings)
<     * [`strpos()`](http://php.net/function.strpos)
<     * [`strlen()`](http://php.net/function.strlen)
<     * [`substr()`](http://php.net/function.substr)
< * [PHP Manual: Multibyte String Functions](http://php.net/ref.mbstring)
<     * [`mb_strpos()`](http://php.net/function.mb-strpos)
<     * [`mb_strlen()`](http://php.net/function.mb-strlen)
<     * [`mb_substr()`](http://php.net/function.mb-substr)
<     * [`mb_internal_encoding()`](http://php.net/function.mb-internal-encoding)
<     * [`mb_http_output()`](http://php.net/function.mb-http-output)
<     * [`htmlentities()`](http://php.net/function.htmlentities)
<     * [`htmlspecialchars()`](http://php.net/function.htmlspecialchars)
< * [PHP UTF-8 Cheatsheet](http://blog.loftdigital.com/blog/php-utf-8-cheatsheet)
< * [Handling UTF-8 with PHP](http://www.phpwact.org/php/i18n/utf-8)
< * [Stack Overflow: What factors make PHP Unicode-incompatible?](http://stackoverflow.com/questions/571694/what-factors-make-php-unicode-incompatible)
< * [Stack Overflow: Best practices in PHP and MySQL with international strings](http://stackoverflow.com/questions/140728/best-practices-in-php-and-mysql-with-international-strings)
< * [How to support full Unicode in MySQL databases](http://mathiasbynens.be/notes/mysql-utf8mb4)
< * [Bringing Unicode to PHP with Portable UTF-8](http://www.sitepoint.com/bringing-unicode-to-php-with-portable-utf8/)
< * [Stack Overflow: DOMDocument loadHTML does not encode UTF-8 correctly](http://stackoverflow.com/questions/8218230/php-domdocument-loadhtml-not-encoding-utf-8-correctly)
---
> * [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)
> * [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)
> * [Bringing Unicode to PHP with Portable UTF-8](https://www.sitepoint.com/bringing-unicode-to-php-with-portable-utf8/)
> * [Stack Overflow: DOMDocument loadHTML does not encode UTF-8 correctly](https://stackoverflow.com/questions/8218230/php-domdocument-loadhtml-not-encoding-utf-8-correctly)
diff -r php-the-right-way-en-previous/_posts/05-06-01-Internationalization-and-Localization.md php-the-right-way-en-master/_posts/05-06-01-Internationalization-and-Localization.md
15,16c15,16
< without refactorings. This is usually done once - preferably, in the beginning of the project, or else you'll probably
< need some huge changes in the source!
---
> without refactorings. This action is usually done once - preferably, at the beginning of the project, or else you will
> probably need some huge changes in the source!
20,21c20,21
< - **Pluralization** defines the rules needed between different languages to interoperate strings containing numbers and 
< counters. For instance, in English when you have only one item, it's singular, and anything different from that is 
---
> - **Pluralization** defines the rules required between distinct languages to interoperate strings containing numbers and 
> counters. For instance, in English when you have only one item, it is singular, and anything different from that is 
28c28
< `<h1><?=$TRANS['title_about_page']?></h1>`. This is, however, hardly a recommended way for serious projects, as it poses
---
> `<h1><?=$TRANS['title_about_page']?></h1>`. This way is, however, hardly recommended for serious projects, as it poses
33,34c33,34
< back to 1995 and is still a complete implementation for translating software. It is pretty easy to get running, while
< it still sports powerful supporting tools. It's about Gettext we will be talking here. Also, to help you not get messy
---
> back to 1995 and is still a complete implementation for translating software. It is easy enough to get running, while
> still sporting powerful supporting tools. It is about Gettext we will be talking here. Also, to help you not get messy
36d35
< files.
41c40
< install or sport additional features or i18n file formats. In this document, we focus on the tools provided with the 
---
> install or sport additional features or i18n file formats. In this document, we focus on the tools provided with the
43a43,45
> - [aura/intl][aura-intl]: Provides internationalization (I18N) tools, specifically package-oriented per-locale message
> translation. It uses array formats for message. Does not provide a message extractor, but does provide advanced
> message formatting via the `intl` extension (including pluralized messages).
46,47c48,49
< to other formats besides `.mo/.po` files. Can be useful if you need to integrate your translation files into other parts
< of the system, like a JavaScript interface.
---
> to other formats besides `.mo/.po` files. Can be useful if you need to integrate your translation files into other
> parts of the system, like a JavaScript interface.
54a57
> 
71c74
< manager; it's available for Unix, Mac, and Windows, and can be [downloaded for free on their website][poedit_download]
---
> manager; it is available for Unix, Mac, and Windows, and can be [downloaded for free on their website][poedit_download]
79c82
< binary to be interpreted by gettext when doing localization. There's also a POT (Template) file, that simply contains
---
> binary to be interpreted by gettext when doing localization. There's also a POT (Template) file, which simply contains
81,82c84,85
< files are not mandatory: depending on the tool you're using to do l10n, you can go just fine with only PO/MO files.
< You'll always have one pair of PO/MO files per language and region, but only one POT per domain.
---
> files are not mandatory: depending on the tool you are using to do l10n, you can go just fine with only PO/MO files.
> You will always have one pair of PO/MO files per language and region, but only one POT per domain.
86c89
< different meaning given a context. In those cases, you split them into different _domains_. They're basically named
---
> different meaning given a context. In those cases, you split them into different _domains_. They are, basically, named
88c91
< for simplicity, use only one domain; its name is arbitrary, but we will be using "main" for our code samples.  
---
> for simplicity, use only one domain; its name is arbitrary, but we will be using "main" for our code samples.
92c95
< A locale is simply a code that identifies one version of a language. It's defined following the [ISO 639-1][639-1] and 
---
> A locale is simply a code that identifies one version of a language. It is defined following the [ISO 639-1][639-1] and 
98c101
< between those dialects - when it's not present, it's taken as a "generic" or "hybrid" version of the language.
---
> between those dialects - when it is not present, it is taken as a "generic" or "hybrid" version of the language.
101,103c104,106
< To use Gettext, we will need to adhere to a specific structure of folders. First, you'll need to select an arbitrary
< root for your l10n files in your source repository. Inside it, you'll have a folder for each needed locale, and a fixed
< `LC_MESSAGES` folder that will contain all your PO/MO pairs. Example:
---
> To use Gettext, we will need to adhere to a specific structure of folders. First, you will need to select an arbitrary
> root for your l10n files in your source repository. Inside it, you will have a folder for each needed locale, and a
> fixed `LC_MESSAGES` folder that will contain all your PO/MO pairs. Example:
131c134
< this trouble once again. When creating a new `.po` file, you'll have to declare the [plural rules][plural] for that
---
> this trouble once again. When creating a new `.po` file, you will have to declare the [plural rules][plural] for that
133c136
< calling Gettext in code, you'll have to specify the number related to the sentence, and it will work out the correct
---
> calling Gettext in code, you will have to specify the number related to the sentence, and it will work out the correct
147c150
< When calling out Gettext to do localization on sentences with counters, you'll have to give him the
---
> When calling out Gettext to do localization on sentences with counters, you will have to give him the
153c156
< but instead the overall content, you'll learn how to edit it easily later:
---
> but with the overall content instead; you will learn how to edit it easily later:
162c165
< msgid "We're now translating some strings"
---
> msgid "We are now translating some strings"
178c181
< translation may contain the user name and visit date.  
---
> translation may contain the user name and visit date.
182,183c185,186
< directly in the sentence, by using `%d`. The plural forms always have two `msgid` (singular and plural), so it's
< advised to not use a complex language as the source of translation.
---
> directly in the sentence, by using `%d`. The plural forms always have two `msgid` (singular and plural), so it is
> advised not to use a complex language as the source of translation.
186c189
< As you might have noticed, we're using as source ID the actual sentence in English. That `msgid` is the same used
---
> As you might have noticed, we are using as source ID the actual sentence in English. That `msgid` is the same used
192,193c195,196
< 1. _`msgid` as a real sentence_.  
<     The main advantages are: 
---
> 1. _`msgid` as a real sentence_.
>     The main advantages are:
198c201
<     - it's much easier for the translator to understand what's going on and make a proper translation based on the
---
>     - it is much easier for the translator to understand what's going on and do a proper translation based on the
204c207
< 2. _`msgid` as a unique, structured key_.  
---
> 2. _`msgid` as a unique, structured key_.
207c210
<     - it's a great way to have the code organized, separating the text content from the template logic.
---
>     - it is a great way to have the code organized, separating the text content from the template logic.
212,214c215,217
<     on the said untranslated French page). That's good it as would force translation to be complete before publishing -
<     but bad as translation issues would be really awful in the interface. Some libraries, though, include an option to
<     specify a given language as "fallback", having a similar behavior as the other approach.
---
>     on the said untranslated French page). That is good it as would force translation to be complete before publishing -
>     however, bad as translation issues would be remarkably awful in the interface. Some libraries, though, include an
>     option to specify a given language as "fallback", having a similar behavior as the other approach.
216,217c219,220
< The [Gettext manual][manual] favors the first approach as, in general, it's easier for translators and users in
< case of trouble. That's how we will be working here as well. However, the [Symfony documentation][symfony-keys] favors
---
> The [Gettext manual][manual] favors the first approach as, in general, it is easier for translators and users in
> case of trouble. That is how we will be working here as well. However, the [Symfony documentation][symfony-keys] favors
221c224
< In a common application, you would use some Gettext functions while writing static text in your pages. Those sentences
---
> In a typical application, you would use some Gettext functions while writing static text in your pages. Those sentences
310,334c313,343
< To make matters easier - and one of the powerful advantages Gettext has over custom framework i18n packages - is its
< custom file type. "Oh man, that's quite hard to understand and edit by hand, a simple array would be easier!" Make no
< mistake, applications like [Poedit] are here to help - _a lot_. You can get the program from
< [their website][poedit_download], it's free and available for all platforms. It's a pretty easy tool to get used to,
< and a very powerful one at the same time - using all powerful features Gettext has available.
< 
< In the first run, you should select "File > New Catalog" from the menu. There you'll have a small screen where we will
< set the terrain so everything else runs smoothly. You'll be able to find those settings later through
< "Catalog > Properties":
< 
< - Project name and version, Translation Team and email address: useful information that goes in the `.po` file header;
< - Language: here you should use that format we mentioned before, such as `en_US` or `pt_BR`;
< - Charsets: UTF-8, preferably;
< - Source charset: set here the charset used by your PHP files - probably UTF-8 as well, right?
< - plural forms: here go those rules we mentioned before - there's a link in there with samples as well;
< - Source paths: here you must include all folders from the project where `gettext()` (and siblings) will happen - this
< is usually your templates folder(s)
< - Source keywords: this last part is filled by default, but you might need to alter it later - and is one of the
< powerful points of Gettext. The underlying software knows how the `gettext()` calls look like in several programming
< languages, but you might as well create your own translation forms. This will be discussed later in the "Tips" section.
< 
< After setting those points you'll be prompted to save the file - using that directory structure we mentioned as well,
< and then it will run a scan through your source files to find the localization calls. They'll be fed empty into the
< translation table, and you'll start typing in the localized versions of those strings. Save it and a `.mo` file will be
< (re)compiled into the same folder and ta-dah: your project is internationalized.
---
> One of the great advantages Gettext has over custom framework i18n packages is its extensive and powerful file format.
> "Oh man, that’s quite hard to understand and edit by hand, a simple array would be easier!" Make no mistake,
> applications like [Poedit] are here to help - _a lot_. You can get the program from [their website][poedit_download],
> it’s free and available for all platforms. It’s a pretty easy tool to get used to, and a very powerful one at the same
> time - using all features Gettext has available. This guide is based on PoEdit 1.8.
> 
> In the first run, you should select “File > New...” from the menu. You’ll be asked straight ahead for the language:
> here you can select/filter the language you want to translate to, or use that format we mentioned before, such as
> `en_US` or `pt_BR`.
> 
> Now, save the file - using that directory structure we mentioned as well. Then you should click “Extract from sources”,
> and here you’ll configure various settings for the extraction and translation tasks. You’ll be able to find all those
> later through “Catalog > Properties”:
> 
> - Source paths: here you must include all folders from the project where `gettext()` (and siblings) are called - this
> is usually your templates/views folder(s). This is the only mandatory setting;
> - Translation properties:
>     - Project name and version, Team and Team’s email address: useful information that goes in the .po file header;
>     - Plural forms: here go those rules we mentioned before - there’s a link in there with samples as well. You can
>     leave it with the default option most of the time, as PoEdit already includes a handy database of plural rules for
>     many languages.
>     - Charsets: UTF-8, preferably;
>     - Source code charset: set here the charset used by your codebase - probably UTF-8 as well, right?
> - Source keywords: The underlying software knows how `gettext()` and similar function calls look like in several
> programming languages, but you might as well create your own translation functions. It will be here you’ll add those
> other methods. This will be discussed later in the “Tips” section.
> 
> After setting those points it will run a scan through your source files to find all the localization calls. After every
> scan PoEdit will display a summary of what was found and what was removed from the source files. New entries will fed
> empty into the translation table, and you’ll start typing in the localized versions of those strings. Save it and a .mo
> file will be (re)compiled into the same folder and ta-dah: your project is internationalized.
337,338c346,347
< As you may have noticed before, there are two main types of localized strings: simple ones and the ones with plural
< forms. The first ones have simply two boxes: source and localized string. The source string can't be modified as
---
> As you may have noticed before, there are two main types of localized strings: simple ones and those with plural
> forms. The first ones have simply two boxes: source and localized string. The source string cannot be modified as
341c350
< string is being used.  
---
> string is being used.
348,349c357,358
< indicating it needs review, being highlighted in the list. It's also useful if you have a translation team and someone
< tries to write something they're not sure about: just mark Fuzzy and someone else will review later.
---
> indicating it needs review, appearing golden in the list. It is also useful if you have a translation team and someone
> tries to write something they are not sure about: just mark Fuzzy, and someone else will review later.
351c360
< Finally, it's advised to leave "View > Untranslated entries first" marked, as it will help you _a lot_ to not forget
---
> Finally, it is advised to leave "View > Untranslated entries first" marked, as it will help you _a lot_ to not forget
358,359c367,368
< If you're running PHP as a module on Apache (`mod_php`), you might face issues with the `.mo` file being cached. It
< happens the first time it's read, and then, to update it, you might need to restart the server. On Nginx and PHP5 it
---
> If you are running PHP as a module on Apache (`mod_php`), you might face issues with the `.mo` file being cached. It
> happens the first time it is read, and then, to update it, you might need to restart the server. On Nginx and PHP5 it
363,364c372,373
< As preferred by many people, it's easier to use `_()` instead of `gettext()`. Many custom i18n libraries from
< frameworks use something similar to `t()` as well, to make translated code shorter. However, that's the only function
---
> As preferred by many people, it is easier to use `_()` instead of `gettext()`. Many custom i18n libraries from
> frameworks use something similar to `t()` as well, to make translated code shorter. However, that is the only function
370,371c379,381
< Don't be afraid, it's very easy. It's just a field in the `.po` file, or a Settings screen on Poedit. In the editor,
< that option is inside "Catalog > Properties > Source keywords". You need to include there the specifications of those
---
> Don't be afraid; it is very easy. It is just a field in the `.po` file, or a Settings screen on Poedit. In the editor,
> that option is inside "Catalog > Properties > Source keywords". Remember: Gettext already knows the default functions
> for many languages, so don’t be afraid if that list seems empty. You need to include there the specifications of those
389c399
< * [PHP Manual: Gettext](http://php.net/manual/en/book.gettext.php)
---
> * [PHP Manual: Gettext](https://secure.php.net/manual/book.gettext.php)
398c408
< [manual]: http://www.gnu.org/software/gettext/manual/gettext.html
---
> [manual]: https://www.gnu.org/software/gettext/manual/gettext.html
400,401c410,411
< [3166-1]: http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
< [rare]: http://www.gnu.org/software/gettext/manual/gettext.html#Rare-Language-Codes
---
> [3166-1]: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
> [rare]: https://www.gnu.org/software/gettext/manual/gettext.html#Rare-Language-Codes
402a413
> [aura-intl]: https://github.com/auraphp/Aura.Intl
407,408c418,419
< [yii]: http://www.yiiframework.com/doc-2.0/guide-tutorial-i18n.html
< [intl]: http://br2.php.net/manual/en/intro.intl.php
---
> [yii]: https://www.yiiframework.com/doc/guide/2.0/en/tutorial-i18n
> [intl]: https://secure.php.net/manual/intro.intl.php
412,416c423,427
< [sprintf]: http://php.net/manual/en/function.sprintf.php
< [func]: http://php.net/manual/en/function.gettext.php
< [n_func]: http://php.net/manual/en/function.ngettext.php
< [d_func]: http://php.net/manual/en/function.dgettext.php
< [dn_func]: http://php.net/manual/en/function.dngettext.php
---
> [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
diff -r php-the-right-way-en-previous/_posts/06-01-01-Dependency-Injection.md php-the-right-way-en-master/_posts/06-01-01-Dependency-Injection.md
8c8
< From [Wikipedia](http://en.wikipedia.org/wiki/Dependency_injection):
---
> From [Wikipedia](https://wikipedia.org/wiki/Dependency_injection):
10c10
< > Dependency injection is a software design pattern that allows the removal of hard-coded dependencies and makes it 
---
> > Dependency injection is a software design pattern that allows the removal of hard-coded dependencies and makes it
diff -r php-the-right-way-en-previous/_posts/06-03-01-Complex-Problem.md php-the-right-way-en-master/_posts/06-03-01-Complex-Problem.md
18c18
< are you inverting, and where to? For example, MVC frameworks would generally provide a super object or base controller
---
> are we inverting, and where to? For example, MVC frameworks would generally provide a super object or base controller
25c25
< ### Dependency Inversion Principle
---
> ### S.O.L.I.D.
27,30c27,77
< Dependency Inversion Principle is the "D" in the S.O.L.I.D set of object oriented design principles that states one
< should *"Depend on Abstractions. Do not depend on concretions."*. Put simply, this means our dependencies should be
< interfaces/contracts or abstract classes rather than concrete implementations. We can easily refactor the above example
< to follow this principle.
---
> #### Single Responsibility Principle
> 
> The Single Responsibility Principle is about actors and high-level architecture. It states that “A class should have
> only one reason to change.” This means that every class should _only_ have responsibility over a single part of the
> functionality provided by the software. The largest benefit of this approach is that it enables improved code
> _reusability_. By designing our class to do just one thing, we can use (or re-use) it in any other program without
> changing it.
> 
> #### Open/Closed Principle
> 
> The Open/Closed Principle is about class design and feature extensions. It states that “Software entities (classes,
> modules, functions, etc.) should be open for extension, but closed for modification.” This means that we should design
> our modules, classes and functions in a way that when a new functionality is needed, we should not modify our existing
> code but rather write new code that will be used by existing code. Practically speaking, this means that we should write
> classes that implement and adhere to _interfaces_, then type-hint against those interfaces instead of specific classes.
> 
> The largest benefit of this approach is that we can very easily extend our code with support for something new without
> having to modify existing code, meaning that we can reduce QA time, and the risk for negative impact to the application
> is substantially reduced. We can deploy new code, faster, and with more confidence.
> 
> #### Liskov Substitution Principle
> 
> The Liskov Substitution Principle is about subtyping and inheritance. It states that “Child classes should never break
> the parent class’ type definitions.” Or, in Robert C. Martin’s words, “Subtypes must be substitutable for their base
> types.”
> 
> For example, if we have a `FileInterface` interface which defines an `embed()` method, and we have `Audio` and `Video`
> classes which both implement the `embed()` method, then we can expect that the usage of the `embed()` method will always
> do the thing that we intend. If we later create a `PDF` class or a `Gist` class which implement the `FileInterface`
> interface, we will already know and understand what the `embed()` method will do. The largest benefit of this approach
> is that we have the ability to build flexible and easily-configurable programs, because when we change one object of a
> type (e.g., `FileInterface`) to another we don't need to change anything else in our program.
> 
> #### Interface Segregation Principle
> 
> The Interface Segregation Principle (ISP) is about _business-logic-to-clients_ communication. It states that “No client
> should be forced to depend on methods it does not use.” This means that instead of having a single monolithic interface
> that all conforming classes need to implement, we should instead provide a set of smaller, concept-specific interfaces
> that a conforming class implements one or more of.
> 
> For example, a `Car` or `Bus` class would be interested in a `steeringWheel()` method, but a `Motorcycle` or `Tricycle`
> class would not. Conversely, a `Motorcycle` or `Tricycle` class would be interested in a `handlebars()` method, but a
> `Car` or `Bus` class would not. There is no need to have all of these types of vehicles implement support for both
> `steeringWheel()` as well as `handlebars()`, so we should break-apart the source interface.
> 
> #### Dependency Inversion Principle
> 
> The Dependency Inversion Principle is about removing hard-links between discrete classes so that new functionality can
> be leveraged by passing a different class. It states that one should *"Depend on Abstractions. Do not depend on
> concretions."*. Put simply, this means our dependencies should be interfaces/contracts or abstract classes rather than
> concrete implementations. We can easily refactor the above example to follow this principle.
53c100
< Consider that you are working in a team and the adapter is being worked on by a colleague. In our first example, we
---
> Consider that we are working in a team and the adapter is being worked on by a colleague. In our first example, we
diff -r php-the-right-way-en-previous/_posts/06-05-01-Further-Reading.md php-the-right-way-en-master/_posts/06-05-01-Further-Reading.md
11c11
< * [Dependency Injection: Huh?](http://net.tutsplus.com/tutorials/php/dependency-injection-huh/)
---
> * [Dependency Injection: Huh?](https://code.tutsplus.com/tutorials/dependency-injection-huh--net-26903)
diff -r php-the-right-way-en-previous/_posts/07-01-01-Databases.md php-the-right-way-en-master/_posts/07-01-01-Databases.md
17,19c17,19
< [mysqli]: http://php.net/mysqli
< [pgsql]: http://php.net/pgsql
< [mssql]: http://php.net/mssql
---
> [mysqli]: https://secure.php.net/mysqli
> [pgsql]: https://secure.php.net/pgsql
> [mssql]: https://secure.php.net/mssql
diff -r php-the-right-way-en-previous/_posts/07-02-01-Databases_MySQL.md php-the-right-way-en-master/_posts/07-02-01-Databases_MySQL.md
30,35c30,35
< [mysql]: http://php.net/mysql
< [mysql_deprecated]: http://php.net/migration55.deprecated
< [mysql_removed]: http://php.net/manual/en/migration70.removed-exts-sapis.php
< [mysqli]: http://php.net/mysqli
< [pdo]: http://php.net/pdo
< [mysql_api]: http://php.net/mysqlinfo.api.choosing
---
> [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
diff -r php-the-right-way-en-previous/_posts/07-03-01-Databases_PDO.md php-the-right-way-en-master/_posts/07-03-01-Databases_PDO.md
74c74
< [pdo]: http://php.net/pdo
---
> [pdo]: https://secure.php.net/pdo
76,77c76,77
< [Learn about PDO]: http://php.net/book.pdo
< [Learn about PDO connections]: http://php.net/pdo.connections
---
> [Learn about PDO]: https://secure.php.net/book.pdo
> [Learn about PDO connections]: https://secure.php.net/pdo.connections
diff -r php-the-right-way-en-previous/_posts/07-04-01-Interacting-via-Code.md php-the-right-way-en-master/_posts/07-04-01-Interacting-via-Code.md
36c36,37
< foreach (getAllFoos($db) as $row) {
---
> $results = getAllFoos($db);
> foreach ($results as $row) {
51c52
< $db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password');
---
> $db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8mb4', 'username', 'password');
89c90
<     <?= $row['field1'] ?> - <?= $row['field1'] ?>
---
>     <li><?= $row['field1'] ?> - <?= $row['field1'] ?></li>
101,103c102,104
< [MVC]: http://code.tutsplus.com/tutorials/mvc-for-noobs--net-10488
< [PHPBridge]: http://phpbridge.org/
< [Creating a Data Class]: http://phpbridge.org/intro-to-php/creating_a_data_class
---
> [MVC]: https://code.tutsplus.com/tutorials/mvc-for-noobs--net-10488
> [PHPBridge]: https://phpbridge.org/docs/
> [Creating a Data Class]: https://phpbridge.org/intro-to-php/creating_a_data_class
diff -r php-the-right-way-en-previous/_posts/07-05-01-Abstraction-Layers.md php-the-right-way-en-master/_posts/07-05-01-Abstraction-Layers.md
24,25c24,25
< [1]: http://php.net/book.pdo
< [2]: http://www.doctrine-project.org/projects/dbal.html
---
> [1]: https://secure.php.net/book.pdo
> [2]: https://www.doctrine-project.org/projects/dbal.html
29,30c29,30
< [psr0]: http://www.php-fig.org/psr/psr-0/
< [psr4]: http://www.php-fig.org/psr/psr-4/
---
> [psr0]: https://www.php-fig.org/psr/psr-0/
> [psr4]: https://www.php-fig.org/psr/psr-4/
diff -r php-the-right-way-en-previous/_posts/08-04-01-Compiled-Templates.md php-the-right-way-en-master/_posts/08-04-01-Compiled-Templates.md
71c71
< [Twig]: http://twig.sensiolabs.org/
---
> [Twig]: https://twig.symfony.com/
73,74c73,74
< [Smarty]: http://www.smarty.net/
< [Mustache]: http://mustache.github.io/
---
> [Smarty]: https://www.smarty.net/
> [Mustache]: https://mustache.github.io/
diff -r php-the-right-way-en-previous/_posts/08-05-01-Further-Reading.md php-the-right-way-en-master/_posts/08-05-01-Further-Reading.md
11,13c11,13
< * [An Introduction to Views & Templating in CodeIgniter](http://code.tutsplus.com/tutorials/an-introduction-to-views-templating-in-codeigniter--net-25648)
< * [Getting Started With PHP Templating](http://www.smashingmagazine.com/2011/10/17/getting-started-with-php-templating/)
< * [Roll Your Own Templating System in PHP](http://code.tutsplus.com/tutorials/roll-your-own-templating-system-in-php--net-16596)
---
> * [An Introduction to Views & Templating in CodeIgniter](https://code.tutsplus.com/tutorials/an-introduction-to-views-templating-in-codeigniter--net-25648)
> * [Getting Started With PHP Templating](https://www.smashingmagazine.com/2011/10/getting-started-with-php-templating/)
> * [Roll Your Own Templating System in PHP](https://code.tutsplus.com/tutorials/roll-your-own-templating-system-in-php--net-16596)
15c15
< * [Working With Templates in Symfony 2](http://code.tutsplus.com/tutorials/working-with-templates-in-symfony-2--cms-21172)
---
> * [Working With Templates in Symfony 2](https://code.tutsplus.com/tutorials/working-with-templates-in-symfony-2--cms-21172)
21c21
< * [Blade](http://laravel.com/docs/blade) *(compiled, framework specific)*
---
> * [Blade](https://laravel.com/docs/blade) *(compiled, framework specific)*
26c26
< * [PHPTAL](http://phptal.org/) *(compiled)*
---
> * [PHPTAL](https://phptal.org/) *(compiled)*
28,30c28,30
< * [Smarty](http://www.smarty.net/) *(compiled)*
< * [Twig](http://twig.sensiolabs.org/) *(compiled)*
< * [Zend\View](http://framework.zend.com/manual/2.3/en/modules/zend.view.quick-start.html) *(native, framework specific)*
---
> * [Smarty](https://www.smarty.net/) *(compiled)*
> * [Twig](https://twig.symfony.com/) *(compiled)*
> * [Zend\View](https://framework.zend.com/manual/2.3/en/modules/zend.view.quick-start.html) *(native, framework specific)*
diff -r php-the-right-way-en-previous/_posts/09-02-01-Errors.md php-the-right-way-en-master/_posts/09-02-01-Errors.md
1,2c1,2
< --- 
< isChild: true 
---
> ---
> isChild: true
90c90,91
< echo isset($foo['bar']) ? $foo['bar'] : '';
---
> //Null Coalescing Operator
> echo $foo['bar'] ?? '';
107c108
< You can also set this value at runtime with the `ini_set` function 
---
> You can also set this value at runtime with the `ini_set` function
134,135c135,136
< This is a common practice implemented by a large number of modern frameworks such as Symfony and Laravel. In debug 
< mode *(or dev mode)* both of these frameworks will display a nice and clean *stack trace*. 
---
> This is a common practice implemented by a large number of modern frameworks such as Symfony and Laravel. In debug
> mode *(or dev mode)* both of these frameworks will display a nice and clean *stack trace*.
153,160c154,161
< [Xdebug]: http://xdebug.org/docs/basic
< [Scream]: http://php.net/book.scream
< [Error Control Operators]: http://php.net/language.operators.errorcontrol
< [SitePoint]: http://www.sitepoint.com/
< [Whoops!]: http://filp.github.io/whoops/
< [errorexception]: http://php.net/class.errorexception
< [Predefined Constants for Error Handling]: http://php.net/errorfunc.constants
< [error_reporting]: http://php.net/function.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
> [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
diff -r php-the-right-way-en-previous/_posts/09-03-01-Exceptions.md php-the-right-way-en-master/_posts/09-03-01-Exceptions.md
74,76c74,76
< [exceptions]: http://php.net/language.exceptions
< [splexe]: http://php.net/spl.exceptions
< [nesting-exceptions-in-php]: http://www.brandonsavage.net/exceptional-php-nesting-exceptions-in-php/
---
> [exceptions]: https://secure.php.net/language.exceptions
> [splexe]: https://secure.php.net/spl.exceptions
> [nesting-exceptions-in-php]: https://www.brandonsavage.net/exceptional-php-nesting-exceptions-in-php/
diff -r php-the-right-way-en-previous/_posts/10-01-01-Security.md php-the-right-way-en-master/_posts/10-01-01-Security.md
5a6,8
> 
> The best resource I've found on PHP security is [The 2018 Guide to Building Secure PHP Software](https://paragonie.com/blog/2017/12/2018-guide-building-secure-php-software) by
> [Paragon Initiative](https://paragonie.com/).
diff -r php-the-right-way-en-previous/_posts/10-02-01-Web-Application-Security.md php-the-right-way-en-master/_posts/10-02-01-Web-Application-Security.md
7a8,26
> It is very important for every PHP developer to learn [the basics of web application security][4], which can be broken
> down into a handful of broad topics:
> 
> 1. Code-data separation.
>    * When data is executed as code, you get SQL Injection, Cross-Site Scripting, Local/Remote File Inclusion, etc.
>    * When code is printed as data, you get information leaks (source code disclosure or, in the case of C programs,
>      enough information to bypass [ASLR][5]).
> 2. Application logic.
>    * Missing authentication or authorization controls.
>    * Input validation.
> 3. Operating environment.
>    * PHP versions.
>    * Third party libraries.
>    * The operating system.
> 4. Cryptography weaknesses.
>    * [Weak random numbers][6].
>    * [Chosen-ciphertext attacks][7].
>    * [Side-channel information leaks][8].
> 
18c37,43
< [3]: http://phpsecurity.readthedocs.org/en/latest/index.html
---
> [3]: https://phpsecurity.readthedocs.io/en/latest/index.html
> [4]: https://paragonie.com/blog/2015/08/gentle-introduction-application-security
> [5]: http://searchsecurity.techtarget.com/definition/address-space-layout-randomization-ASLR
> [6]: https://paragonie.com/blog/2016/01/on-design-and-implementation-stealth-backdoor-for-web-applications
> [7]: https://paragonie.com/blog/2015/05/using-encryption-and-authentication-correctly
> [8]: http://blog.ircmaxell.com/2014/11/its-all-about-time.html
> 
diff -r php-the-right-way-en-previous/_posts/10-03-01-Password-Hashing.md php-the-right-way-en-master/_posts/10-03-01-Password-Hashing.md
11,15c11,20
< It is important that you properly [_hash_][3] passwords before storing them. Password hashing is an irreversible,
< one-way function performed against the user's password. This produces a fixed-length string that cannot be feasibly
< reversed. This means you can compare a hash against another to determine if they both came from the same source string,
< but you cannot determine the original string. If passwords are not hashed and your database is accessed by an
< unauthorized third-party, all user accounts are now compromised. 
---
> It is important that you properly [_hash_][3] passwords before storing them. Hashing and encrypting are [two very different things][7]
> that often get confused.
> 
> Hashing is an irreversible, one-way function. This produces a fixed-length string that cannot be feasibly reversed.
> This means you can compare a hash against another to determine if they both came from the same source string, but you
> cannot determine the original string. If passwords are not hashed and your database is accessed by an unauthorized
> third-party, all user accounts are now compromised.
> 
> Unlike hashing, encryption is reversible (provided you have the key). Encryption is useful in other areas, but is a poor
> strategy for securely storing passwords.
19c24
< Hashing and salting are vital as often users use the same password for multiple services and password quality can be poor. 
---
> Hashing and salting are vital as often users use the same password for multiple services and password quality can be poor.
21c26,35
< Fortunately, nowadays PHP makes this easy. 
---
> Additionally, you should use [a specialized _password hashing_ algoithm][6] rather than fast, general-purpose
> cryptographic hash function (e.g. SHA256). The short list of acceptable password hashing algorithms (as of June 2018)
> to use are:
> 
> * Argon2 (available in PHP 7.2 and newer)
> * Scrypt
> * **Bcrypt** (PHP provides this one for you; see below)
> * PBKDF2 with HMAC-SHA256 or HMAC-SHA512
> 
> Fortunately, nowadays PHP makes this easy.
43c57
< {% endhighlight %}  
---
> {% endhighlight %}
45c59
< `password_hash()` takes care of password salting for you. The salt is stored, along with the algorithm and "cost", as part of the hash.  `password_verify()` extracts this to determine how to check the password, so you don't need a separate database field to store your salts. 
---
> `password_hash()` takes care of password salting for you. The salt is stored, along with the algorithm and "cost", as part of the hash.  `password_verify()` extracts this to determine how to check the password, so you don't need a separate database field to store your salts.
54c68
< [1]: http://php.net/function.password-hash
---
> [1]: https://secure.php.net/function.password-hash
56c70
< [3]: http://en.wikipedia.org/wiki/Cryptographic_hash_function
---
> [3]: https://wikipedia.org/wiki/Cryptographic_hash_function
58c72,75
< [5]: https://en.wikipedia.org/wiki/Salt_(cryptography)
---
> [5]: https://wikipedia.org/wiki/Salt_(cryptography)
> [6]: https://paragonie.com/blog/2016/02/how-safely-store-password-in-2016
> [7]: https://paragonie.com/blog/2015/08/you-wouldnt-base64-a-password-cryptography-decoded
> 
diff -r php-the-right-way-en-previous/_posts/10-04-01-Data-Filtering.md php-the-right-way-en-master/_posts/10-04-01-Data-Filtering.md
65,70c65,70
< [1]: http://php.net/book.filter
< [2]: http://php.net/filter.filters.sanitize
< [3]: http://php.net/filter.filters.validate
< [4]: http://php.net/function.filter-var
< [5]: http://php.net/function.filter-input
< [6]: http://php.net/security.filesystem.nullbytes
---
> [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
72c72
< [unserialize]: https://secure.php.net/manual/en/function.unserialize.php
---
> [unserialize]: https://secure.php.net/manual/function.unserialize.php
diff -r php-the-right-way-en-previous/_posts/10-06-01-Register-Globals.md php-the-right-way-en-master/_posts/10-06-01-Register-Globals.md
18c18
< * [Register_globals in the PHP manual](http://php.net/security.globals)
---
> * [Register_globals in the PHP manual](https://secure.php.net/security.globals)
diff -r php-the-right-way-en-previous/_posts/10-07-01-Error-Reporting.md php-the-right-way-en-master/_posts/10-07-01-Error-Reporting.md
26c26
< > [php.net](http://php.net/function.error-reporting)
---
> > [php.net](https://secure.php.net/function.error-reporting)
52,55c52,55
< * [error_reporting](http://php.net/errorfunc.configuration#ini.error-reporting)
< * [display_errors](http://php.net/errorfunc.configuration#ini.display-errors)
< * [display_startup_errors](http://php.net/errorfunc.configuration#ini.display-startup-errors)
< * [log_errors](http://php.net/errorfunc.configuration#ini.log-errors)
---
> * [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)
diff -r php-the-right-way-en-previous/_posts/11-02-01-Test-Driven-Development.md php-the-right-way-en-master/_posts/11-02-01-Test-Driven-Development.md
8c8
< From [Wikipedia](http://en.wikipedia.org/wiki/Test-driven_development):
---
> From [Wikipedia](https://wikipedia.org/wiki/Test-driven_development):
35c35
< [PHPUnit](http://phpunit.de) is the de-facto testing framework for writing unit tests for PHP applications, but there
---
> [PHPUnit](https://phpunit.de/) is the de-facto testing framework for writing unit tests for PHP applications, but there
40c40
< * [Peridot](http://peridot-php.github.io/)
---
> * [Peridot](https://peridot-php.github.io/)
45c45
< From [Wikipedia](http://en.wikipedia.org/wiki/Integration_testing):
---
> From [Wikipedia](https://wikipedia.org/wiki/Integration_testing):
65,68c65,68
< * [Selenium](http://seleniumhq.com)
< * [Mink](http://mink.behat.org)
< * [Codeception](http://codeception.com) is a full-stack testing framework that includes acceptance testing tools
< * [Storyplayer](http://datasift.github.io/storyplayer) is a full-stack testing framework that includes support for creating and destroying test environments on demand
---
> * [Selenium](https://docs.seleniumhq.org/)
> * [Mink](http://mink.behat.org/)
> * [Codeception](https://codeception.com/) is a full-stack testing framework that includes acceptance testing tools
> * [Storyplayer](https://datasift.github.io/storyplayer/) is a full-stack testing framework that includes support for creating and destroying test environments on demand
diff -r php-the-right-way-en-previous/_posts/11-03-01-Behavior-Driven-Development.md php-the-right-way-en-master/_posts/11-03-01-Behavior-Driven-Development.md
28,31c28,31
< [Cucumber]: http://cukes.info/
< [PHPSpec]: http://www.phpspec.net/
< [RSpec]: http://rspec.info/
< [Codeception]: http://codeception.com/
---
> [Cucumber]: https://cucumber.io/
> [PHPSpec]: https://www.phpspec.net/
> [RSpec]: https://rspec.info/
> [Codeception]: https://codeception.com/
diff -r php-the-right-way-en-previous/_posts/11-04-01-Complementary-Testing-Tools.md php-the-right-way-en-master/_posts/11-04-01-Complementary-Testing-Tools.md
16a17,18
> * [php-mock]  is a library to help to mock PHP native functions.
> * [Infection] is a PHP implementation of [Mutation Testing] to help to measure the effectiveness of your tests.
19c21
< [Selenium]: http://seleniumhq.org/
---
> [Selenium]: https://www.seleniumhq.org/
22,23c24,25
< [PHPUnit]: http://phpunit.de/
< [PHPSpec]: http://www.phpspec.net/
---
> [PHPUnit]: https://phpunit.de/
> [PHPSpec]: https://www.phpspec.net/
24a27,29
> [php-mock]: https://github.com/php-mock/php-mock
> [Infection]: https://github.com/infection/infection
> [Mutation Testing]: https://en.wikipedia.org/wiki/Mutation_testing
diff -r php-the-right-way-en-previous/_posts/12-03-01-Virtual-or-Dedicated-Servers.md php-the-right-way-en-master/_posts/12-03-01-Virtual-or-Dedicated-Servers.md
24c24
< PHP and Apache have a long history together. Apache is wildly configurable and has many available 
---
> PHP and Apache have a long history together. Apache is wildly configurable and has many available
48,49c48,49
< [nginx]: http://nginx.org/
< [phpfpm]: http://php.net/install.fpm
---
> [nginx]: https://nginx.org/
> [phpfpm]: https://secure.php.net/install.fpm
51,56c51,56
< [apache-modules]: http://httpd.apache.org/docs/2.4/mod/
< [prefork MPM]: http://httpd.apache.org/docs/2.4/mod/prefork.html
< [worker MPM]: http://httpd.apache.org/docs/2.4/mod/worker.html
< [event MPM]: http://httpd.apache.org/docs/2.4/mod/event.html
< [apache]: http://httpd.apache.org/
< [apache-MPM]: http://httpd.apache.org/docs/2.4/mod/mpm_common.html
---
> [apache-modules]: https://httpd.apache.org/docs/2.4/mod/
> [prefork MPM]: https://httpd.apache.org/docs/2.4/mod/prefork.html
> [worker MPM]: https://httpd.apache.org/docs/2.4/mod/worker.html
> [event MPM]: https://httpd.apache.org/docs/2.4/mod/event.html
> [apache]: https://httpd.apache.org/
> [apache-MPM]: https://httpd.apache.org/docs/2.4/mod/mpm_common.html
58c58
< [mod_fcgid]: http://httpd.apache.org/mod_fcgid/
---
> [mod_fcgid]: hhttps://httpd.apache.org/mod_fcgid/
diff -r php-the-right-way-en-previous/_posts/12-05-01-Building-your-Application.md php-the-right-way-en-master/_posts/12-05-01-Building-your-Application.md
31c31,33
< [Capistrano] is a system for *intermediate-to-advanced programmers* to execute commands in a structured, repeatable way on one or more remote machines. It is pre-configured for deploying Ruby on Rails applications, however you can successfully deploy PHP systems with it. Successful use of Capistrano depends on a working knowledge of Ruby and Rake. Dave Gardner's blog post [PHP Deployment with Capistrano][phpdeploy_capistrano] is a good starting point for PHP developers interested in Capistrano.
---
> [Capistrano] is a system for *intermediate-to-advanced programmers* to execute commands in a structured, repeatable way on one or more remote machines. It is pre-configured for deploying Ruby on Rails applications, however you can successfully deploy PHP systems with it. Successful use of Capistrano depends on a working knowledge of Ruby and Rake.
> 
> [Ansistrano] is a couple of Ansible roles to easily manage the deployment process (deploy and rollback) for scripting applications such as PHP, Python and Ruby. It's an Ansible port for [Capistrano]. It's been used by quite a lot of PHP companies already.
42d43
< * [Expert PHP Deployments][expert_php_deployments] - free book on deployment with Capistrano, Phing and Vagrant.
51c52
< [Puppet] is a tool that has its own language and file types for managing servers and configurations. It can be used in a master/client setup or it can be used in a "master-less" mode. In the master/client mode the clients will poll the central master(s) for new configuration on set intervals and update itself if necessary. In the master-less mode you can push changes to your nodes. 
---
> [Puppet] is a tool that has its own language and file types for managing servers and configurations. It can be used in a master/client setup or it can be used in a "master-less" mode. In the master/client mode the clients will poll the central master(s) for new configuration on set intervals and update itself if necessary. In the master-less mode you can push changes to your nodes.
84,90c85,90
< 
< [buildautomation]: http://en.wikipedia.org/wiki/Build_automation
< [Phing]: http://www.phing.info/
< [Apache Ant]: http://ant.apache.org/
< [Capistrano]: https://github.com/capistrano/capistrano/wiki
< [phpdeploy_capistrano]: http://www.davegardner.me.uk/blog/2012/02/13/php-deployment-with-capistrano/
< [phpdeploy_deployer]: http://www.sitepoint.com/deploying-php-applications-with-deployer/
---
> [buildautomation]: https://wikipedia.org/wiki/Build_automation
> [Phing]: https://www.phing.info/
> [Apache Ant]: https://ant.apache.org/
> [Capistrano]: http://capistranorb.com/
> [Ansistrano]: https://ansistrano.com
> [phpdeploy_deployer]: https://www.sitepoint.com/deploying-php-applications-with-deployer/
95c95
< [apache_ant_tutorial]: http://net.tutsplus.com/tutorials/other/automate-your-projects-with-apache-ant/
---
> [apache_ant_tutorial]: https://code.tutsplus.com/tutorials/automate-your-projects-with-apache-ant--net-18595
97,100c97,100
< [Jenkins]: http://jenkins-ci.org/
< [PHPCI]: http://www.phptesting.org/
< [Teamcity]: http://www.jetbrains.com/teamcity/
< [Deployer]: http://deployer.org/
---
> [Jenkins]: https://jenkins.io/
> [PHPCI]: https://www.phptesting.org/
> [Teamcity]: https://www.jetbrains.com/teamcity/
> [Deployer]: https://deployer.org/
102,104c102,103
< [Magallanes]: http://magephp.com/
< [expert_php_deployments]: http://viccherubini.com/assets/Expert-PHP-Deployments.pdf
< [deploying_php_applications]: http://www.deployingphpapplications.com
---
> [Magallanes]: https://www.magephp.com/
> [deploying_php_applications]: https://deployingphpapplications.com/
diff -r php-the-right-way-en-previous/_posts/13-02-01-Vagrant.md php-the-right-way-en-master/_posts/13-02-01-Vagrant.md
31,32c31,32
< [Vagrant]: http://vagrantup.com/
< [Puppet]: http://www.puppetlabs.com/
---
> [Vagrant]: https://www.vagrantup.com/
> [Puppet]: https://puppet.com/
36c36
< [Protobox]: http://getprotobox.com/
---
> [Protobox]: https://www.getprotobox.com/
diff -r php-the-right-way-en-previous/_posts/13-03-01-Docker.md php-the-right-way-en-master/_posts/13-03-01-Docker.md
14c14
< Docker may help if you're developing multiple websites and want the separation that comes from installing each on it's own virtual machine, but don't have the necessary disk space or the time to keep everything up to date.  It's efficient: the installation and downloads are quicker, you only need to store one copy of each image however often it's used, containers need less RAM and share the same OS kernel, so you can have more servers running simultaneously, and it takes a matter of seconds to stop and start them, no need to wait for a full server boot. 
---
> Docker may help if you're developing multiple websites and want the separation that comes from installing each on it's own virtual machine, but don't have the necessary disk space or the time to keep everything up to date.  It's efficient: the installation and downloads are quicker, you only need to store one copy of each image however often it's used, containers need less RAM and share the same OS kernel, so you can have more servers running simultaneously, and it takes a matter of seconds to stop and start them, no need to wait for a full server boot.
39c39
< [Docker]: http://docker.com/
---
> [Docker]: https://www.docker.com/
42,43c42,43
< [docker-install]: https://docs.docker.com/installation/
< [docker-doc]: https://docs.docker.com/userguide/
---
> [docker-install]: https://docs.docker.com/install/
> [docker-doc]: https://docs.docker.com/
diff -r php-the-right-way-en-previous/_posts/14-02-01-Opcode-Cache.md php-the-right-way-en-master/_posts/14-02-01-Opcode-Cache.md
8c8
< When a PHP file is executed, it must first be compiled into [opcodes](http://php.net/manual/en/internals2.opcodes.php) (machine language instructions for the CPU). If the source code is unchanged, the opcodes will be the same, so this compilation step becomes a waste of CPU resources.
---
> When a PHP file is executed, it must first be compiled into [opcodes](https://secure.php.net/manual/internals2.opcodes.php) (machine language instructions for the CPU). If the source code is unchanged, the opcodes will be the same, so this compilation step becomes a waste of CPU resources.
12c12
< It's likely an opcode cache will make a significant speed improvement to your application.  Since PHP 5.5 there is one built in - [Zend OPcache][opcache-book]. Depending on your PHP package/distribution, it's usually turned on by default - check [opcache.enable](http://php.net/manual/en/opcache.configuration.php#ini.opcache.enable) and the output of `phpinfo()` to make sure. For earlier versions there's a PECL extension.
---
> It's likely an opcode cache will make a significant speed improvement to your application.  Since PHP 5.5 there is one built in - [Zend OPcache][opcache-book]. Depending on your PHP package/distribution, it's usually turned on by default - check [opcache.enable](https://secure.php.net/manual/opcache.configuration.php#ini.opcache.enable) and the output of `phpinfo()` to make sure. For earlier versions there's a PECL extension.
24,26c24,26
< [opcache-book]: http://php.net/book.opcache
< [APC]: http://php.net/book.apc
< [XCache]: http://xcache.lighttpd.net/
---
> [opcache-book]: https://secure.php.net/book.opcache
> [APC]: https://secure.php.net/book.apc
> [XCache]: https://xcache.lighttpd.net/
28,29c28,29
< [WinCache]: http://www.iis.net/download/wincacheforphp
< [PHP_accelerators]: http://en.wikipedia.org/wiki/List_of_PHP_accelerators
---
> [WinCache]: https://www.iis.net/downloads/microsoft/wincache-extension
> [PHP_accelerators]: https://wikipedia.org/wiki/List_of_PHP_accelerators
diff -r php-the-right-way-en-previous/_posts/14-03-01-Object-Caching.md php-the-right-way-en-master/_posts/14-03-01-Object-Caching.md
51,55c51,55
< * [APC Functions](http://php.net/ref.apc)
< * [Memcached](http://memcached.org/)
< * [Redis](http://redis.io/)
< * [XCache APIs](http://xcache.lighttpd.net/wiki/XcacheApi)
< * [WinCache Functions](http://php.net/ref.wincache)
---
> * [APC Functions](https://secure.php.net/ref.apc)
> * [Memcached](https://memcached.org/)
> * [Redis](https://redis.io/)
> * [XCache APIs](https://xcache.lighttpd.net/wiki/XcacheApi)
> * [WinCache Functions](https://secure.php.net/ref.wincache)
diff -r php-the-right-way-en-previous/_posts/15-02-01-PHPDoc.md php-the-right-way-en-master/_posts/15-02-01-PHPDoc.md
73,79c73,79
< [tags]: http://www.phpdoc.org/docs/latest/references/phpdoc/tags/index.html
< [PHPDoc manual]: http://www.phpdoc.org/docs/latest/index.html
< [@author]: http://www.phpdoc.org/docs/latest/references/phpdoc/tags/author.html
< [@link]: http://www.phpdoc.org/docs/latest/references/phpdoc/tags/link.html
< [@param]: http://www.phpdoc.org/docs/latest/references/phpdoc/tags/param.html
< [@return]: http://www.phpdoc.org/docs/latest/references/phpdoc/tags/return.html
< [@throws]: http://www.phpdoc.org/docs/latest/references/phpdoc/tags/throws.html
---
> [tags]: https://docs.phpdoc.org/references/phpdoc/tags/index.html
> [PHPDoc manual]: https://docs.phpdoc.org/index.html
> [@author]: https://docs.phpdoc.org/references/phpdoc/tags/author.html
> [@link]: https://docs.phpdoc.org/references/phpdoc/tags/link.html
> [@param]: https://docs.phpdoc.org/references/phpdoc/tags/param.html
> [@return]: https://docs.phpdoc.org/references/phpdoc/tags/return.html
> [@throws]: https://docs.phpdoc.org/references/phpdoc/tags/throws.html
diff -r php-the-right-way-en-previous/_posts/16-02-01-From-the-Source.md php-the-right-way-en-master/_posts/16-02-01-From-the-Source.md
9,10c9,10
< * [PHP Website](http://php.net/)
< * [PHP Documentation](http://php.net/docs.php)
---
> * [PHP Website](https://secure.php.net/)
> * [PHP Documentation](https://secure.php.net/docs.php)
diff -r php-the-right-way-en-previous/_posts/16-03-01-People-to-Follow.md php-the-right-way-en-master/_posts/16-03-01-People-to-Follow.md
11,12c11
< find a comprehensive list of PHP community members and their
< Twitter handles at:
---
> find an abbreviated list of PHP community members to get you started at:
14,19c13,14
< * [New Relic: 25 PHP Developers to Follow Online][php-developers-to-follow]
< * [OGProgrammer: How to get connected with the PHP community][og-twitter-list]
< 
< 
< [php-developers-to-follow]: https://blog.newrelic.com/2014/05/02/25-php-developers-follow-online/
< [og-twitter-list]: https://www.ogprogrammer.com/2017/06/28/how-to-get-connected-with-the-php-community/
---
> * <https://www.ogprogrammer.com/2017/06/28/how-to-get-connected-with-the-php-community/>
> * <https://twitter.com/CalEvans/lists/phpeople>
diff -r php-the-right-way-en-previous/_posts/16-04-01-Mentoring.md php-the-right-way-en-master/_posts/16-04-01-Mentoring.md
8c8
< * [php-mentoring.org](http://php-mentoring.org/) - Formal, peer to peer mentoring in the PHP community.
---
> * [php-mentoring.org](https://php-mentoring.org/) - Formal, peer to peer mentoring in the PHP community.
diff -r php-the-right-way-en-previous/_posts/16-05-01-PHP-PaaS-Providers.md php-the-right-way-en-master/_posts/16-05-01-PHP-PaaS-Providers.md
9d8
< * [PagodaBox](https://pagodabox.io/)
11,14d9
< * [Heroku](https://devcenter.heroku.com/categories/php)
< * [fortrabbit](https://www.fortrabbit.com/)
< * [Engine Yard Cloud](https://www.engineyard.com/features)
< * [Red Hat OpenShift Platform](https://www.openshift.com/)
16c11,13
< * [Windows Azure](http://www.windowsazure.com/)
---
> * [Cloudways](https://www.cloudways.com/)
> * [Engine Yard Cloud](https://www.engineyard.com/features)
> * [fortrabbit](https://www.fortrabbit.com/)
18c15,20
< * [Jelastic](http://jelastic.com/)
---
> * [Heroku](https://devcenter.heroku.com/categories/php-support)
> * [IBM Cloud](https://console.bluemix.net/docs/runtimes/php/getting-started.html#getting_started)
> * [Jelastic](https://jelastic.com/)
> * [Microsoft Azure](https://azure.microsoft.com/)
> * [Nanobox](https://nanobox.io/)
> * [Pivotal Web Services](https://run.pivotal.io/)
20,22c22
< * [Cloudways](https://www.cloudways.com/en/)
< * [IBM Bluemix Cloud Foundry](https://console.ng.bluemix.net/)
< * [Pivotal Web Service Cloud Foundry](https://run.pivotal.io/)
---
> * [Red Hat OpenShift](https://www.openshift.com/)
diff -r php-the-right-way-en-previous/_posts/16-06-01-Frameworks.md php-the-right-way-en-master/_posts/16-06-01-Frameworks.md
22,23c22,23
< Many frameworks add a considerable number of features on top of what is available in a micro-framework and these are
< known Full-Stack Frameworks. These often come bundled with ORMs, Authentication packages, etc.
---
> Many frameworks add a considerable number of features on top of what is available in a micro-framework; these are
> called Full-Stack Frameworks. These often come bundled with ORMs, Authentication packages, etc.
27,28d26
< 
< * [Popular PHP Frameworks](https://github.com/codeguy/php-the-right-way/wiki/Frameworks)
\ No newline at end of file
diff -r php-the-right-way-en-previous/_posts/16-07-01-Components.md php-the-right-way-en-master/_posts/16-07-01-Components.md
22a23,29
> * CakePHP Components
>     * [Collection]
>     * [Database]
>     * [Datasource]
>     * [Event]
>     * [I18n]
>     * [ORM]   
25d31
< * [Orno]
41c47
< [Aura]: http://auraphp.com/framework/2.x/en/
---
> [Aura]: http://auraphp.com/framework/
44,46c50,51
< [Orno]: https://github.com/orno
< [Symfony Components]: http://symfony.com/doc/current/components/index.html
< [The League of Extraordinary Packages]: http://thephpleague.com/
---
> [Symfony Components]: https://symfony.com/doc/current/components/index.html
> [The League of Extraordinary Packages]: https://thephpleague.com/
50a56,61
> [Collection]: https://github.com/cakephp/collection
> [Database]: https://github.com/cakephp/database
> [Datasource]: https://github.com/cakephp/datasource
> [Event]: https://github.com/cakephp/event
> [I18n]: https://github.com/cakephp/i18n
> [ORM]: https://github.com/cakephp/orm
diff -r php-the-right-way-en-previous/_posts/16-08-01-Sites.md php-the-right-way-en-master/_posts/16-08-01-Sites.md
21a22
> 
26,30c27,31
< * [JavaScript Weekly](http://javascriptweekly.com)
< * [HTML5 Weekly](http://html5weekly.com)
< * [Mobile Web Weekly](http://mobilewebweekly.co)
< * There are also Weeklies on other platforms you might be interested in; here's
< [a list of some](https://github.com/jondot/awesome-weekly).
---
> * [JavaScript Weekly](https://javascriptweekly.com/)
> * [Frontend Focus](https://frontendfoc.us/)
> * [Mobile Web Weekly](https://mobiledevweekly.com/)
> 
> There are also Weeklies on other platforms you might be interested in; here's [a list of some](https://github.com/jondot/awesome-weekly).
34c35
< * [PHP Developer blog](http://blog.phpdeveloper.org/)
---
> * [PHP Developer blog](https://blog.phpdeveloper.org/)
diff -r php-the-right-way-en-previous/_posts/16-09-01-Videos.md php-the-right-way-en-master/_posts/16-09-01-Videos.md
17,20c17,20
< * [Standards and Best practices](http://teamtreehouse.com/library/standards-and-best-practices)
< * [PHP Training on Pluralsight](http://www.pluralsight.com/search/?searchTerm=php)
< * [PHP Training on Lynda.com](http://www.lynda.com/search?q=php)
< * [PHP Training on Tutsplus](http://code.tutsplus.com/categories/php/courses)
---
> * [Standards and Best practices](https://teamtreehouse.com/library/php-standards-and-best-practices)
> * [PHP Training on Pluralsight](https://www.pluralsight.com/search?q=php)
> * [PHP Training on Lynda.com](https://www.lynda.com/search?q=php)
> * [PHP Training on Tutsplus](https://code.tutsplus.com/categories/php/courses)
diff -r php-the-right-way-en-previous/_posts/16-10-01-Books.md php-the-right-way-en-master/_posts/16-10-01-Books.md
34,35d33
< * [The Grumpy Programmer's Guide To Building Testable PHP Applications](https://leanpub.com/grumpy-testing) - Learning
< to write testable code doesn't have to suck.
diff -r php-the-right-way-en-previous/_posts/17-01-01-Community.md php-the-right-way-en-master/_posts/17-01-01-Community.md
17c17
< [php-irc]: http://webchat.freenode.net/?channels=phpc
---
> [php-irc]: https://webchat.freenode.net/?channels=phpc
20,21c20,21
< [php-so]: http://stackoverflow.com/questions/tagged/php
< [php-calendar]: http://php.net/cal.php
---
> [php-so]: https://stackoverflow.com/questions/tagged/php
> [php-calendar]: https://secure.php.net/cal.php
diff -r php-the-right-way-en-previous/_posts/17-02-01-User-Groups.md php-the-right-way-en-master/_posts/17-02-01-User-Groups.md
9,11c9,11
< the [usergroup-list at php.net][php-uglist] which is based upon [PHP.ug][php-ug]. Alternate sources might be
< [Meetup.com][meetup] or a search for ```php user group near me``` using your favorite search engine
< (i.e. [Google][google]). If you live in a smaller town, there may not be a local PUG; if that's the case, start one!
---
> [PHP.ug][php-ug]. Alternate sources might be [Meetup.com][meetup] or a search for ```php user group near me```
> using your favorite search engine (i.e. [Google][google]). If you live in a smaller town, there may not be a
> local PUG; if that's the case, start one!
23c23
< [php-ug]: http://php.ug/
---
> [php-ug]: https://php.ug/
27d26
< [php-uglist]: http://php.net/ug.php
diff -r php-the-right-way-en-previous/_posts/17-03-01-Conferences.md php-the-right-way-en-master/_posts/17-03-01-Conferences.md
15c15
< [php-conf]: http://php.net/conferences/index.php
---
> [php-conf]: https://secure.php.net/conferences/index.php
diff -r php-the-right-way-en-previous/_posts/17-04-01-Elephpants.md php-the-right-way-en-master/_posts/17-04-01-Elephpants.md
13,14c13,14
< [elephpant]: http://php.net/elephpant.php
< [vincent-pontier-interview]: http://7php.com/elephpant/
---
> [elephpant]: https://secure.php.net/elephpant.php
> [vincent-pontier-interview]: https://7php.com/elephpant/
petk commented 2 years ago

This has been resolved.