Completed
Push — master ( 660564...17f31f )
by Andreas
18s queued 10s
created

MongoId::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 1
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
<?php
2
/*
3
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
5
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
6
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
7
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
11
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
13
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
14
 */
15
16
if (class_exists('MongoId', false)) {
17
    return;
18
}
19
20
use Alcaeus\MongoDbAdapter\TypeInterface;
21
use MongoDB\BSON\ObjectID;
22
23
class MongoId implements Serializable, TypeInterface, JsonSerializable
24
{
25
    /*
26
     * @var ObjectID
27
     */
28
    private $objectID;
29
30
    /**
31
     * Creates a new id
32
     *
33
     *
34
     * @link http://www.php.net/manual/en/mongoid.construct.php
35
     * @param string $id [optional] A string to use as the id. Must be 24 hexidecimal characters. If an invalid string is passed to this constructor, the constructor will ignore it and create a new id value.
36
     *
37
     * @throws MongoException
38
     */
39
    public function __construct($id = null)
40
    {
41
        $this->createObjectID($id);
42
    }
43
44
    /**
45
     * Check if a value is a valid ObjectId
46
     *
47
     * @link http://php.net/manual/en/mongoid.isvalid.php
48
     * @param mixed $value The value to check for validity.
49
     * @return bool
50
     */
51
    public static function isValid($value)
52
    {
53
        if ($value instanceof ObjectID || $value instanceof MongoId) {
54
            return true;
55
        } elseif (! is_string($value)) {
56
            return false;
57
        }
58
59
        return (bool) preg_match('#^[a-f0-9]{24}$#i', $value);
60
    }
61
62
    /**
63
     * Returns a hexidecimal representation of this id
64
     * @link http://www.php.net/manual/en/mongoid.tostring.php
65
     * @return string
66
     */
67
    public function __toString()
68
    {
69
        return (string) $this->objectID;
70
    }
71
72
    /**
73
     * Converts this MongoId to the new BSON ObjectID type
74
     *
75
     * @return ObjectID
76
     * @internal This method is not part of the ext-mongo API
77
     */
78
    public function toBSONType()
79
    {
80
        return $this->objectID;
81
    }
82
83
    /**
84
     * @param string $name
85
     *
86
     * @return null|string
87
     */
88
    public function __get($name)
89
    {
90
        if ($name === '$id') {
91
            return (string) $this->objectID;
92
        }
93
94
        return null;
95
    }
96
97
    /**
98
     * @param string $name
99
     * @param mixed $value
100
     */
101
    public function __set($name, $value)
102
    {
103
        if ($name === 'id') {
104
            trigger_error("The '\$id' property is read-only", E_USER_DEPRECATED);
105
            return;
106
        }
107
    }
108
109
    /**
110
     * @param string $name
111
     * @return bool
112
     */
113
    public function __isset($name)
114
    {
115
        return $name === 'id';
116
    }
117
118
    /**
119
     * @param string $name
120
     */
121
    public function __unset($name)
122
    {
123
        if ($name === 'id') {
124
            trigger_error("The '\$id' property is read-only", E_USER_DEPRECATED);
125
            return;
126
        }
127
    }
128
129
    /**
130
     * @return string
131
     */
132
    public function serialize()
133
    {
134
        return (string) $this->objectID;
135
    }
136
137
    /**
138
     * @param string $serialized
139
     */
140
    public function unserialize($serialized)
141
    {
142
        $this->createObjectID($serialized);
143
    }
144
145
    /**
146
     * Gets the incremented value to create this id
147
     * @link http://php.net/manual/en/mongoid.getinc.php
148
     * @return int Returns the incremented value used to create this MongoId.
149
     */
150
    public function getInc()
151
    {
152
        return hexdec(substr((string) $this->objectID, -6));
153
    }
154
155
    /**
156
     * (PECL mongo &gt;= 1.0.11)
157
     * Gets the process ID
158
     * @link http://php.net/manual/en/mongoid.getpid.php
159
     * @return int Returns the PID of the MongoId.
160
     */
161
    public function getPID()
162
    {
163
        $id = (string) $this->objectID;
164
165
        // PID is stored as little-endian, flip it around
166
        $pid = substr($id, 16, 2) . substr($id, 14, 2);
167
        return hexdec($pid);
168
    }
169
170
    /**
171
     * (PECL mongo &gt;= 1.0.1)
172
     * Gets the number of seconds since the epoch that this id was created
173
     * @link http://www.php.net/manual/en/mongoid.gettimestamp.php
174
     * @return int
175
     */
176
    public function getTimestamp()
177
    {
178
        return hexdec(substr((string) $this->objectID, 0, 8));
179
    }
180
181
    /**
182
     * Gets the hostname being used for this machine's ids
183
     * @link http://www.php.net/manual/en/mongoid.gethostname.php
184
     * @return string
185
     */
186
    public static function getHostname()
187
    {
188
        return gethostname();
189
    }
190
191
    /**
192
     * (PECL mongo &gt;= 1.0.8)
193
     * Create a dummy MongoId
194
     * @link http://php.net/manual/en/mongoid.set-state.php
195
     * @param array $props <p>Theoretically, an array of properties used to create the new id. However, as MongoId instances have no properties, this is not used.</p>
196
     * @return MongoId A new id with the value "000000000000000000000000".
197
     */
198
    public static function __set_state(array $props)
199
    {
200
    }
201
202
    /**
203
     * @return stdClass
204
     */
205
    public function jsonSerialize()
206
    {
207
        $object = new stdClass();
208
        $object->{'$id'} = (string) $this->objectID;
209
        return $object;
210
    }
211
212
    /**
213
     * @param $id
214
     * @throws MongoException
215
     */
216
    private function createObjectID($id)
217
    {
218
        try {
219
            if (is_string($id)) {
220
                $this->objectID = new ObjectID($id);
221
            } elseif ($id instanceof self || $id instanceof ObjectID) {
222
                $this->objectID = new ObjectID((string) $id);
223
            } else {
224
                $this->objectID = new ObjectID();
225
            }
226
        } catch (\Exception $e) {
227
            throw new MongoException('Invalid object ID', 19);
228
        }
229
    }
230
}
231