Skip to content

Commit

Permalink
Merge pull request #35 from Elao/php71/autodiscover_public_consts_only
Browse files Browse the repository at this point in the history
AutoDiscoveredValuesTrait: do only autodiscover public constants
  • Loading branch information
ogizanagi authored Jun 30, 2017
2 parents 3c882f5 + 0206253 commit ca906f5
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 2 deletions.
11 changes: 9 additions & 2 deletions src/AutoDiscoveredValuesTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,18 @@ public static function values(): array
$enumType = static::class;

if (!isset(self::$guessedValues[$enumType])) {
$values = (new \ReflectionClass($enumType))->getConstants();
$r = new \ReflectionClass($enumType);
$values = $r->getConstants();

if (PHP_VERSION_ID >= 70100) {
$values = array_filter($values, function (string $k) use ($r) {
return $r->getReflectionConstant($k)->isPublic();
}, ARRAY_FILTER_USE_KEY);
}

if (is_a($enumType, FlaggedEnum::class, true)) {
$values = array_filter($values, function ($v) {
return 0 === ($v & $v - 1) && $v > 0;
return is_int($v) && 0 === ($v & $v - 1) && $v > 0;
});
}

Expand Down
26 changes: 26 additions & 0 deletions tests/Fixtures/Enum/Php71AutoDiscoveredEnum.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

/*
* This file is part of the "elao/enum" package.
*
* Copyright (C) 2016 Elao
*
* @author Elao <contact@elao.com>
*/

namespace Elao\Enum\Tests\Fixtures\Enum;

use Elao\Enum\AutoDiscoveredValuesTrait;
use Elao\Enum\Enum;

final class Php71AutoDiscoveredEnum extends Enum
{
use AutoDiscoveredValuesTrait;

public const FOO = 'foo';
public const BAR = 'bar';
public const BAZ = 'baz';

private const PRIVATE = 'private';
protected const PROTECTED = 'protected';
}
10 changes: 10 additions & 0 deletions tests/Unit/AutoDiscoveredValuesTraitTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
use Elao\Enum\AutoDiscoveredValuesTrait;
use Elao\Enum\Enum;
use Elao\Enum\FlaggedEnum;
use Elao\Enum\Tests\Fixtures\Enum\Php71AutoDiscoveredEnum;

class AutoDiscoveredValuesTraitTest extends \PHPUnit_Framework_TestCase
{
Expand All @@ -21,6 +22,14 @@ public function testItAutoDiscoveredValuesBasedOnAvailableConstants()
$this->assertSame(['foo', 'bar', 'baz'], AutoDiscoveredEnum::values());
}

/**
* @requires PHP 7.1
*/
public function testPHP71ItAutoDiscoveredValuesBasedOnAvailableConstants()
{
$this->assertSame(['foo', 'bar', 'baz'], Php71AutoDiscoveredEnum::values());
}

public function testItAutoDiscoveredValuesBasedOnAvailableBitFlagConstants()
{
$this->assertSame([1, 2, 4], AutoDiscoveredFlaggedEnum::values());
Expand All @@ -45,4 +54,5 @@ final class AutoDiscoveredFlaggedEnum extends FlaggedEnum
const BAZ = 4;

const NOT_A_BIT_FLAG = 3;
const NOT_EVEN_AN_INT = 'not_even_an_int';
}

0 comments on commit ca906f5

Please sign in to comment.