diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fed4af2d..42049106 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -31,6 +31,8 @@ jobs: - '8.1' - '8.2' - '8.3' + - '8.4' + - '8.5' steps: - name: Checkout code uses: actions/checkout@v3 @@ -60,7 +62,7 @@ jobs: - name: SonarQube Scan (Push) if: matrix.version == '8.2' && github.event_name == 'push' - uses: SonarSource/sonarcloud-github-action@v1.9 + uses: SonarSource/sonarcloud-github-action@v3 env: SONAR_TOKEN: ${{ secrets.SONARQUBE_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -72,7 +74,7 @@ jobs: - name: SonarQube Scan (Pull Request) if: matrix.version == '8.2' && github.event_name == 'pull_request' - uses: SonarSource/sonarcloud-github-action@v1.9 + uses: SonarSource/sonarcloud-github-action@v3 env: SONAR_TOKEN: ${{ secrets.SONARQUBE_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/CHANGES.txt b/CHANGES.txt index e75e9697..ca646cfb 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,6 @@ +7.4.0 (Apr 15, 2026) + - Added support for PHP 8.5 version, removing deprecated warning messages. + 7.3.0 (May 14, 2024) - Added support for targeting rules based on semantic versions (https://semver.org/). - Added the logic to handle correctly when the SDK receives an unsupported Matcher type. diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..c879112d --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,171 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + 1. Definitions. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/NOTICE.txt b/NOTICE.txt new file mode 100644 index 00000000..7d7d845e --- /dev/null +++ b/NOTICE.txt @@ -0,0 +1,5 @@ +Harness Feature Management JavaScript SDK Copyright 2024-2026 Harness Inc. + +This product includes software developed at Harness Inc. (https://harness.io/). + +This product includes software originally developed by Split Software, Inc. (https://www.split.io/). Copyright 2015-2024 Split Software, Inc. diff --git a/README.md b/README.md index daa54d57..bf2edba0 100644 --- a/README.md +++ b/README.md @@ -8,11 +8,11 @@ This SDK is designed to work with Split, the platform for controlled rollouts, which serves features to your users via feature flags to manage your complete customer experience. ## Compatibility -This SDK is compatible with PHP 7.3 and above. +This SDK is compatible with PHP 7.3 and above, including PHP 8.4 and 8.5. ## Getting started Below is a simple example that describes the instantiation and most basic usage of our SDK. -Keep in mind that since PHP does not have the ability to share memory between processes the use of the [split-synchronizer](https://help.split.io/hc/en-us/articles/360019686092-Split-Synchronizer) is mandatory for this SDK. +Keep in mind that since PHP does not have the ability to share memory between processes the use of the [split-synchronizer](https://developer.harness.io/docs/feature-management-experimentation/sdks-and-infrastructure/optional-infra/split-synchronizer/) is mandatory for this SDK. ```php logLevel = $this->logLevels[$level]; diff --git a/src/SplitIO/Engine.php b/src/SplitIO/Engine.php index d539fe8c..f4cd9b28 100644 --- a/src/SplitIO/Engine.php +++ b/src/SplitIO/Engine.php @@ -21,7 +21,7 @@ class Engine * @param array|null $attributes * @return array */ - public static function getTreatment($matchingKey, $bucketingKey, SplitGrammar $split, array $attributes = null) + public static function getTreatment($matchingKey, $bucketingKey, SplitGrammar $split, ?array $attributes = null) { if ($bucketingKey === null) { $bucketingKey = $matchingKey; diff --git a/src/SplitIO/Grammar/Condition.php b/src/SplitIO/Grammar/Condition.php index 7266c5e3..3d40083f 100644 --- a/src/SplitIO/Grammar/Condition.php +++ b/src/SplitIO/Grammar/Condition.php @@ -68,7 +68,7 @@ public function __construct(array $condition) * @param array|null $attributes * @return bool */ - public function match($key, array $attributes = null, $bucketingKey = null) + public function match($key, ?array $attributes = null, $bucketingKey = null) { $eval = array(); foreach ($this->matcherGroup as $matcher) { diff --git a/src/SplitIO/Sdk/Client.php b/src/SplitIO/Sdk/Client.php index 0b7e2dd5..e21432d4 100644 --- a/src/SplitIO/Sdk/Client.php +++ b/src/SplitIO/Sdk/Client.php @@ -74,7 +74,7 @@ private function createImpression($key, $featureFlag, $treatment, $changeNumber, * * @return null|mixed */ - private function doInputValidationForTreatment($key, $featureFlagName, array $attributes = null, $operation) + private function doInputValidationForTreatment($key, $featureFlagName, $operation, ?array $attributes = null) { $key = InputValidator::validateKey($key, $operation); if (is_null($key)) { @@ -112,7 +112,7 @@ private function doEvaluation($operation, $key, $featureFlagName, $attributes) { $default = array('treatment' => TreatmentEnum::CONTROL, 'config' => null); - $inputValidation = $this->doInputValidationForTreatment($key, $featureFlagName, $attributes, $operation); + $inputValidation = $this->doInputValidationForTreatment($key, $featureFlagName, $operation, $attributes); if (is_null($inputValidation)) { return $default; } @@ -169,7 +169,7 @@ private function doEvaluation($operation, $key, $featureFlagName, $attributes) /** * @inheritdoc */ - public function getTreatment($key, $featureName, array $attributes = null) + public function getTreatment($key, $featureName, ?array $attributes = null) { try { $result = $this->doEvaluation( @@ -188,7 +188,7 @@ public function getTreatment($key, $featureName, array $attributes = null) /** * @inheritdoc */ - public function getTreatmentWithConfig($key, $featureFlagName, array $attributes = null) + public function getTreatmentWithConfig($key, $featureFlagName, ?array $attributes = null) { try { return $this->doEvaluation( @@ -213,7 +213,7 @@ public function getTreatmentWithConfig($key, $featureFlagName, array $attributes * * @return null|mixed */ - private function doInputValidationForTreatments($key, $featureFlagNames, array $attributes = null, $operation) + private function doInputValidationForTreatments($key, $featureFlagNames, $operation, ?array $attributes = null) { $featureFlags = InputValidator::validateFeatureFlagNames($featureFlagNames, $operation); if (is_null($featureFlags)) { @@ -264,7 +264,7 @@ private function registerData($impressions, $attributes) */ private function doEvaluationForTreatments($operation, $key, $featureFlagNames, $attributes) { - $inputValidation = $this->doInputValidationForTreatments($key, $featureFlagNames, $attributes, $operation); + $inputValidation = $this->doInputValidationForTreatments($key, $featureFlagNames, $operation, $attributes); if (is_null($inputValidation)) { return array(); } @@ -301,7 +301,7 @@ private function doEvaluationForTreatments($operation, $key, $featureFlagNames, /** * @inheritdoc */ - public function getTreatments($key, $featureFlagNames, array $attributes = null) + public function getTreatments($key, $featureFlagNames, ?array $attributes = null) { try { return array_map( @@ -325,7 +325,7 @@ function ($feature) { /** * @inheritdoc */ - public function getTreatmentsWithConfig($key, $featureFlagNames, array $attributes = null) + public function getTreatmentsWithConfig($key, $featureFlagNames, ?array $attributes = null) { try { return $this->doEvaluationForTreatments( @@ -396,7 +396,7 @@ public function track($key, $trafficType, $eventType, $value = null, $properties return false; } - public function getTreatmentsByFlagSets($key, $flagSets, array $attributes = null) + public function getTreatmentsByFlagSets($key, $flagSets, ?array $attributes = null) { try { return array_map( @@ -416,7 +416,7 @@ function ($feature) { } } - public function getTreatmentsWithConfigByFlagSets($key, $flagSets, array $attributes = null) + public function getTreatmentsWithConfigByFlagSets($key, $flagSets, ?array $attributes = null) { try { return $this->doEvaluationByFlagSets( @@ -431,7 +431,7 @@ public function getTreatmentsWithConfigByFlagSets($key, $flagSets, array $attrib } } - public function getTreatmentsByFlagSet($key, $flagSet, array $attributes = null) + public function getTreatmentsByFlagSet($key, $flagSet, ?array $attributes = null) { try { return array_map( @@ -451,7 +451,7 @@ function ($feature) { } } - public function getTreatmentsWithConfigByFlagSet($key, $flagSet, array $attributes = null) + public function getTreatmentsWithConfigByFlagSet($key, $flagSet, ?array $attributes = null) { try { return $this->doEvaluationByFlagSets( @@ -466,7 +466,7 @@ public function getTreatmentsWithConfigByFlagSet($key, $flagSet, array $attribut } } - private function doInputValidationByFlagSets($key, $flagSets, array $attributes = null, $operation) + private function doInputValidationByFlagSets($key, $flagSets, $operation, ?array $attributes = null) { $key = InputValidator::validateKey($key, $operation); if (is_null($key) || !InputValidator::validAttributes($attributes, $operation)) { @@ -487,7 +487,7 @@ private function doInputValidationByFlagSets($key, $flagSets, array $attributes private function doEvaluationByFlagSets($operation, $key, $flagSets, $attributes) { - $inputValidation = $this->doInputValidationByFlagSets($key, $flagSets, $attributes, $operation); + $inputValidation = $this->doInputValidationByFlagSets($key, $flagSets, $operation, $attributes); if (is_null($inputValidation)) { return array(); } diff --git a/src/SplitIO/Sdk/ClientInterface.php b/src/SplitIO/Sdk/ClientInterface.php index d661d143..36cb950b 100644 --- a/src/SplitIO/Sdk/ClientInterface.php +++ b/src/SplitIO/Sdk/ClientInterface.php @@ -36,7 +36,7 @@ interface ClientInterface * @param $attributes * @return string */ - public function getTreatment($key, $featureFlagName, array $attributes = null); + public function getTreatment($key, $featureFlagName, ?array $attributes = null); /** * Returns an object with the treatment to show this id for this feature @@ -76,7 +76,7 @@ public function getTreatment($key, $featureFlagName, array $attributes = null); * @param $attributes * @return array */ - public function getTreatmentWithConfig($key, $featureFlagName, array $attributes = null); + public function getTreatmentWithConfig($key, $featureFlagName, ?array $attributes = null); /** * Returns an associative array which each key will be @@ -109,7 +109,7 @@ public function getTreatmentWithConfig($key, $featureFlagName, array $attributes * @param $attributes * @return array */ - public function getTreatments($key, $featureFlagNames, array $attributes = null); + public function getTreatments($key, $featureFlagNames, ?array $attributes = null); /** * Returns an associative array which each key will be @@ -144,7 +144,7 @@ public function getTreatments($key, $featureFlagNames, array $attributes = null) * @param $attributes * @return array */ - public function getTreatmentsWithConfig($key, $featureFlagNames, array $attributes = null); + public function getTreatmentsWithConfig($key, $featureFlagNames, ?array $attributes = null); /** * Returns an associative array which each key will be @@ -172,7 +172,7 @@ public function getTreatmentsWithConfig($key, $featureFlagNames, array $attribut * @param $attributes * @return array */ - public function getTreatmentsWithConfigByFlagSets($key, $flagSets, array $attributes = null); + public function getTreatmentsWithConfigByFlagSets($key, $flagSets, ?array $attributes = null); /** * Returns an associative array which each key will be @@ -200,7 +200,7 @@ public function getTreatmentsWithConfigByFlagSets($key, $flagSets, array $attrib * @param $attributes * @return array */ - public function getTreatmentsByFlagSets($key, $flagSets, array $attributes = null); + public function getTreatmentsByFlagSets($key, $flagSets, ?array $attributes = null); /** * Returns an associative array which each key will be @@ -234,7 +234,7 @@ public function getTreatmentsByFlagSets($key, $flagSets, array $attributes = nul * @param $attributes * @return array */ - public function getTreatmentsByFlagSet($key, $flagSet, array $attributes = null); + public function getTreatmentsByFlagSet($key, $flagSet, ?array $attributes = null); /** * Returns an associative array which each key will be @@ -262,7 +262,7 @@ public function getTreatmentsByFlagSet($key, $flagSet, array $attributes = null) * @param $attributes * @return array */ - public function getTreatmentsWithConfigByFlagSet($key, $flagSet, array $attributes = null); + public function getTreatmentsWithConfigByFlagSet($key, $flagSet, ?array $attributes = null); /** * A short-hand for diff --git a/src/SplitIO/Sdk/Evaluator.php b/src/SplitIO/Sdk/Evaluator.php index 5e754d6d..a403278d 100644 --- a/src/SplitIO/Sdk/Evaluator.php +++ b/src/SplitIO/Sdk/Evaluator.php @@ -63,7 +63,7 @@ private function fetchFeatureFlagNamesByFlagSets($flagSets) return array_values(array_unique($toReturn)); } - public function evaluateFeature($matchingKey, $bucketingKey, $featureName, array $attributes = null) + public function evaluateFeature($matchingKey, $bucketingKey, $featureName, ?array $attributes = null) { $timeStart = Metrics::startMeasuringLatency(); $split = $this->fetchSplit($featureName); @@ -72,7 +72,7 @@ public function evaluateFeature($matchingKey, $bucketingKey, $featureName, array return $toReturn; } - public function evaluateFeatures($matchingKey, $bucketingKey, array $featureNames, array $attributes = null) + public function evaluateFeatures($matchingKey, $bucketingKey, array $featureNames, ?array $attributes = null) { $toReturn = array( 'evaluations' => array(), @@ -86,7 +86,7 @@ public function evaluateFeatures($matchingKey, $bucketingKey, array $featureName return $toReturn; } - public function evaluateFeaturesByFlagSets($matchingKey, $bucketingKey, array $flagSets, array $attributes = null) + public function evaluateFeaturesByFlagSets($matchingKey, $bucketingKey, array $flagSets, ?array $attributes = null) { $timeStart = Metrics::startMeasuringLatency(); $featureFlagNames = $this->fetchFeatureFlagNamesByFlagSets($flagSets); @@ -95,7 +95,7 @@ public function evaluateFeaturesByFlagSets($matchingKey, $bucketingKey, array $f return $toReturn; } - private function evalTreatment($key, $bucketingKey, $split, array $attributes = null) + private function evalTreatment($key, $bucketingKey, $split, ?array $attributes = null) { $result = array( 'treatment' => TreatmentEnum::CONTROL, diff --git a/src/SplitIO/Sdk/LocalhostClient.php b/src/SplitIO/Sdk/LocalhostClient.php index b9e13a83..d0ac56fe 100644 --- a/src/SplitIO/Sdk/LocalhostClient.php +++ b/src/SplitIO/Sdk/LocalhostClient.php @@ -136,7 +136,7 @@ public function doValidation($key, $featureFlagName, $operation) /** * @inheritdoc */ - public function getTreatment($key, $featureFlagName, array $attributes = null) + public function getTreatment($key, $featureFlagName, ?array $attributes = null) { $key = $this->doValidation($key, $featureFlagName, "getTreatment"); if (is_null($key)) { @@ -157,7 +157,7 @@ public function getTreatment($key, $featureFlagName, array $attributes = null) /** * @inheritdoc */ - public function getTreatmentWithConfig($key, $featureFlagName, array $attributes = null) + public function getTreatmentWithConfig($key, $featureFlagName, ?array $attributes = null) { $treatmentResult = array( "treatment" => TreatmentEnum::CONTROL, @@ -189,7 +189,7 @@ public function getTreatmentWithConfig($key, $featureFlagName, array $attributes /** * @inheritdoc */ - public function getTreatments($key, $featureFlagNames, array $attributes = null) + public function getTreatments($key, $featureFlagNames, ?array $attributes = null) { $result = array(); @@ -213,7 +213,7 @@ public function getTreatments($key, $featureFlagNames, array $attributes = null) /** * @inheritdoc */ - public function getTreatmentsWithConfig($key, $featureFlagNames, array $attributes = null) + public function getTreatmentsWithConfig($key, $featureFlagNames, ?array $attributes = null) { $result = array(); @@ -258,25 +258,25 @@ public function track($key, $trafficType, $eventType, $value = null) return true; } - public function getTreatmentsWithConfigByFlagSets($key, $flagSets, array $attributes = null) + public function getTreatmentsWithConfigByFlagSets($key, $flagSets, ?array $attributes = null) { // no-op return array(); } - public function getTreatmentsByFlagSets($key, $flagSets, array $attributes = null) + public function getTreatmentsByFlagSets($key, $flagSets, ?array $attributes = null) { // no-op return array(); } - public function getTreatmentsWithConfigByFlagSet($key, $flagSet, array $attributes = null) + public function getTreatmentsWithConfigByFlagSet($key, $flagSet, ?array $attributes = null) { // no-op return array(); } - public function getTreatmentsByFlagSet($key, $flagSet, array $attributes = null) + public function getTreatmentsByFlagSet($key, $flagSet, ?array $attributes = null) { // no-op return array(); diff --git a/src/SplitIO/Version.php b/src/SplitIO/Version.php index 6637d136..5b14e040 100644 --- a/src/SplitIO/Version.php +++ b/src/SplitIO/Version.php @@ -3,5 +3,5 @@ class Version { - const CURRENT = '7.3.0'; + const CURRENT = '7.4.0'; }