Completed
Pull Request — master (#387)
by
unknown
04:34
created

SheetIterator::rewind()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 3
cts 3
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 0
crap 1
1
<?php
2
3
namespace Box\Spout\Reader\XLSX;
4
5
use Box\Spout\Reader\IteratorInterface;
6
use Box\Spout\Reader\XLSX\Helper\SheetHelper;
7
use Box\Spout\Reader\Exception\NoSheetsFoundException;
8
9
/**
10
 * Class SheetIterator
11
 * Iterate over XLSX sheet.
12
 *
13
 * @package Box\Spout\Reader\XLSX
14
 */
15
class SheetIterator implements IteratorInterface
16
{
17
    /** @var \Box\Spout\Reader\XLSX\Sheet[] The list of sheet present in the file */
18
    protected $sheets;
19
20
    /** @var int The index of the sheet being read (zero-based) */
21
    protected $currentSheetIndex;
22
23
    /** @var  int The index of the sheet which is active */
24
    protected $activeSheetIndex;
25
26
    /**
27
     * @param string $filePath Path of the file to be read
28
     * @param \Box\Spout\Reader\XLSX\ReaderOptions $options Reader's current options
29
     * @param \Box\Spout\Reader\XLSX\Helper\SharedStringsHelper $sharedStringsHelper
30
     * @param \Box\Spout\Common\Helper\GlobalFunctionsHelper $globalFunctionsHelper
31
     * @throws \Box\Spout\Reader\Exception\NoSheetsFoundException If there are no sheets in the file
32
     */
33 99
    public function __construct($filePath, $options, $sharedStringsHelper, $globalFunctionsHelper)
34
    {
35
        // Fetch all available sheets
36 99
        $sheetHelper = new SheetHelper($filePath, $options, $sharedStringsHelper, $globalFunctionsHelper);
37 99
        $this->sheets = $sheetHelper->getSheets();
38 99
        $this->activeSheetIndex = $sheetHelper->getActiveSheetIndex();
0 ignored issues
show
Documentation Bug introduced by
It seems like $sheetHelper->getActiveSheetIndex() can also be of type string. However, the property $activeSheetIndex is declared as type integer. Maybe add an additional type check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly.

For example, imagine you have a variable $accountId that can either hold an Id object or false (if there is no account id yet). Your code now assigns that value to the id property of an instance of the Account class. This class holds a proper account, so the id value must no longer be false.

Either this assignment is in error or a type check should be added for that assignment.

class Id
{
    public $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

}

class Account
{
    /** @var  Id $id */
    public $id;
}

$account_id = false;

if (starsAreRight()) {
    $account_id = new Id(42);
}

$account = new Account();
if ($account instanceof Id)
{
    $account->id = $account_id;
}
Loading history...
39
40 99
        if (count($this->sheets) === 0) {
41 3
            throw new NoSheetsFoundException('The file must contain at least one sheet.');
42
        }
43 96
    }
44
45
    /**
46
     * Retrieve active sheet
47
     *
48
     * @return Sheet
49
     */
50
    public function getActiveSheet()
51
    {
52
        return $this->sheets[$this->activeSheetIndex];
53
    }
54
55
    /**
56
     * Rewind the Iterator to the first element
57
     * @link http://php.net/manual/en/iterator.rewind.php
58
     *
59
     * @return void
60
     */
61 96
    public function rewind()
62
    {
63 96
        $this->currentSheetIndex = 0;
64 96
    }
65
66
    /**
67
     * Checks if current position is valid
68
     * @link http://php.net/manual/en/iterator.valid.php
69
     *
70
     * @return bool
71
     */
72 96
    public function valid()
73
    {
74 96
        return ($this->currentSheetIndex < count($this->sheets));
75
    }
76
77
    /**
78
     * Move forward to next element
79
     * @link http://php.net/manual/en/iterator.next.php
80
     *
81
     * @return void
82
     */
83 93
    public function next()
84
    {
85
        // Using isset here because it is way faster than array_key_exists...
86 93
        if (isset($this->sheets[$this->currentSheetIndex])) {
87 93
            $currentSheet = $this->sheets[$this->currentSheetIndex];
88 93
            $currentSheet->getRowIterator()->end();
89
90 93
            $this->currentSheetIndex++;
91 93
        }
92 93
    }
93
94
    /**
95
     * Return the current element
96
     * @link http://php.net/manual/en/iterator.current.php
97
     *
98
     * @return \Box\Spout\Reader\XLSX\Sheet
99
     */
100 96
    public function current()
101
    {
102 96
        return $this->sheets[$this->currentSheetIndex];
103
    }
104
105
    /**
106
     * Return the key of the current element
107
     * @link http://php.net/manual/en/iterator.key.php
108
     *
109
     * @return int
110
     */
111 90
    public function key()
112
    {
113 90
        return $this->currentSheetIndex + 1;
114
    }
115
116
    /**
117
     * Cleans up what was created to iterate over the object.
118
     *
119
     * @return void
120
     */
121 93
    public function end()
122
    {
123
        // make sure we are not leaking memory in case the iteration stopped before the end
124 93
        foreach ($this->sheets as $sheet) {
125 93
            $sheet->getRowIterator()->end();
126 93
        }
127 93
    }
128
}
129