Modern PHP: Difference between revisions

From Rixort Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 22: Line 22:


The <code>--dev</code> flag ensures that PHPUnit is installed as a development dependency, because you don't want to run it in production (doing so would be a bad idea from a security perspective).
The <code>--dev</code> flag ensures that PHPUnit is installed as a development dependency, because you don't want to run it in production (doing so would be a bad idea from a security perspective).
== Strict typing ==
By default, PHP attempts to cast/coerce the data passed to a function into the type required. For example, if a function expects a string and you pass an integer, PHP will cast the integer to a string (e.g. 10 becomes '10'). Most of the time this doesn't present any problems, and it can make life easier to begin with when developing web applications (e.g. the contents of <code>$_GET</code> and <code>$_POST</code> are usually strings, so it saves you have to explicitly cast these to other types).
However, occasionally this automatic casting can cause subtle bugs. To prevent this, you can enable strict typing by including the following line at the top of every PHP file:
declare(strict_types=1);
Unfortunately this line has to be added to every file in order to have full effect. Strict typing cannot be enabled by configuration options in <code>php.ini</code>, and it is not the same as <code>E_STRICT</code>.


== Generators ==
== Generators ==

Revision as of 08:52, 29 May 2018

Composer

You should commit composer.json and composer.lock into version control.

composer install will install the exact versions specified in composer.lock. This ensures that all developers working on the same project are using the same versions. composer update will update all installed packages to their latest versions and update the composer.lock file.

Project directory structure

In the root directory:

  • src - PHP source code (classes).
  • tests - PHPUnit tests.
  • composer.json - Composer dependencies and configuration.
  • phpunit.xml - PHPUnit configuration.
  • .travis.yml - Continuous integration configuration.

Testing

The standard tool for testing PHP is PHPUnit. It can be installed with the following command:

composer require --dev phpunit/phpunit

The --dev flag ensures that PHPUnit is installed as a development dependency, because you don't want to run it in production (doing so would be a bad idea from a security perspective).

Strict typing

By default, PHP attempts to cast/coerce the data passed to a function into the type required. For example, if a function expects a string and you pass an integer, PHP will cast the integer to a string (e.g. 10 becomes '10'). Most of the time this doesn't present any problems, and it can make life easier to begin with when developing web applications (e.g. the contents of $_GET and $_POST are usually strings, so it saves you have to explicitly cast these to other types).

However, occasionally this automatic casting can cause subtle bugs. To prevent this, you can enable strict typing by including the following line at the top of every PHP file:

declare(strict_types=1);

Unfortunately this line has to be added to every file in order to have full effect. Strict typing cannot be enabled by configuration options in php.ini, and it is not the same as E_STRICT.

Generators

Generators are similar to iterators that calculate their values on demand, thus potentially using fewer resources. They can be created using the yield keyword, e.g.:

function my_generator()
{
  yield 1;
  yield 2;
  yield 3;
}

Generators are forward-only iterators, i.e. you can only request the next value, not the previous, next but one etc. They are useful for iterating sequential data sets such as reading a file line by line (in order).

Autoloading

The original mechanism for autoloading was the magic function __autoload(). This is no longer recommended and is deprecated in PHP 7.x.

The successor to __autoload() is spl_autoload_register(). This in turn has been replaced by PSR-0, then PSR-4. Composer will generate a PSR-4 autoloader for you.

Built-in web server

PHP comes with a built-in web server which is useful for development purposes, although it should never be used in production.

  • Configuration directives: -c config/php.ini

Useful dependencies

  • FastRoute
  • aura/router or league/route
  • aura/filter, respect/validation, symfony/validator
  • mbstring extension, provides mb_ functions such as mb_strlen
  • filp/whoops - pretty printing of exceptions and errors
  • monolog/monolog

Links