定義済みのインターフェイスとクラス

目次

SPL インターフェイス および 定義済のクラス も参照ください。

Traversable インターフェイス

はじめに

そのクラスの中身が foreach を使用してたどれるかどうかを検出するインターフェイスです。

これは抽象インターフェイスであり、単体で実装することはできません。 IteratorAggregate あるいは Iterator を実装しなければなりません。

インターフェイス概要

Traversable

このインターフェイスにはメソッドがありません。 traverse 可能なすべてのクラス用の基底インターフェイスとしてのみ存在しています。

変更履歴

バージョン 説明
7.4.0 Traversable インターフェイスは、抽象クラスによって実装できるようになりました。 これを拡張するには、 Iterator あるいは IteratorAggregate を実装しなければなりません。

注意

注意:

このインターフェイスを実装した内部(組み込み)クラスは、 foreach の中で使うことができます。 IteratorAggregateIterator を実装する必要はありません。

注意:

PHP 7.4.0 より前のバージョンでは、 この内部的なエンジンのインターフェイスは PHP スクリプトが実装できませんでした。 代わりに、 IteratorAggregateIterator を使わなければなりませんでした。

Iterator インターフェイス

はじめに

外部のイテレータあるいはオブジェクト自身から反復処理を行うためのインターフェイスです。

インターフェイス概要

Iterator extends Traversable
/* メソッド */
public mixed Iterator::current()
public mixed Iterator::key()
public void Iterator::next()
public void Iterator::rewind()
public bool Iterator::valid()

定義済みのイテレータ

PHP には多くのイテレータがあらかじめ用意されており、日々の作業に使えます。その一覧は SPL イテレータ を参照ください。

例1 基本的な使用法

この例は、イテレータで foreach を使ったときに、どんな順番でメソッドが呼ばれるかを示すものです。

<?php
class myIterator implements Iterator {
    private 
$position 0;
    private 
$array = array(
        
"firstelement",
        
"secondelement",
        
"lastelement",
    );  

    public function 
__construct() {
        
$this->position 0;
    }

    public function 
rewind(): void {
        
var_dump(__METHOD__);
        
$this->position 0;
    }

    #[
\ReturnTypeWillChange]
    public function 
current() {
        
var_dump(__METHOD__);
        return 
$this->array[$this->position];
    }

    #[
\ReturnTypeWillChange]
    public function 
key() {
        
var_dump(__METHOD__);
        return 
$this->position;
    }

    public function 
next(): void {
        
var_dump(__METHOD__);
        ++
$this->position;
    }

    public function 
valid(): bool {
        
var_dump(__METHOD__);
        return isset(
$this->array[$this->position]);
    }
}

$it = new myIterator;

foreach(
$it as $key => $value) {
    
var_dump($key$value);
    echo 
"\n";
}
?>

上の例の出力は、 たとえば以下のようになります。

string(18) "myIterator::rewind"
string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
int(0)
string(12) "firstelement"

string(16) "myIterator::next"
string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
int(1)
string(13) "secondelement"

string(16) "myIterator::next"
string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
int(2)
string(11) "lastelement"

string(16) "myIterator::next"
string(17) "myIterator::valid"

参考

オブジェクトの反復処理も参照ください。

IteratorAggregate インターフェイス

はじめに

外部イテレータを作成するためのインターフェイスです。

インターフェイス概要

IteratorAggregate extends Traversable
/* メソッド */
public Traversable IteratorAggregate::getIterator()

例1 基本的な例

<?php
class myData implements IteratorAggregate {
    public 
$property1 "Public property one";
    public 
$property2 "Public property two";
    public 
$property3 "Public property three";
    public 
$property4 "";

    public function 
__construct() {
        
$this->property4 "last property";
    }

    public function 
getIterator(): Traversable {
        return new 
ArrayIterator($this);
    }
}

$obj = new myData;

foreach(
$obj as $key => $value) {
    
var_dump($key$value);
    echo 
"\n";
}
?>

上の例の出力は、 たとえば以下のようになります。

string(9) "property1"
string(19) "Public property one"

string(9) "property2"
string(19) "Public property two"

string(9) "property3"
string(21) "Public property three"

string(9) "property4"
string(13) "last property"

InternalIterator クラス

はじめに

内部クラス が、 IteratorAggregate を実装しやすくするためのクラスです。

クラス概要

final InternalIterator
implements Iterator
/* メソッド */
private __construct()
public mixed current()
public mixed key()
public void next()
public void rewind()
public bool valid()

Throwable

はじめに

Throwable は、throw 文でスロー可能なあらゆるオブジェクトが実装する基底インターフェイスです。 ErrorException も、これを実装しています。

注意:

PHP のクラスが Throwable インターフェイスを直接実装することはできません。 そのかわりに、Exception を継承する必要があります。

インターフェイス概要

Throwable extends Stringable
/* メソッド */
public string Throwable::getMessage()
public int Throwable::getCode()
public string Throwable::getFile()
public int Throwable::getLine()
public array Throwable::getTrace()
public string Throwable::getTraceAsString()
public Throwablenull Throwable::getPrevious()
public string Throwable::__toString()
/* 継承したメソッド */
public string Stringable::__toString()

変更履歴

バージョン 説明
8.0.0 Throwable は、 Stringable を新たに実装しました。

ArrayAccess インターフェイス

はじめに

配列としてオブジェクトにアクセスするための機能のインターフェイスです。

インターフェイス概要

ArrayAccess
/* メソッド */
public bool ArrayAccess::offsetExists(mixed $offset)
public mixed ArrayAccess::offsetGet(mixed $offset)
public void ArrayAccess::offsetSet(mixed $offset, mixed $value)
public void ArrayAccess::offsetUnset(mixed $offset)

例1 基本的な使用法

<?php
class Obj implements ArrayAccess {
    public 
$container = [
        
"one"   => 1,
        
"two"   => 2,
        
"three" => 3,
    ];

    public function 
offsetSet($offset$value): void {
        if (
is_null($offset)) {
            
$this->container[] = $value;
        } else {
            
$this->container[$offset] = $value;
        }
    }

    public function 
offsetExists($offset): bool {
        return isset(
$this->container[$offset]);
    }

    public function 
offsetUnset($offset): void {
        unset(
$this->container[$offset]);
    }

    public function 
offsetGet($offset): mixed {
        return isset(
$this->container[$offset]) ? $this->container[$offset] : null;
    }
}

$obj = new Obj;

var_dump(isset($obj["two"]));
var_dump($obj["two"]);
unset(
$obj["two"]);
var_dump(isset($obj["two"]));
$obj["two"] = "A value";
var_dump($obj["two"]);
$obj[] = 'Append 1';
$obj[] = 'Append 2';
$obj[] = 'Append 3';
print_r($obj);
?>

上の例の出力は、 たとえば以下のようになります。

bool(true)
int(2)
bool(false)
string(7) "A value"
obj Object
(
    [container:obj:private] => Array
        (
            [one] => 1
            [three] => 3
            [two] => A value
            [0] => Append 1
            [1] => Append 2
            [2] => Append 3
        )

)

Serializable インターフェイス

はじめに

独自のシリアライズ用のインターフェイスです。

このインターフェイスを実装したクラスは __sleep()__wakeup() をサポートしなくなります。 シリアライズが必要な場合には、自動的に serialize メソッドがコールされます。 このメソッドは __destruct() を実行しません。また、 メソッド内で明示的に書かない限りは一切の副作用を及ぼしません。 アンシリアライズされるときにはそのクラスが自動的に検知し、__construct() メソッドのかわりに適切な unserialize() メソッドがコールされます。 標準のコンストラクタを実行させたい場合は、unserialize() メソッドの中でそれをコールします。

警告

PHP 8.1.0 以降は、 __serialize()__unserialize() がない状態で Serializable を実装したクラスに対しては、推奨されない警告が発生します。

インターフェイス概要

Serializable
/* メソッド */
public stringnull Serializable::serialize()
public void Serializable::unserialize(string $data)

例1 基本的な使用法

<?php
class obj implements Serializable {
    private 
$data;
    public function 
__construct() {
        
$this->data "My private data";
    }
    public function 
serialize() {
        return 
serialize($this->data);
    }
    public function 
unserialize($data) {
        
$this->data unserialize($data);
    }
    public function 
getData() {
        return 
$this->data;
    }
}

$obj = new obj;
$ser serialize($obj);

var_dump($ser);

$newobj unserialize($ser);

var_dump($newobj->getData());
?>

上の例の出力は、 たとえば以下のようになります。

string(38) "C:3:"obj":23:{s:15:"My private data";}"
string(15) "My private data"

Closure クラス

はじめに

無名関数 を表すために使うクラスです。

無名関数は、Closure 型のオブジェクトを生成します。 このクラスにはメソッドが用意され、 生成した無名関数をさらにコントロールできるようになっています。

ここであげたメソッド以外にも、このクラスには __invoke メソッドが存在します。 これは、マジックメソッド __invoke() を実装した他のクラスとの一貫性を保つためのものであり、 関数をコールするときにこのメソッドは使われません。

クラス概要

final Closure
/* メソッド */
private __construct()
public static Closurenull bind(Closure $closure, objectnull $newThis, objectstringnull $newScope = "static")
public Closurenull bindTo(objectnull $newThis, objectstringnull $newScope = "static")
public mixed call(object $newThis, mixed ...$args)
public static Closure fromCallable(callable $callback)

stdClass クラス

はじめに

動的なプロパティが使える、汎用的な空のクラスです。

このクラスのインスタンスは、 new 演算子や、 オブジェクトへの型変換 によって作成できます。 PHP の関数によっては、このクラスのインスタンスを返すものがあります。 たとえば json_decode, mysqli_fetch_object, PDOStatement::fetchObject が挙げられます。

マジックメソッド __get()/__set() を実装しているかどうかに関わらず、 このクラスでは動的なプロパティが許可されています。 よって、#[\AllowDynamicProperties] アトリビュートは必要ありません。

PHP には全てのクラスの親となる基底クラスの概念がないため、 このクラスは基底クラスではありません。 ただ、stdClass を継承させることで、 動的なプロパティの機能を持ったカスタムクラスを結果的に作ることはできます。

クラス概要

stdClass

このクラスは、メソッドやデフォルトのプロパティを持っていません。

例1 オブジェクトへの型変換を使い、stdClass を作る

<?php
$obj 
= (object) array('foo' => 'bar');
var_dump($obj);

上の例の出力は以下となります。

object(stdClass)#1 (1) {
  ["foo"]=>
  string(3) "bar"
}

例2 json_decode によって、stdClass を作る

<?php
$json 
'{"foo":"bar"}';
var_dump(json_decode($json));

上の例の出力は以下となります。

object(stdClass)#1 (1) {
  ["foo"]=>
  string(3) "bar"
}

例3 動的にプロパティを宣言する

<?php
$obj 
= new stdClass();
$obj->foo 42;
$obj->{1} = 42;
var_dump($obj);

上の例の出力は以下となります。

object(stdClass)#1 (2) {
  ["foo"]=>
  int(42)
  ["1"]=>
  int(42)
}

Generator クラス

はじめに

Generatorジェネレータ が返すオブジェクトです。

警告

Generator オブジェクトのインスタンスは new では作れません。

クラス概要

final Generator
implements Iterator
/* メソッド */
public mixed current()
public mixed getReturn()
public mixed key()
public void next()
public void rewind()
public mixed send(mixed $value)
public mixed throw(Throwable $exception)
public bool valid()
public void __wakeup()

参考

オブジェクトの反復処理 も参照ください。

Fiber クラス

はじめに

ファイバー(Fiber) は 完全なスタックを持つ、停止可能な関数です。 ファイバー はコールスタック中のどこからでも停止することができますし、 後に再開されるまで実行を停止したままにできます。

クラス概要

final Fiber
/* メソッド */
public __construct(callable $callback)
public mixed start(mixed ...$args)
public mixed resume(mixed $value = null)
public mixed throw(Throwable $exception)
public mixed getReturn()
public bool isStarted()
public bool isSuspended()
public bool isRunning()
public bool isTerminated()
public static mixed suspend(mixed $value = null)
public static Fibernull getCurrent()

WeakReference クラス

はじめに

弱い参照により、オブジェクトが破棄されるのを妨げないオブジェクトへの参照を保持することが可能です。 この機能は、キャッシュのようなデータ構造を実装するのに役立ちます。

WeakReference クラスはシリアライズできません。

クラス概要

final WeakReference
/* メソッド */
public __construct()
public static WeakReference create(object $object)
public objectnull get()

WeakReference の例

例1 基本的な WeakReference クラスの使い方

<?php
$obj 
= new stdClass;
$weakref WeakReference::create($obj);
var_dump($weakref->get());
unset(
$obj);
var_dump($weakref->get());
?>

上の例の出力は、 たとえば以下のようになります。

object(stdClass)#1 (0) {
}
NULL

WeakMap クラス

はじめに

WeakMap は、 オブジェクトをキーとして受け入れるマップ(辞書)です。 SplObjectStorage と似ていますが、 WeakMap のキーとなるオブジェクトは、 オブジェクトのリファレンスカウントが更新されません。 つまり、WeakMap のキーとなっているオブジェクトだけが唯一の残された参照だった場合、 オブジェクトはガベージコレクションの対象となり WeakMap から削除されます。 WeakMap の用途は、 長く生き残る必要がないオブジェクトから派生した、 データのキャッシュを作ることです。

WeakMapArrayAccess, Iterator, Countable を実装しています。 よって、ほとんどのケースで、 連想配列と同じやり方で操作できます。

クラス概要

final WeakMap
implements ArrayAccess Countable IteratorAggregate
/* メソッド */
public int count()
public Iterator getIterator()
public bool offsetExists(object $object)
public mixed offsetGet(object $object)
public void offsetSet(object $object, mixed $value)
public void offsetUnset(object $object)

例1 Weakmap の使い方の例

<?php
$wm 
= new WeakMap();

$o = new stdClass;

class 
{
    public function 
__destruct() {
        echo 
"Dead!\n";
    }
}

$wm[$o] = new A;

var_dump(count($wm));
echo 
"Unsetting...\n";
unset(
$o);
echo 
"Done\n";
var_dump(count($wm));

上の例の出力は以下となります。

int(1)
Unsetting...
Dead!
Done
int(0)

Stringable インターフェイス

はじめに

Stringable インターフェイスは、 特定のクラスが __toString() メソッドを実装していることを示します。 ほとんどのインターフェイスと異なり、 Stringable は、マジックメソッド __toString() が定義されているあらゆるクラスで 暗黙のうちに存在すると見なされますが、 明示的に宣言することもできますし、宣言すべきです。

このインターフェイスの一番の存在意義は、 文字列プリミティブや、 文字列にキャストできるオブジェクトを受け入れる union型 string|Stringable に対する型チェックを、関数ができるようにすることです。

インターフェイス概要

Stringable
/* メソッド */
public string Stringable::__toString()

Stringable インターフェイスの例

例1 基本的な Stringable インターフェイスの使い方

<?php
class IPv4Address implements Stringable {
    private 
string $oct1;
    private 
string $oct2;
    private 
string $oct3;
    private 
string $oct4;

    public function 
__construct(string $oct1string $oct2string $oct3string $oct4) {
        
$this->oct1 $oct1;
        
$this->oct2 $oct2;
        
$this->oct3 $oct3;
        
$this->oct4 $oct4;
    }

    public function 
__toString(): string {
        return 
"$this->oct1.$this->oct2.$this->oct3.$this->oct4";
    }
}

function 
showStuff(string|Stringable $value) {
    
// Stringable の場合、__toString をコールすることで
    // オブジェクトが文字列に変換されます。
    
print $value;
}

$ip = new IPv4Address('123''234''42''9');

showStuff($ip);
?>

上の例の出力は、 たとえば以下のようになります。

123.234.42.9

UnitEnum インターフェイス

はじめに

UnitEnum インターフェイスは、 全ての列挙型に対して、PHP のエンジンが自動的に適用するものです。 ユーザー定義のクラスとして実装してはいけません。 列挙型はメソッドのオーバーライドを禁止しています。 デフォルトの実装は PHP のエンジンから提供されるからです。 このインターフェイスは、型チェックのためだけに存在しています。

インターフェイス概要

UnitEnum
/* メソッド */
public static array UnitEnum::cases()

BackedEnum インターフェイス

はじめに

BackedEnum インターフェイスは、 Backed Enum を定義すると、PHP のエンジンが自動的に適用します。 ユーザー定義のクラスとして実装してはいけません。 列挙型はメソッドのオーバーライドを禁止しています。 デフォルトの実装は PHP のエンジンから提供されるからです。 このインターフェイスは、型チェックのためだけに存在しています。

インターフェイス概要

BackedEnum extends UnitEnum
/* メソッド */
public static static BackedEnum::from(intstring $value)
public static staticnull BackedEnum::tryFrom(intstring $value)
/* 継承したメソッド */
public static array UnitEnum::cases()

SensitiveParameterValue クラス

はじめに

SensitiveParameterValue クラスを使うと、 秘密の値をうっかり公開してしまうことを防ぐために値をラップすることができます。

SensitiveParameter アトリビュートを持つパラメータに渡される値は、 スタックトレース中では SensitiveParameterValue オブジェクトで自動的にラップされます。

クラス概要

final SensitiveParameterValue
/* プロパティ */
private readonly mixed $value;
/* メソッド */
public __construct(mixed $value)
public array __debugInfo()
public mixed getValue()

プロパティ

value

うっかり公開してしまうことを防ぎたい、秘密の値