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
|
|
View Code Duplication |
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'.", |
86
|
|
|
1459069587 |
87
|
|
|
); |
88
|
|
|
} |
89
|
|
|
} else { |
90
|
|
|
throw new UnexpectedValueException("Class '$className' doesn't exist.", 1459069588); |
91
|
|
|
} |
92
|
|
|
|
93
|
|
|
return null; |
94
|
|
|
} |
95
|
|
|
} |
96
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.