SourceFactory   A
last analyzed

Complexity

Total Complexity 10

Size/Duplication

Total Lines 79
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Importance

Changes 0
Metric Value
wmc 10
c 0
b 0
f 0
lcom 1
cbo 3
dl 0
loc 79
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A getInstance() 0 11 3
A setSourceClasses() 0 18 3
B getInstanceByClassName() 0 23 4
1
<?php
2
declare(strict_types=1);
3
4
namespace Crossjoin\Browscap\Source;
5
6
use Crossjoin\Browscap\Exception\BrowscapException;
7
use Crossjoin\Browscap\Exception\InvalidArgumentException;
8
use Crossjoin\Browscap\Exception\UnexpectedValueException;
9
10
/**
11
 * Class SourceFactory
12
 *
13
 * @package Crossjoin\Browscap\Source
14
 * @author Christoph Ziegenberg <[email protected]>
15
 * @link https://github.com/crossjoin/browscap
16
 */
17
class SourceFactory
18
{
19
    const DEFAULT_CLASSES = [
20
        '\Crossjoin\Browscap\Source\Ini\BrowscapOrg',
21
        '\Crossjoin\Browscap\Source\Ini\PhpSetting',
22
    ];
23
24
    protected static $sourceClasses = self::DEFAULT_CLASSES;
25
26
    /**
27
     * @return SourceInterface
28
     * @throws UnexpectedValueException
29
     */
30
    public static function getInstance() : SourceInterface
31
    {
32
        foreach (static::$sourceClasses as $className) {
33
            $instance = static::getInstanceByClassName($className);
34
            if ($instance !== null) {
35
                return $instance;
36
            }
37
        }
38
39
        return new None();
40
    }
41
42
    /**
43
     * @param array $fullyQualifiedClassNames
44
     *
45
     * @throws InvalidArgumentException
46
     */
47
    public static function setSourceClasses(array $fullyQualifiedClassNames)
48
    {
49
        $rememberClasses = self::$sourceClasses;
50
51
        self::$sourceClasses = [];
52
        foreach ($fullyQualifiedClassNames as $className) {
53
            if (is_string($className)) {
54
                self::$sourceClasses[] = $className;
55
            } else {
56
                // Reset to previous value on error
57
                self::$sourceClasses = $rememberClasses;
58
59
                throw new InvalidArgumentException(
60
                    "A value in the class name array is of type '" . gettype($className) . "'. String expected."
61
                );
62
            }
63
        }
64
    }
65
66
    /**
67
     * @param string $className
68
     *
69
     * @return SourceInterface|null
70
     * @throws UnexpectedValueException
71
     */
72
    protected static function getInstanceByClassName(string $className)
73
    {
74
        if (class_exists($className)) {
75
            $interface = '\Crossjoin\Browscap\Source\SourceFactoryInterface';
76
            $interfaces = class_implements($className);
77
            if (array_key_exists(ltrim($interface, '\\'), $interfaces)) {
78
                try {
79
                    return new $className();
80
                } catch (BrowscapException $e) {
81
                    // Ignore exception, because we just return NULL on failure
82
                }
83
            } else {
84
                throw new UnexpectedValueException(
85
                    "Class '$className' has to implement the interface '$interface'.",
0 ignored issues
show
Coding Style Best Practice introduced by
As per coding-style, please use concatenation or sprintf for the variable $className instead of interpolation.

It is generally a best practice as it is often more readable to use concatenation instead of interpolation for variables inside strings.

// Instead of
$x = "foo $bar $baz";

// Better use either
$x = "foo " . $bar . " " . $baz;
$x = sprintf("foo %s %s", $bar, $baz);
Loading history...
Coding Style Best Practice introduced by
As per coding-style, please use concatenation or sprintf for the variable $interface instead of interpolation.

It is generally a best practice as it is often more readable to use concatenation instead of interpolation for variables inside strings.

// Instead of
$x = "foo $bar $baz";

// Better use either
$x = "foo " . $bar . " " . $baz;
$x = sprintf("foo %s %s", $bar, $baz);
Loading history...
86
                    1459069587
87
                );
88
            }
89
        } else {
90
            throw new UnexpectedValueException("Class '$className' doesn't exist.", 1459069588);
0 ignored issues
show
Coding Style Best Practice introduced by
As per coding-style, please use concatenation or sprintf for the variable $className instead of interpolation.

It is generally a best practice as it is often more readable to use concatenation instead of interpolation for variables inside strings.

// Instead of
$x = "foo $bar $baz";

// Better use either
$x = "foo " . $bar . " " . $baz;
$x = sprintf("foo %s %s", $bar, $baz);
Loading history...
91
        }
92
93
        return null;
94
    }
95
}
96