1
|
|
|
<?php |
2
|
|
|
declare(strict_types = 1); |
3
|
|
|
|
4
|
|
|
namespace Regression; |
5
|
|
|
|
6
|
|
|
use TypeError; |
7
|
|
|
|
8
|
|
|
/** |
9
|
|
|
* Class RegressionFactory |
10
|
|
|
* |
11
|
|
|
* @package Regression |
12
|
|
|
* @author [email protected] |
13
|
|
|
*/ |
14
|
|
|
class RegressionFactory |
15
|
|
|
{ |
16
|
|
|
/** |
17
|
|
|
* @param array $data |
18
|
|
|
* @return RegressionModel |
19
|
|
|
* @throws TypeError |
20
|
|
|
*/ |
21
|
|
|
public static function linear(array $data): RegressionModel |
22
|
|
|
{ |
23
|
|
|
return self::createContainer(LinearRegression::class, $data); |
24
|
|
|
} |
25
|
|
|
|
26
|
|
|
/** |
27
|
|
|
* @param array $data |
28
|
|
|
* @return RegressionModel |
29
|
|
|
* @throws TypeError |
30
|
|
|
*/ |
31
|
|
|
public static function exponential(array $data): RegressionModel |
32
|
|
|
{ |
33
|
|
|
return self::createContainer(ExponentialRegression::class, $data); |
34
|
|
|
} |
35
|
|
|
|
36
|
|
|
/** |
37
|
|
|
* @param array $data |
38
|
|
|
* @return RegressionModel |
39
|
|
|
* @throws TypeError |
40
|
|
|
*/ |
41
|
|
|
public static function logarithmic(array $data): RegressionModel |
42
|
|
|
{ |
43
|
|
|
return self::createContainer(LogarithmicRegression::class, $data); |
44
|
|
|
} |
45
|
|
|
|
46
|
|
|
/** |
47
|
|
|
* @param array $data |
48
|
|
|
* @return RegressionModel |
49
|
|
|
* @throws TypeError |
50
|
|
|
*/ |
51
|
|
|
public static function power(array $data): RegressionModel |
52
|
|
|
{ |
53
|
|
|
return self::createContainer(PowerRegression::class, $data); |
54
|
|
|
} |
55
|
|
|
|
56
|
|
|
/** |
57
|
|
|
* @param string $className |
58
|
|
|
* @param array $data |
59
|
|
|
* |
60
|
|
|
* @return \Regression\RegressionModel |
61
|
|
|
* @throws \TypeError |
62
|
|
|
*/ |
63
|
|
|
protected static function createContainer(string $className, array $data): RegressionModel |
64
|
|
|
{ |
65
|
|
|
/** |
66
|
|
|
* @var InterfaceRegression $regressionObj |
67
|
|
|
*/ |
68
|
|
|
$regressionObj = new $className(); |
69
|
|
|
|
70
|
|
|
if (!$regressionObj instanceof InterfaceRegression) { |
71
|
|
|
throw new TypeError( |
72
|
|
|
'the object' . $className . |
|
|
|
|
73
|
|
|
' is not compatible with the interface ' . InterfaceRegression::class |
74
|
|
|
); |
75
|
|
|
} |
76
|
|
|
|
77
|
|
|
$regressionObj->setSourceSequence($data); |
78
|
|
|
$regressionObj->calculate(); |
79
|
|
|
|
80
|
|
|
return $regressionObj->getRegressionModel(); |
81
|
|
|
} |
82
|
|
|
} |
This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.
If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.
In this case you can add the
@ignore
PhpDoc annotation to the duplicate definition and it will be ignored.