Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
| 1 | <?php namespace GenericCollections\Abstracts;  | 
            ||
| 8 | abstract class AbstractMap extends InternalDataArray implements MapInterface, \ArrayAccess  | 
            ||
| 9 | { | 
            ||
| 10 | public function checkValueType($value)  | 
            ||
| 14 | |||
| 15 | public function checkKeyType($key)  | 
            ||
| 19 | |||
| 20 | public function containsKey($key)  | 
            ||
| 24 | |||
| 25 | public function containsValue($value)  | 
            ||
| 29 | |||
| 30 | public function get($key)  | 
            ||
| 34 | |||
| 35 | public function getOrDefault($key, $default)  | 
            ||
| 36 |     { | 
            ||
| 37 |         if ($this->containsKey($key)) { | 
            ||
| 38 | return $this->data[$key];  | 
            ||
| 39 | }  | 
            ||
| 40 |         if (null !== $default and ! $this->checkValueType($default)) { | 
            ||
| 41 | throw new \InvalidArgumentException(  | 
            ||
| 42 | 'The default value provided for '  | 
            ||
| 43 | . get_class($this) . '::getOrDefault is not a valid type,'  | 
            ||
| 44 | . ' expected ' . $this->getKeyType() . '.'  | 
            ||
| 45 | );  | 
            ||
| 46 | }  | 
            ||
| 47 | return $default;  | 
            ||
| 48 | }  | 
            ||
| 49 | |||
| 50 | public function keys()  | 
            ||
| 54 | |||
| 55 | public function put($key, $value)  | 
            ||
| 75 | |||
| 76 | public function putAll(array $values)  | 
            ||
| 82 | |||
| 83 | public function putIfAbsent($key, $value)  | 
            ||
| 92 | |||
| 93 | public function remove($key)  | 
            ||
| 101 | |||
| 102 | public function removeExact($key, $value)  | 
            ||
| 115 | |||
| 116 | public function replace($key, $value)  | 
            ||
| 120 | |||
| 121 | public function replaceExact($key, $current, $replacement)  | 
            ||
| 136 | |||
| 137 | public function keysSet()  | 
            ||
| 141 | |||
| 142 | public function valuesCollection()  | 
            ||
| 146 | |||
| 147 | |||
| 148 | |||
| 149 | /*  | 
            ||
| 150 | * Implementations from \ArrayAccess  | 
            ||
| 151 | */  | 
            ||
| 152 | /** @inheritdoc */  | 
            ||
| 153 | public function offsetExists($offset)  | 
            ||
| 157 | |||
| 158 | /** @inheritdoc */  | 
            ||
| 159 | public function offsetGet($offset)  | 
            ||
| 163 | |||
| 164 | /** @inheritdoc */  | 
            ||
| 165 | public function offsetSet($offset, $value)  | 
            ||
| 169 | |||
| 170 | /** @inheritdoc */  | 
            ||
| 171 | public function offsetUnset($offset)  | 
            ||
| 175 | }  | 
            ||
| 176 | 
PHP has two types of connecting operators (logical operators, and boolean operators):
and&&or||The difference between these is the order in which they are executed. In most cases, you would want to use a boolean operator like
&&, or||.Let’s take a look at a few examples:
Logical Operators are used for Control-Flow
One case where you explicitly want to use logical operators is for control-flow such as this:
Since
dieintroduces problems of its own, f.e. it makes our code hardly testable, and prevents any kind of more sophisticated error handling; you probably do not want to use this in real-world code. Unfortunately, logical operators cannot be combined withthrowat this point:These limitations lead to logical operators rarely being of use in current PHP code.