はじめに
PHPのオブジェクトの操作についてまとめる。
オブジェクトの代入
オブジェクト変数の代入は参照渡しが規定。
Person.php
class Person
{
public $firstName;
public $lastName;
public function __construct($firstName, $lastName)
{
$this->firstName = $firstName;
$this->lastName = $lastName;
}
public function show()
{
print "<p>私の名前は{$this->lastName}{$this->firstName}です。</p>";
}
}
clone.php
require_once 'Person.php';
$p1 = new Person('リオ', '山田');
$p2 = $p1;
$p2->firstName = '奈美';
$p2->lastName = '掛谷';
print_r($p1); // 結果:Person Object ( [firstName] => 奈美 [lastName] => 掛谷 )
print_r($p2); // 結果:Person Object ( [firstName] => 奈美 [lastName] => 掛谷 )
オブジェクトが参照渡しされた結果、変数$p2
への変更が元々の$p1
にも反映されている。
オブジェクトの値渡し
オブジェクトを値渡ししたい場合には、clone命令を使う。
clone2.php
require_once 'Person.php';
$p1 = new Person('リオ', '山田');
$p2 = clone $p1;
$p2->firstName = '奈美';
$p2->lastName = '掛谷';
print_r($p1); // 結果:Person Object ( [firstName] => リオ [lastName] => 山田 )
print_r($p2); // 結果:Person Object ( [firstName] => 奈美 [lastName] => 掛谷 )
オブジェクトの比較
== → 同じクラスのインスタンスであると同時に、同じプロパティと値を持つこと。
=== → 同じクラスの同じインスタンスを参照すること。
compare.php
require_once 'Person.php';
$p1 = new Person('リオ', '山田');
$p2 = $p1;
var_dump($p1 == $p2); // 結果:bool (true)
var_dump($p1 === $p2); // 結果:bool (true)
$p3 = clone $p1;
var_dump($p1 == $p3); // 結果:bool (true)
var_dump($p1 === $p3); // 結果:bool (false)
オブジェクトの反復処理
FliendList
クラスをforeach
命令で処理すると、配列$list
の内容が順番に処理される。
FliendList.php
class FliendList implements IteratorAggregate
{
public string $version = '1.0.0';
public string $name = '友人リスト';
private $list = [];
public function getIterator()
{
return new ArrayIterator($this->list);
}
public function add(Person $p): void
{
$this->list[] = $p;
}
}
foreach_custom.php
require_once 'Person.php';
require_once 'FriendList.php';
$list = new FriendList();
$list->add(new Person('太郎', '山田'));
$list->add(new Person('奈美', '掛谷'));
$list->add(new Person('賢', '高江'));
foreach ($list as $value) {
$value->show();
}
// 実行結果
// 私の名前は山田太郎です。
// 私の名前は掛谷奈美です。
// 私の名前は高江賢です。
IteratorAggregate
インターフェイスを実装する
IteratorAggregate
インターフェイスはカスタムの反復機能を実装するための機能を取り決めているPHP標準のインターフェイス。
IteratorAggregate
インターフェイスを実装した上で、そのgetIterator
メソッドをオーバーライドする必要がある。
getIterator
メソッドをオーバーライドする
getIterator
メソッドは反復処理に使うイテレーターを返すためのメソッド。
getIterator
メソッドがArrayIterator
オブジェクトを返すように実装している。
ArrayIterator
クラスは配列にイテレーターとしての機能を持たせるためのPHP標準クラス。