SnakObject::__construct()   A
last analyzed

Complexity

Conditions 5
Paths 8

Size

Total Lines 19

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 5

Importance

Changes 0
Metric Value
dl 0
loc 19
ccs 7
cts 7
cp 1
rs 9.3222
c 0
b 0
f 0
cc 5
nc 8
nop 1
crap 5
1
<?php
2
3
namespace Wikibase\DataModel\Snak;
4
5
use InvalidArgumentException;
6
use Wikibase\DataModel\Entity\EntityId;
7
use Wikibase\DataModel\Entity\Property;
8
use Wikibase\DataModel\Entity\PropertyId;
9
10
/**
11
 * Base class for snaks.
12
 * See https://www.mediawiki.org/wiki/Wikibase/DataModel#Snaks
13
 *
14
 * @since 0.1
15
 *
16
 * @license GPL-2.0-or-later
17
 * @author Jeroen De Dauw < [email protected] >
18
 */
19
abstract class SnakObject implements Snak {
20
21
	/**
22
	 * @since 0.1
23
	 *
24
	 * @var PropertyId
25
	 */
26
	protected $propertyId;
27
28
	/**
29
	 * Support for passing in an EntityId instance that is not a PropertyId instance has
30
	 * been deprecated since 0.5.
31
	 *
32
	 * @since 0.1
33
	 *
34
	 * @param PropertyId|EntityId|int $propertyId
35
	 *
36
	 * @throws InvalidArgumentException
37
	 */
38
	public function __construct( $propertyId ) {
39
		if ( is_int( $propertyId ) ) {
40
			$propertyId = PropertyId::newFromNumber( $propertyId );
41
		}
42
43
		if ( !( $propertyId instanceof EntityId ) ) {
44
			throw new InvalidArgumentException( '$propertyId must be an instance of EntityId' );
45
		}
46
47 40
		if ( $propertyId->getEntityType() !== Property::ENTITY_TYPE ) {
48 40
			throw new InvalidArgumentException( '$propertyId must have an entityType of ' . Property::ENTITY_TYPE );
49 4
		}
50 4
51
		if ( !( $propertyId instanceof PropertyId ) ) {
52 40
			$propertyId = new PropertyId( $propertyId->getSerialization() );
53 9
		}
54
55
		$this->propertyId = $propertyId;
56 31
	}
57 3
58
	/**
59
	 * @see PropertyIdProvider::getPropertyId
60 28
	 *
61
	 * @since 0.1
62
	 *
63
	 * @return PropertyId
64 28
	 */
65 28
	public function getPropertyId() {
66
		return $this->propertyId;
67
	}
68
69
	/**
70
	 * @return string
71
	 */
72
	public function getHash() {
73
		return sha1( serialize( $this ) );
74 3
	}
75 3
76
	/**
77
	 *
78
	 * @since 0.3
79
	 *
80
	 * @param mixed $target
81
	 *
82
	 * @return bool
83 16
	 */
84 16
	public function equals( $target ) {
85
		if ( $this === $target ) {
86
			return true;
87
		}
88
89
		return is_object( $target )
90
			&& get_called_class() === get_class( $target )
91
			&& $this->getHash() === $target->getHash();
92
	}
93
94
	/**
95
	 * @see Serializable::serialize
96 12
	 *
97 12
	 * @since 7.0 serialization format changed in an incompatible way
98
	 *
99
	 * @return string
100
	 */
101 12
	public function serialize() {
102 12
		return $this->propertyId->getSerialization();
103 12
	}
104
105
	/**
106
	 * @see Serializable::unserialize
107
	 *
108
	 * @since 0.1
109
	 *
110
	 * @param string $serialized
111
	 */
112
	public function unserialize( $serialized ) {
113 12
		try {
114 12
			$this->propertyId = new PropertyId( $serialized );
115
		} catch ( InvalidArgumentException $ex ) {
116
			// Backwards compatibility with the previous serialization format
117
			$this->propertyId = PropertyId::newFromNumber( unserialize( $serialized ) );
118
		}
119
	}
120
121
}
122