Hi! It's been a while since the last major version - has it already been over three years and seven million downloads??? Time flies...
v5 was supposed to be released earlier this year already, but various health issues kept me from working on it and I kept y'all waiting and using dev-main
and the v5-beta
instead - but hey, the wait is over now!
The new version comes with countless internal changes, mostly to incooperate the ZXing QR Code reader and open the possibility for other types of barcodes, such as micro QR.
A lot of things have been deprecated and moved in order to clean up for v6 which is intended to support PHP 8.2+ (or maybe 8.3+ even). See the attached discussion thread for a full list of changes and deprecations.
IMPORTANT: v5 will be branched out and the main
branch will become (or rather remain) the active development branch towards v6. If you have used the composer version dev-main
without a commit hash in the past, please make sure to update the requirement ASAP. You have been warned.
Also, a big thank you to everyone who submitted issue reports and opened discussions and helped to improve this library!
New Features
- QR Code reader based on a PHP port of the ZXing library
- MIT and Apache 2.0 dual licensing to accommodate the ZXing related files, see: NOTICE
- Proper mixed mode support (several data mode segments can appear in the same QR symbol)
- Simplified Chinese (Hanzi/GB2312) support according to GBT18284-2000
- ECI mode support
Structured append mode(not yet...)
- Full "reversed reflectance" support (inverted matrix colors)
- Encapsulated Postscript (EPS) output
- An all new documentation at https://php-qrcode.readthedocs.io/ in favor over the wiki
- A truckload of new examples
Changes
- [breaking] The default output has been changed from PNG (GdImage) to SVG. No image processing extension (
ext-gd
orext-imagick
) required anymore! - [breaking] The default output format of the built-in output classes is now a base64 data URI (if applicable) so that it can be directly embedded as
src
into an<img>
tag. This can be disabled by settingQROptions::$outputBase64
tofalse
. - [breaking] The default value of
QROptions::$imageTransparent
has been set tofalse
due to various issues and misconceptions with transparency in GD and ImageMagick, therefore: use at your own risk. - [breaking] The values of the
QRMatrix::M_*
constants and therefore the keys of theQROptions::$moduleValues
array have changed.QRMatrix::M_*_DARK
constants have been introduced for convenience. The module values are now a proper bitmask, the dark value is now calculated(QRMatrix::M_* | QRMatrix::IS_DARK)
instead of(QRMatrix::M_* << 8)
. - [breaking] The output class
QRMarkup
has been changed toabstract
, inheritors are nowQRMarkupHTML
andQRMarkupSVG
(QRMarkupXML
anyone?). - [possibly breaking] The
fill-opacity
attribute (and its respective settingQROptions::$svgOpacity
) has been removed fromQRMarkupSVG::path()
as it can be set by CSS. - [possibly breaking] The
QROptions::$markupDark
andQROptions::$markupLight
settings have been removed - they can be set via overridingQRMarkup::getDefaultModuleValue()
. - [possibly breaking] The
QROptions::$textDark
andQROptions::$textLight
settings have been removed - they can be set via overridingQRString::getDefaultModuleValue()
. - The module value validation method
QROutputInterface::moduleValueIsValid()
is nowpublic static
, so that input values can be checked before invoking the options, e.g.QRMarkupSVG::moduleValueIsValid('#aabbcc')
. Please note that in case of HTML and SVG it will only check for the basic syntax, it will not validate or sanitize the values. - The GD output class now also supports BMP and WEBP output.
- The formerly GD exclusive options
QROptions::$jpegQuality
andQROptions::$pngCompression
have been deprecated in favor of the more genericQROptions::$quality
. - The setting
QROptions::$svgUseFillAttributes
has been added to togglefill
attributes on the SVG<path>
elements inQRMarkupSVG::path()
(this was previously done via settingQROptions::$markupDark
andQROptions::$markupLight
to an empty value).