/
018_4.php
62 lines (57 loc) · 1.79 KB
/
018_4.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?php
declare(strict_types=1);
error_reporting(-1);
/* マジックメソッド */
class TestClass
{
// プロパティ
private string $str = '';
// コンストラクタ
public function __construct($str)
{
$this->str = $str;
}
// デストラクタ
public function __destruct()
{
echo __METHOD__ , "\n";
}
// 「アクセス不能プロパティ」への代入
public function __set(string $name, mixed $value): void
{
echo "アクセス不能プロパティ{$name}に以下の値を代入しようとしました\n";
var_dump($value);
}
// 「アクセス不能プロパティ」への参照
public function __get(string $name)
{
echo "アクセス不能プロパティ{$name}の値を取得しようとしました\n";
}
// 「アクセス不能メソッド」のcall
public function __call(string $name, array $arguments)
{
echo "アクセス不能メソッド{$name}を呼び出しました。引数は以下の通り\n";
var_dump($arguments);
}
// 検証用のprivateメソッド
private function privateFunc()
{
echo __METHOD__ , "\n";
}
}
// インスタンス(オブジェクト)の生成
$object = new TestClass('unchanged value');
// 未定義のプロパティへのアクセス
$object->hoge = 10;
echo $object->hoge;
// privateプロパティへのアクセス
$object->str = 'abc';
echo $object->str;
// 未定義メソッドのcall
$object->hoge(1, '2nd', false);
// privateメソッドのcall
$object->privateFunc();
// コンストラクタはマジックメソッドであるため結局は「メソッド」なので、callしようと思えばcall出来てしまう
var_dump($object);
$object->__construct('CHANGED VALUE');
var_dump($object);