サーチ…
前書き
演算子は、プログラミング用語で1つ以上の値(または式)をとり、別の値を生成する(つまり、構成自体が式になる)ものです。
演算子は、取得する値の数に応じてグループ化できます。
備考
演算子は1つ( !$a
および++$a
などの単項演算子)、2つ(2つの演算子、たとえば$a + $b
または$a >> $b
)または3つ(3つの唯一の演算子は$a ? $b : $c
)式。
演算子の優先順位は、演算子のグループ化方法に影響します(かっこがあるかのように)。以下は、優先順位の高い順の演算子のリストです(第2列の演算子)。複数の演算子が1つの行にある場合、グループ化はコードの順序によって決定されます。ここで、最初の列は結合性を示します(例を参照)。
協会 | オペレーター |
---|---|
左 | -> :: |
無し | new clone |
左 | [ |
右 | ** |
右 | ++ -- ~ (int) (float) (string) (array) (object) (bool) @ |
無し | instanceof |
右 | ! |
左 | * / % |
左 | + - . |
左 | << >> |
無し | < <= > >= |
無し | == != === !== <> <=> |
左 | & |
左 | ^ |
左 | | |
左 | && |
左 | || |
右 | ?? |
左 | ? : |
右 | = += -= *= **= /= .= %= &= ` |
左 | and |
左 | xor |
左 | or |
完全な情報はスタックオーバーフローです。
関数や言語構成( print
)は常に最初に評価されますが、上記の優先順位/結合規則に従って戻り値が使用されることに注意してください。言語構造の後のかっこが省略されている場合は特別な注意が必要です。例えばecho 2 . print 3 + 4;
エコーの721
: print
部分は3 + 4
評価し、結果7
を印刷して1
を返します。その後、 2
がエコーされ、 print
( 1
)の戻り値と連結されます。
文字列演算子(。と。=)
文字列演算子は2つしかありません。
2つの文字列の連結(ドット):
$a = "a"; $b = "b"; $c = $a . $b; // $c => "ab"
連結割当(ドット=):
$a = "a"; $a .= "b"; // $a => "ab"
基本割当(=)
$a = "some string";
その結果、 $a
に値を持つsome string
が返されsome string
。
代入式の結果は、代入される値です。 1つの等号=
は比較のためのものではないことに注意してください!
$a = 3;
$b = ($a = 5);
次のことを行います:
- 1行目は
$a
3
を代入$a
ます。 - 2行目は
$a
5
を代入$a
ます。この式でも値5
得られます。 - 2行目は、かっこ(
5
)の式の結果を$b
代入します。
したがって、 $a
と$b
両方に値5
。
結合割当(+ =等)
結合された代入演算子は、いくつかの変数に対する操作のショートカットであり、続いてこの新しい値をその変数に割り当てます。
算術:
$a = 1; // basic assignment
$a += 2; // read as '$a = $a + 2'; $a now is (1 + 2) => 3
$a -= 1; // $a now is (3 - 1) => 2
$a *= 2; // $a now is (2 * 2) => 4
$a /= 2; // $a now is (16 / 2) => 8
$a %= 5; // $a now is (8 % 5) => 3 (modulus or remainder)
// array +
$arrOne = array(1);
$arrTwo = array(2);
$arrOne += $arrTwo;
$a **= 2; // $a now is (4 ** 2) => 16 (4 raised to the power of 2)
結合と文字列の割り当ての組み合わせ:
$a = "a";
$a .= "b"; // $a => "ab"
結合されたバイナリのビット単位の代入演算子:
$a = 0b00101010; // $a now is 42
$a &= 0b00001111; // $a now is (00101010 & 00001111) => 00001010 (bitwise and)
$a |= 0b00100010; // $a now is (00001010 | 00100010) => 00101010 (bitwise or)
$a ^= 0b10000010; // $a now is (00101010 ^ 10000010) => 10101000 (bitwise xor)
$a >>= 3; // $a now is (10101000 >> 3) => 00010101 (shift right by 3)
$a <<= 1; // $a now is (00010101 << 1) => 00101010 (shift left by 1)
演算子の優先順位を変更する(かっこで)
演算子が評価される順序は、 演算子の優先順位によって決まります(「注意」のセクションも参照してください)。
に
$a = 2 * 3 + 4;
$a
10ための値を取得し2 * 3
のサブ結果を得た(乗算は加算よりも優先順位が高い)最初に評価されている6 + 4
10に等しいです。
優先順位はカッコを使用して変更できます。
$a = 2 * (3 + 4);
最初に(3 + 4)
が評価されるため、 $a
の値は14になります。
協会
左連想
2つの演算子の先行が等しい場合、結合性によってグループ化が決定されます(「解説」セクションも参照してください)。
$a = 5 * 3 % 2; // $a now is (5 * 3) % 2 => (15 % 2) => 1
*
と%
は等しい優先順位と左連想%
持ちます。乗算は最初(左)に発生するため、グループ化されます。
$a = 5 % 3 * 2; // $a now is (5 % 3) * 2 => (2 * 2) => 4
モジュラス演算子が最初に(左)に発生し、グループ化されます。
右関連
$a = 1;
$b = 1;
$a = $b += 1;
両方$a
と$b
今値有する2
ため$b += 1
グループ化し、その結果( $b
され2
)に割り当てられています$a
。
比較演算子
平等
基本的な等価性テストでは、等しい演算子==
が使用されます。より包括的なチェックのために、同一の演算子===
使用してください。
同一の演算子は等価演算子と同じように動作し、そのオペランドの値が同じである必要がありますが、同じデータ型を持つ必要があります。
たとえば、下のサンプルでは「aとbは等しい」と表示されますが、「aとbは同一」ではありません。
$a = 4;
$b = '4';
if ($a == $b) {
echo 'a and b are equal'; // this will be printed
}
if ($a === $b) {
echo 'a and b are identical'; // this won't be printed
}
等号演算子を使用する場合、数値ストリングは整数にキャストされます。
オブジェクトの比較
===
2つのオブジェクトがまったく同じインスタンスであるかどうかをチェックして比較します 。つまり、 new stdClass() === new stdClass()
は、同じ方法で作成されていても(まったく同じ値を持っていてもnew stdClass() === new stdClass()
、falseに解決されます。
==
2つのオブジェクトが等しいかどうかを再帰的にチェックして2つのオブジェクトを比較します( 深い等価 )。つまり$a == $b
場合、 $a
と$b
は次のようになります。
- 同じクラスの
- 動的プロパティを含む同じプロパティが設定されている
- 各プロパティのための
$property
セット、$a->property == $b->property
(したがって、再帰的にチェック)真です。
他の一般的に使用される演算子
彼らは以下を含む:
- より大きい(
>
) - より小さい(
<
) - より大きいまたは等しい(
>=
) - より小さいまたは等しい(
<=
) - 等しくない(
!=
) - 同一ではない(
!==
)
- より大きい :
$a > $b
、返すtrue
場合は$a
の値がのより大きい$b
そうでない場合はfalseを返し、。
例 :
var_dump(5 > 2); // prints bool(true)
var_dump(2 > 7); // prints bool(false)
- より小さい :
$a < $b
、返すtrue
場合は$a
の値がの小さい$b
そうでない場合はfalseを返し、。
例 :
var_dump(5 < 2); // prints bool(false)
var_dump(1 < 10); // prints bool(true)
- か等しいより大きい :
$a >= $b
、返すtrue
場合は$a
の値がいずれかのより大きく、$b
または等しい$b
そう返し、false
。
例 :
var_dump(2 >= 2); // prints bool(true)
var_dump(6 >= 1); // prints bool(true)
var_dump(1 >= 7); // prints bool(false)
- か等しいより小さい :
$a <= $b
、返すtrue
場合は$a
の値がいずれかのよりも小さい$b
または等しい$b
、それ以外を返しfalse
。
例 :
var_dump(5 <= 5); // prints bool(true)
var_dump(5 <= 8); // prints bool(true)
var_dump(9 <= 1); // prints bool(false)
5/6。 等しい/等しくない:前の例を等価で再ハッシュするには、下のサンプルは 'aとbは同一ではない'と表示されますが、 'aとbは等しくない'は表示されません。
$a = 4;
$b = '4';
if ($a != $b) {
echo 'a and b are not equal'; // this won't be printed
}
if ($a !== $b) {
echo 'a and b are not identical'; // this will be printed
}
宇宙船オペレーター(<=>)
PHP 7では、新しい種類の演算子が導入されており、式を比較するのに使用できます。この演算子は、最初の式が2番目の式よりも小さい、等しい、または大きい場合は-1、0または1を返します。
// Integers
print (1 <=> 1); // 0
print (1 <=> 2); // -1
print (2 <=> 1); // 1
// Floats
print (1.5 <=> 1.5); // 0
print (1.5 <=> 2.5); // -1
print (2.5 <=> 1.5); // 1
// Strings
print ("a" <=> "a"); // 0
print ("a" <=> "b"); // -1
print ("b" <=> "a"); // 1
オブジェクトは比較可能ではないため、定義されていない動作になります。
使用して、ユーザ定義の比較関数書き込み時にこの演算子は特に有用であるusort
、 uasort
、又はuksort
。たとえば、 weight
プロパティによってソートされるオブジェクトの配列が与えられた場合、無名関数はソート関数によって期待される値を返すために<=>
を使用できます。
usort($list, function($a, $b) { return $a->weight <=> $b->weight; });
PHP 5ではこれはかなり複雑な表現が必要でした。
usort($list, function($a, $b) {
return $a->weight < $b->weight ? -1 : ($a->weight == $b->weight ? 0 : 1);
});
ヌル統合演算子(??)
Null coalescingは、PHP 7で導入された新しい演算子です。この演算子は、設定されていてNULL
でない場合、最初のオペランドを返しNULL
。それ以外の場合は、2番目のオペランドを返します。
次の例:
$name = $_POST['name'] ?? 'nobody';
両方とも同等です。
if (isset($_POST['name'])) {
$name = $_POST['name'];
} else {
$name = 'nobody';
}
そして:
$name = isset($_POST['name']) ? $_POST['name'] : 'nobody';
この演算子は、連想させることもできます(右結合セマンティクス)。
$name = $_GET['name'] ?? $_POST['name'] ?? 'nobody';
これは以下と同等です:
if (isset($_GET['name'])) {
$name = $_GET['name'];
} elseif (isset($_POST['name'])) {
$name = $_POST['name'];
} else {
$name = 'nobody';
}
注意:
文字列連結で合体演算子を使用するときは、括弧()
を使用することを忘れないでください。
$firstName = "John";
$lastName = "Doe";
echo $firstName ?? "Unknown" . " " . $lastName ?? "";
これはJohn
のみを出力し、$ firstNameがnullで$ lastNameがDoe
場合はUnknown Doe
を出力します。 John Doe
を出力するには、このようなかっこを使用する必要があります。
$firstName = "John";
$lastName = "Doe";
echo ($firstName ?? "Unknown") . " " . ($lastName ?? "");
この意志出力John Doe
の代わりに、 John
のみ。
instanceof(型演算子)
オブジェクトが特定のクラスであるかどうかをチェックするために、PHPバイナリのinstanceof
演算子をPHPバージョン5以降使用することができます。
最初の(左の)パラメータは、テストするオブジェクトです。この変数がオブジェクトでない場合、 instanceof
常にfalse
返しfalse
。定数式を使用すると、エラーがスローされます。
2番目の(右)パラメータは、比較するクラスです。クラスは、クラス名自体、クラス名(文字列定数ではない)を含む文字列変数、またはそのクラスのオブジェクトとして提供できます。
class MyClass {
}
$o1 = new MyClass();
$o2 = new MyClass();
$name = 'MyClass';
// in the cases below, $a gets boolean value true
$a = $o1 instanceof MyClass;
$a = $o1 instanceof $name;
$a = $o1 instanceof $o2;
// counter examples:
$b = 'b';
$a = $o1 instanceof 'MyClass'; // parse error: constant not allowed
$a = false instanceof MyClass; // fatal error: constant not allowed
$a = $b instanceof MyClass; // false ($b is not an object)
instanceof
は、オブジェクトが別のクラスを拡張する何らかのクラスであるかどうか、あるいは何らかのインタフェースを実装しているかどうかをチェックするためにも使用できます:
interface MyInterface {
}
class MySuperClass implements MyInterface {
}
class MySubClass extends MySuperClass {
}
$o = new MySubClass();
// in the cases below, $a gets boolean value true
$a = $o instanceof MySubClass;
$a = $o instanceof MySuperClass;
$a = $o instanceof MyInterface;
オブジェクトが何らかのクラスでないかどうかをチェックするには、not演算子( !
)を使うことができます:
class MyClass {
}
class OtherClass {
}
$o = new MyClass();
$a = !$o instanceof OtherClass; // true
instanceof
は!
よりも優先順位が高いので、 $o instanceof MyClass
まわりのカッコは必要ないことに注意してください!
ただし、括弧でコードを読みやすくすることができます。
警告
クラスが存在しない場合、登録されたオートロード関数が呼び出されてクラスを定義しようとします(これは、このドキュメントのこの部分の範囲外のトピックです)。 5.1.0より前のバージョンのPHPでは、 instanceof
演算子もこれらの呼び出しをトリガーし、実際にクラスを定義します(クラスを定義できなかった場合、致命的なエラーが発生します)。これを避けるには、文字列を使用します。
// only PHP versions before 5.1.0!
class MyClass {
}
$o = new MyClass();
$a = $o instanceof OtherClass; // OtherClass is not defined!
// if OtherClass can be defined in a registered autoloader, it is actually
// loaded and $a gets boolean value false ($o is not a OtherClass)
// if OtherClass can not be defined in a registered autoloader, a fatal
// error occurs.
$name = 'YetAnotherClass';
$a = $o instanceof $name; // YetAnotherClass is not defined!
// $a simply gets boolean value false, YetAnotherClass remains undefined.
PHPバージョン5.1.0以降、登録されたオートローダーは、このような状況ではもはや呼び出されません。
古いバージョンのPHP(5.0より前)
古いバージョンのPHP(5.0より前)では、オブジェクトが何らかのクラスであるかどうかを判断するためにis_a
関数を使用することができます。この関数は、PHPバージョン5では廃止され、PHPバージョン5.3.0では廃止されました。
三元演算子(?:)
三項演算子は、インラインif
ステートメントと考えることができます。それは3つの部分で構成されています。 operator
と2つの結果。構文は次のとおりです。
$value = <operator> ? <true value> : <false value>
operator
がtrue
と評価されたtrue
、最初のブロックの値が返され( <true value>
)、そうでない場合は2番目のブロックの値が返されます( <false value>
)。三項演算子の結果に$value
を設定しているので、戻り値を格納します。
例:
$action = empty($_POST['action']) ? 'default' : $_POST['action'];
empty($_POST['action'])
'default'
場合empty($_POST['action'])
true 'default'
場合、 $action
は文字列'default'
を含みます。それ以外の場合は、 $_POST['action']
の値を含みます。
式(expr1) ? (expr2) : (expr3)
と評価さexpr2
場合expr1
と評価されtrue
、およびexpr3
あればexpr1
あると評価false
。
三項演算子の中間部分を省略することは可能です。式expr1 ?: expr3
リターンはexpr1
場合expr1
TRUEと評価され、 expr3
そうでありません。 ?:
は、しばしばElvis演算子と呼ばれます。
これは、 Null Coalescing演算子のように動作します??
、それ以外は??
左のオペランドを厳密にnull
する必要がありnull
、 ?:
は左のオペランドをブール値に解決し、ブール値false
に解決するかどうかを確認しfalse
。
例:
function setWidth(int $width = 0){
$_SESSION["width"] = $width ?: getDefaultWidth();
}
この例では、幅のセッション値を変更するには、 setWidth
widthパラメータまたはデフォルトの0を指定します。 boolean falseに解決される$width
が0( $width
が指定されていない場合)の場合、代わりにgetDefaultWidth()
値が使用されます。 $width
がboolean falseに解決されなかった場合、 getDefaultWidth()
関数は呼び出されません。
変数のブール値への変換の詳細については、「 型」を参照してください。
インクリメント(++)およびデクリメント演算子( - )
変数は、それぞれ++
または--
で1ずつインクリメントまたはデクリメントできます。以下に示すように、それらは変数の前後にあり、意味的にはわずかに変化します。
$i = 1;
echo $i; // Prints 1
// Pre-increment operator increments $i by one, then returns $i
echo ++$i; // Prints 2
// Pre-decrement operator decrements $i by one, then returns $i
echo --$i; // Prints 1
// Post-increment operator returns $i, then increments $i by one
echo $i++; // Prints 1 (but $i value is now 2)
// Post-decrement operator returns $i, then decrements $i by one
echo $i--; // Prints 2 (but $i value is now 1)
オペレータの増分および減分に関する詳細は、 公式ドキュメントを参照してください 。
実行演算子( ``)
PHP実行演算子はバッククォート( ``)で構成され、シェルコマンドの実行に使用されます。コマンドの出力が返されるため、変数に格納される可能性があります。
// List files
$output = `ls`;
echo "<pre>$output</pre>";
execute演算子とshell_exec()
は同じ結果を与えることに注意してください。
論理演算子(&& / ANDおよび|| / OR)
PHPでは、論理AND演算子とOR演算子の2つのバージョンがあります。
オペレーター | trueの場合 |
---|---|
$a and $b | $a と$b 両方が真です |
$a && $b | $a と$b 両方が真です |
$a or $b | $a または$b いずれかが真である |
$a || $b | $a または$b いずれかが真である |
&&
と||
opereratorsはand
やor
よりも優先度が高い。下記の表を参照してください。
評価 | $e 結果 | として評価された |
---|---|---|
$e = false || true | 真 | $e = (false || true) |
$e = false or true | 偽 | ($e = false) or true |
このため、 &&
と||
を使用する方が安全です。 and
とor
代わりに。
ビット演算子
接頭ビット演算子
ビット単位の演算子は論理演算子に似ていますが、ブール値ではなくビット単位で実行されます。
// bitwise NOT ~: sets all unset bits and unsets all set bits
printf("%'06b", ~0b110110); // 001001
ビットマスクビットマスク演算子
ビット単位のAND &
:ビットが両方のオペランドに設定されている場合にのみセットされます
printf("%'06b", 0b110101 & 0b011001); // 010001
ビット単位OR |
:どちらかのオペランドまたは両方のオペランドにセットされている場合、ビットがセットされます
printf("%'06b", 0b110101 | 0b011001); // 111101
ビットごとのXOR ^
:1つのオペランドにセットされ、別のオペランドに設定されていない場合、つまり、そのビットが2つのオペランドで異なる状態にある場合のみセットされます
printf("%'06b", 0b110101 ^ 0b011001); // 101100
ビットマスクの使用例
これらの演算子を使用して、ビットマスクを操作できます。例えば:
file_put_contents("file.log", LOCK_EX | FILE_APPEND);
ここで、 |
演算子は、2つのビットマスクを結合するために使用されます。が+
、同じ効果を持っています|
2つの通常のスカラー整数を追加するのではなく、ビットマスクを組み合わせることを強調します。
class Foo{
const OPTION_A = 1;
const OPTION_B = 2;
const OPTION_C = 4;
const OPTION_A = 8;
private $options = self::OPTION_A | self::OPTION_C;
public function toggleOption(int $option){
$this->options ^= $option;
}
public function enable(int $option){
$this->options |= $option; // enable $option regardless of its original state
}
public function disable(int $option){
$this->options &= ~$option; // disable $option regardless of its original state,
// without affecting other bits
}
/** returns whether at least one of the options is enabled */
public function isOneEnabled(int $options) : bool{
return $this->options & $option !== 0;
// Use !== rather than >, because
// if $options is about a high bit, we may be handling a negative integer
}
/** returns whether all of the options are enabled */
public function areAllEnabled(int $options) : bool{
return ($this->options & $options) === $options;
// note the parentheses; beware the operator precedence
}
}
この例( $option
常に1ビットのみを含んでいると仮定し$option
)
-
^
演算子はビットマスクを簡単に切り替えることができます。 -
|
演算子は元の状態または他のビットを無視してビットを設定する -
~
演算子は、1ビットのみが設定された整数を1ビットのみが設定された整数に変換する -
&
のこれらのプロパティ使用してビットの設定を解除するオペレーター、&
:- 以来
&=
セットビットには何も行いません((1 & 1) === 1
、(0 & 1) === 0
)、やって&=
意志のみ設定解除そのビットを設定して1ビットだけではないとの整数で他のビットには影響しません。 -
&=
ビットをセットしないと((1 & 0) === 0
、(0 & 0) === 0
)
- 以来
- 別のビットマスクで
&
演算子を使用する&
、そのビットマスクに設定されていない他のすべてのビットがフィルタリングされます。- 出力にビットが設定されている場合は、いずれかのオプションが有効になっていることを意味します。
- 出力にビットマスクセットのすべてのビットがある場合は、ビットマスク内のすべてのオプションが有効になっていることを意味します。
これらの比較演算子ことに注意してください:( <
>
<=
>=
==
===
!=
!==
<>
<=>
)これらのビットマスク・ビットマスク演算子よりも高い優先順位を持っています:( |
^
&
)。ビット演算結果はこれらの比較演算子を使用して比較されることが多いため、これは一般的な落とし穴です。
ビットシフト演算子
ビット単位の左シフト<<
:すべてのビットを指定されたステップ数だけ左(より重要)にシフトし、intサイズを超えるビットを破棄する
<< $x
は、最も高い$x
ビットの設定を解除し、2の$x
乗を掛けることと同等です
printf("%'08b", 0b00001011<< 2); // 00101100
assert(PHP_INT_SIZE === 4); // a 32-bit system
printf("%x, %x", 0x5FFFFFFF << 2, 0x1FFFFFFF << 4); // 7FFFFFFC, FFFFFFFF
ビット右シフト>>
:最下位シフトを破棄し、残りのビットを右にシフトします(それほど重要ではありません)
>> $x
は2の$x
乗で除算し、非整数部分を破棄する
printf("%x", 0xFFFFFFFF >> 3); // 1FFFFFFF
ビットシフトの使用例:
16によって高速除算(より良好な性能/= 16
)
$x >>= 4;
32ビットシステムでは、これは整数のすべてのビットを破棄し、値を0に設定します.64ビットシステムでは、これにより最上位32ビットがセッ
$x = $x << 32 >> 32;
有意な32ビット、 $x & 0xFFFFFFFF
相当
注:この例では、 printf("%'06b")
が使用されています。値を6進数で出力します。
オブジェクトとクラス演算子
オブジェクトまたはクラスのメンバーには、オブジェクト演算子( ->
)およびクラス演算子( ::
:)を使用してアクセスできます。
class MyClass {
public $a = 1;
public static $b = 2;
const C = 3;
public function d() { return 4; }
public static function e() { return 5; }
}
$object = new MyClass();
var_dump($object->a); // int(1)
var_dump($object::$b); // int(2)
var_dump($object::C); // int(3)
var_dump(MyClass::$b); // int(2)
var_dump(MyClass::C); // int(3)
var_dump($object->d()); // int(4)
var_dump($object::d()); // int(4)
var_dump(MyClass::e()); // int(5)
$classname = "MyClass";
var_dump($classname::e()); // also works! int(5)
オブジェクト演算子の後には$
を書き込まないように注意してください( $object->a
代わりに$object->$a
$object->a
$object->$a
)。クラス演算子の場合、これは当てはまりません。 $
が必要です。クラスで定義された定数の場合、 $
は使用されません。
また、 var_dump(MyClass::d());
関数d()
がオブジェクトを参照しない場合にのみ許可されます:
class MyClass {
private $a = 1;
public function d() {
return $this->a;
}
}
$object = new MyClass();
var_dump(MyClass::d()); // Error!
これは、 'PHPの致命的なエラーが発生します:キャッチされていないエラー:$ thisオブジェクトコンテキストではない'
これらの演算子は結合性を残しており、これを '連鎖'に使用できます。
class MyClass {
private $a = 1;
public function add(int $a) {
$this->a += $a;
return $this;
}
public function get() {
return $this->a;
}
}
$object = new MyClass();
var_dump($object->add(4)->get()); // int(5)
これらの演算子は、最も高い優先順位を持ち(マニュアルでも言及されていません)、さらに高いclone
です。従って:
class MyClass {
private $a = 0;
public function add(int $a) {
$this->a += $a;
return $this;
}
public function get() {
return $this->a;
}
}
$o1 = new MyClass();
$o2 = clone $o1->add(2);
var_dump($o1->get()); // int(2)
var_dump($o2->get()); // int(2)
$o1
の値は、オブジェクトがクローンされる前に追加されます!
優先度に影響を与えるためにカッコを使用することは、PHPバージョン5以前では機能しませんでした(PHP 7で機能します)。
// using the class MyClass from the previous code
$o1 = new MyClass();
$o2 = (clone $o1)->add(2); // Error in PHP 5 and before, fine in PHP 7
var_dump($o1->get()); // int(0) in PHP 7
var_dump($o2->get()); // int(2) in PHP 7