FileAbstract::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 4
rs 10
cc 1
eloc 2
nc 1
nop 1
1
<?php
2
declare(strict_types=1);
3
4
namespace Crossjoin\Browscap\Source;
5
6
use Crossjoin\Browscap\Exception\SourceUnavailableException;
7
8
/**
9
 * Class FileAbstract
10
 *
11
 * @package Crossjoin\Browscap\Source
12
 * @author Christoph Ziegenberg <[email protected]>
13
 * @link https://github.com/crossjoin/browscap
14
 */
15
abstract class FileAbstract
16
{
17
    /**
18
     * @var string
19
     */
20
    protected $file;
21
22
    /**
23
     * File constructor.
24
     *
25
     * @param string $file
26
     *
27
     * @throws SourceUnavailableException
28
     */
29
    public function __construct(string $file)
30
    {
31
        $this->setFilePath($file);
32
    }
33
34
    /**
35
     * @return string
36
     */
37
    protected function getFilePath() : string
38
    {
39
        return $this->file;
40
    }
41
42
    /**
43
     * @param string $file
44
     *
45
     * @throws SourceUnavailableException
46
     */
47
    protected function setFilePath(string $file)
48
    {
49
        if (!$this->isFileReadable($file)) {
50
            if (!file_exists($file)) {
51
                throw new SourceUnavailableException("File '$file' does not exist.", 1458977223);
0 ignored issues
show
Coding Style Best Practice introduced by
As per coding-style, please use concatenation or sprintf for the variable $file 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...
52
            } else {
53
                throw new SourceUnavailableException("File '$file' exists but is not readable.", 1458977224);
0 ignored issues
show
Coding Style Best Practice introduced by
As per coding-style, please use concatenation or sprintf for the variable $file 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...
54
            }
55
        }
56
        $this->file = $file;
57
    }
58
59
    /**
60
     * @param string $file
61
     *
62
     * @return bool
63
     */
64
    protected function isFileReadable(string $file) : bool
65
    {
66
        return is_readable($file);
67
    }
68
69
    /**
70
     * @inheritdoc
71
     *
72
     * @codeCoverageIgnore All covered, but analysis does't work with Generators.
73
     *
74
     * @throws SourceUnavailableException
75
     */
76
    public function getContent() : \Generator
77
    {
78
        $file = $this->getFilePath();
79
80
        $handle = @fopen($file, 'r');
81
        if ($handle !== false) {
82
            while (!feof($handle)) {
83
                yield fread($handle, 4096);
84
            }
85
            fclose($handle);
86
        } else {
87
            throw new SourceUnavailableException("Could not open file '$file' for reading.", 1458977225);
0 ignored issues
show
Coding Style Best Practice introduced by
As per coding-style, please use concatenation or sprintf for the variable $file 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...
88
        }
89
    }
90
}
91