chillerlan/php-qrcode
Generate and read QR codes in PHP. Supports Model 2 QR codes (versions 1–40), ECC levels L/M/Q/H, mixed encoding modes, and multiple output formats. Includes a QR code reader based on a PHP port of ZXing.
The following methods (property getters) have been deprecated in favor of asymmetric visibility, which is available as of PHP 8.4 and which is the minimum requirement of the next major version (v7) of php-qrcode.
The QRMatrix class will see an addition of a magic getter that emulates the future behaviour as an upgrade path, the other methods are only used internally and will see no such addition for the time being.
| method | replacement |
|---|---|
BitBuffer::getBuffer() |
BitBuffer::$buffer |
BitBuffer::getLength() |
BitBuffer::$length |
Detector::getFinderPatterns() |
Detector::$finderPatterns |
EccLevel::getLevel() |
EccLevel::$level |
ECICharset::getID() |
ECICharset::$charsetID |
FinderPattern::getCount() |
FinderPattern::$count |
GenericGFPoly::getCoefficients() |
GenericGFPoly::$coefficients |
LuminanceSourceInterface::getHeight() |
LuminanceSourceInterface::$height |
LuminanceSourceInterface::getWidth() |
LuminanceSourceInterface::$width |
LuminanceSourceInterface::getLuminances() |
LuminanceSourceInterface::$luminances |
MaskPattern::getPattern() |
MaskPattern::$currentPattern |
QRData::getBitBuffer() |
QRData::$bitBuffer |
QRMatrix::getEccLevel() |
QRMatrix::$eccLevel |
QRMatrix::getMaskPattern() |
QRMatrix::$maskPattern |
QRMatrix::getMatrix() |
QRMatrix::$matrix |
QRMatrix::getSize() |
QRMatrix::$moduleCount |
QRMatrix::getVersion() |
QRMatrix::$version |
ResultPoint::getEstimatedModuleSize() |
ResultPoint::$estimatedModuleSize |
ResultPoint::getX() |
ResultPoint::$x |
ResultPoint::getY() |
ResultPoint::$y |
Version::getVersionNumber() |
Version::$versionNumber |
The following properties as well as the method copyVars() in QROutputAbstract will be removed in v7 without replacement,
as they only existed to improve performance by circumventing the magic getters in the QROptions class - these are replaced by (set) property hooks where unnecessary overhead is reduced. Some of the built-in output classes may see the re-addition of some of these properties locally, depending on the performance impact.
QROutputAbstract::$excludeFromConnect
QROutputAbstract::$keepAsSquare
QROutputAbstract::$connectPaths
QROutputAbstract::$eol
QROutputAbstract::$drawCircularModules
QROutputAbstract::$drawLightModules
QROutputAbstract::$circleRadius
These changes are already in dev-main.
Hi, I've kept you waiting for too long now, so I'm going to release it "as is". Originally I planned to add support for creating Structured Append QR Codes but I'm currently lacking the mental capacity to wrap my head around this concept (a method to calculate the parity already exists in the code, feel free to submit a PR!).
Once again, a big thank you to everyone who submitted issue reports and opened discussions and helped to improve this library!
IMPORTANT: v6 will be branched out and the main branch will remain the active development branch towards v7. 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.
For feedback and questions please head over to the linked discussion!
QRCode constructor now also accepts an iterable as options, which is handed over to a new QROptions instance internally.QRMatrix::getBooleanMatrix() from QRMatrix::getMatrix() to remove type ambiguity, the optional parameter $boolean has been removed.benchmark branch).QROptionsTrait)
QROptions::$outputType and the related constants in QROutputInterface have been removed. The output type is now specified via QROptions::$outputInterface with the default value of QRMarkupSVG::class. (#223).QRCodeReaderOptionsTrait.QROptions::$eccLevel now also accepts the string values L, M, Q, H (case-insensitive) - these will be converted internally to the respective integers. (#160).QROptions::$scale (module scaling for several raster image output classes) is now clamped between 1 and 50.QROutputInterface and child classes)
$transform of the method QROutputAbstract::collectModules(Closure $transform) has been removed in favor of a method QROutputAbstract::moduleTransform():mixed|null which is called with the same parameters.QRInterventionImage (intervention/image) output.QRMarkupXML including an XSD schema qrcode.schema.xsd.QRStringJSON overhaul, similar to XML output, including a JSON schema qrcode.schema.json.QRGdImageAVIF.QRFpdf::dump(): allow using external FPDF instance.CssColorModuleValueTrait and RGBArrayModuleValueTrait for use in custom output classes.imagedestroy() deprecation)$transform of the method QROutputAbstract::collectModules(Closure $transform) has been deprecated in favor of the newly introduced method QROutputAbstract::moduleTransform() with the same parameters as the anonymous closure. The parameter will be removed in v6.empty() have been replaced with more precise checks.AlphaNum string validator and added additional tests (#313)FPDF instance as second optional parameter.gitattributes file (#234)ReedSolomonDecoder now throws a QRCodeDecoderException instead of the generic QRCodeException.gitattributes file (#234)QRMatrix) and type safety (MaskPattern) improvementsHi! 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!
ext-gd or ext-imagick) required anymore!src into an <img> tag. This can be disabled by setting QROptions::$outputBase64 to false.QROptions::$imageTransparent has been set to false due to various issues and misconceptions with transparency in GD and ImageMagick, therefore: use at your own risk.QRMatrix::M_* constants and therefore the keys of the QROptions::$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).QRMarkup has been changed to abstract, inheritors are now QRMarkupHTML and QRMarkupSVG (QRMarkupXML anyone?).fill-opacity attribute (and its respective setting QROptions::$svgOpacity) has been removed from QRMarkupSVG::path() as it can be set by CSS.QROptions::$markupDark and QROptions::$markupLight settings have been removed - they can be set via overriding QRMarkup::getDefaultModuleValue().QROptions::$textDark and QROptions::$textLight settings have been removed - they can be set via overriding QRString::getDefaultModuleValue().QROutputInterface::moduleValueIsValid() is now public 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.QROptions::$jpegQuality and QROptions::$pngCompression have been deprecated in favor of the more generic QROptions::$quality.QROptions::$svgUseFillAttributes has been added to toggle fill attributes on the SVG <path> elements in QRMarkupSVG::path() (this was previously done via setting QROptions::$markupDark and QROptions::$markupLight to an empty value).Maintenance release
This release serves as the final v4.x release and as an intermediate to v5 (unless something weird happens and I have to backport a bugfix or so...) - both versions support PHP 7.4+, so there's actually no reason to hold onto v4.x unless you're running extensive custom output classes, in which case this release is for you.
QRMatrix::M_*_DARK constants for convenience (v5 backport). These constants should have been added way earlier as the current way to specify the QROptions:$moduleValues is highly unintuitive..editorconfigQRMatrix::M_DARKMODULE and QRMatrix::M_FINDER_DOT to reflect their supposed dark values, QRMatrix::M_DARKMODULE_LIGHT and QRMatrix::M_FINDER_DOT_LIGHT have been added with the original values as placeholders for reflectance reversal. This change is backward incompatible, however, the worst that can happen is that the module values (if specified) will fall back to their internal defaults.QROptions::$textDark and QROptions::$textLight from 🔴 and ⭕ to ██ and ░░, respectively. (see here)public and examples namespaces from autoload-devIt's here! The main public API is finished so far. What's left is some cleanup and documenting. Check out the release notes and feel free to leave feedback in the linked discussion thread. Thanks!
{
"minimum-stability": "beta",
"prefer-stable": true,
"require": {
"php": "^7.4 || ^8.0",
"chillerlan/php-qrcode": "5.0-beta"
}
}
QRCode::isByte(): string "0" fails with empty()chillerlan/php-settings-container: ^2.1.4 to fix a PHP 8.1 deprecation warning. See https://github.com/chillerlan/php-settings-container/discussions/2strtolower() (#97)Service release:
v4.3.x will be branched out from here in favor of v5 on main.
This is a fire-and-forget release! Reminder that PHP 7.2 is already EOL and 7.3 is EOL by December 2021. Fix your composer.json requirements now!
Fixes:
Note: this is the final 4.x release. (i don't know why the workflow run failed this time for v4 and i won't fix it - it didn't fail when it was committed...)
:sparkles: One Million Edition :sparkles:
New features:
QRMatrix::setLogoSpace() (example), added constant QRMatrix::M_LOGO (#52)QRMatrix::M_FINDER_DOT (#52)resource , GdImage, Imagick, FPDF) from QROutputInterface::dump() via QROptions::$returnResourceQROptions::$imageBase64 to false.Fixes & cleanup:
mb_internal_encoding() as it had no effect here anywaysext-gd and ext-imagick when initializing the respective output modules(deleted & re-released as the previous 3.4.0 tag pointed to the 4.x branch. sorry for any inconvenience, i am dumb.)
:sparkles: One Million Edition :sparkles:
New features:
QRMatrix::setLogoSpace() (example), added constant QRMatrix::M_LOGO (#52)QRMatrix::M_FINDER_DOT (#52)resource , GdImage, Imagick, FPDF) from QROutputInterface::dump() via QROptions::$returnResourceFixes & cleanup:
mb_internal_encoding() as it had no effect here anywaysext-gd and ext-imagick when initializing the respective output modulesphpunit.xml to support the new formatext-gd and ext-json optional (removed from composer.json). Please note that ext-gd is still necessary for the default output method that is png.$x and $y were swapped) - see #45 for more information$x and $y were swapped) - see #45 for more information$x and $y were swapped) - see #45 for more information$x and $y were swapped) - see #45 for more information[@param](https://github.com/param) and [@return](https://github.com/return) tags from docblocksQROptions::$imageTransparencyBG expects now array input only (int[]) and cuts off exceeding itemsQRMatrix::init() to quickly initialize a matrix object for the given versionQRMatrix::getMask() bugfix (x and y swapped for mask pattern 0b001 and 0b010) and fixed the corresponding testQRDataInterface::*_CHAR_MAP to CHAR_MAP_*BitBuffer - no more public properties!\PHPUnit\Framework\TestCase::assert*ext-gd (markup output can be run without GD or Imagick)$x and $y were flipped)$x and $y were flipped)QROptions::$dataMode to allow overriding the data type detection (see #39)The next major release will target PHP 7.4+!
How can I help you explore Laravel packages today?