Passed
Pull Request — master (#22)
by Théo
02:53
created

OpenSslExceptionFactory::reset()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 12
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 12
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 7
nc 3
nop 1
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the box project.
7
 *
8
 * (c) Kevin Herrera <[email protected]>
9
 *     Théo Fidry <[email protected]>
10
 *
11
 * This source file is subject to the MIT license that is bundled
12
 * with this source code in the file LICENSE.
13
 */
14
15
namespace KevinGH\Box\Exception;
16
17
use Exception;
0 ignored issues
show
Bug introduced by
This use statement conflicts with another class in this namespace, KevinGH\Box\Exception\Exception. Consider defining an alias.

Let?s assume that you have a directory layout like this:

.
|-- OtherDir
|   |-- Bar.php
|   `-- Foo.php
`-- SomeDir
    `-- Foo.php

and let?s assume the following content of Bar.php:

// Bar.php
namespace OtherDir;

use SomeDir\Foo; // This now conflicts the class OtherDir\Foo

If both files OtherDir/Foo.php and SomeDir/Foo.php are loaded in the same runtime, you will see a PHP error such as the following:

PHP Fatal error:  Cannot use SomeDir\Foo as Foo because the name is already in use in OtherDir/Foo.php

However, as OtherDir/Foo.php does not necessarily have to be loaded and the error is only triggered if it is loaded before OtherDir/Bar.php, this problem might go unnoticed for a while. In order to prevent this error from surfacing, you must import the namespace with a different alias:

// Bar.php
namespace OtherDir;

use SomeDir\Foo as SomeDirFoo; // There is no conflict anymore.
Loading history...
18
19
/**
20
 * The OpenSSL exceptions API is a bit lacking/inconvenient to use so this factory mostly serves as an helper to get
21
 * around it.
22
 *
23
 * @private
24
 */
25
final class OpenSslExceptionFactory
26
{
27
    public static function createForLastError(): Exception
28
    {
29
        return new Exception(openssl_error_string());
30
    }
31
32
    /**
33
     * Clears the error buffer, preventing unassociated error messages from being used by the `lastError()` method. This
34
     * is required for `lastError()` to function properly. If the clearing loop continues beyond a certain number, a
35
     * warning will be triggered before the loop is broken.
36
     *
37
     * @param int $count the maximum number of rounds
38
     */
39
    public static function reset(int $count = 100): void
40
    {
41
        $counter = 0;
42
43
        while (openssl_error_string()) {
44
            if ($count < ++$counter) {
45
                trigger_error(
46
                    "The OpenSSL error clearing loop has exceeded $count rounds.",
47
                    E_USER_WARNING
48
                );
49
50
                break;
51
            }
52
        }
53
    }
54
}
55