0
0

オブジェクトの操作

Last updated at Posted at 2024-05-10

はじめに

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標準クラス。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0