PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPで非クラスオブジェクト(stdClass)のプロパティ構造を継承してnull値を持つオブジェクトを作成する方法

PHPでは、クラスを定義せずに (object) キャストを使って生成したオブジェクト(stdClass)について、元のオブジェクトが持つプロパティ名だけを引き継ぎ、値はすべて null にした新しいオブジェクトを作りたいケースがあります。この記事では、その実現方法として2つのアプローチを紹介します。

方法1:cloneとforeachを組み合わせる

まず clone でオブジェクトを複製し、その後 foreach ループで各プロパティ名を取得しながら、順番に null を代入していきます。これにより、プロパティの構造(名前と数)はそのままに、中身だけを空にしたオブジェクトが得られます。

コード例

<!DOCTYPE html>
<html>
<body>
<?php
// 元となるオブジェクトを作成
$firstObject = (object)[
    "Name" => "John",
    "Age"  => 20
];

// オブジェクトを複製
$secondObject = clone $firstObject;
var_dump($firstObject);
echo "<br>";
var_dump($secondObject);

// 複製したオブジェクトの全プロパティに null を代入
foreach ($secondObject as $keyName => $keyValue) {
    $secondObject->$keyName = null;
}
echo "<br>";
var_dump($secondObject);

// 方法2:配列から array_fill_keys を使って null 埋めのオブジェクトを生成
$firstObject = [
    "Name" => "John",
    "Age"  => 20
];
echo "<br>";
$arrayObject = array_fill_keys(array_keys($firstObject), null);
$secondObject = (object)$arrayObject;
var_dump($secondObject);
?>
</body>
</html>

実行結果

上記のコードを実行すると、次のような出力が得られます。

object(stdClass)#1 (2) { ["Name"]=> string(4) "John" ["Age"]=> int(20) }
object(stdClass)#2 (2) { ["Name"]=> string(4) "John" ["Age"]=> int(20) }
object(stdClass)#2 (2) { ["Name"]=> NULL ["Age"]=> NULL }
object(stdClass)#1 (2) { ["Name"]=> NULL ["Age"]=> NULL }

方法2:array_fill_keys()を使う(推奨)

もうひとつの方法は、元のデータを連想配列として扱い、array_keys() でキー(=プロパティ名)の一覧を取得したうえで、array_fill_keys() を使ってすべてのキーに null を割り当てるやり方です。最後に (object) でキャストすれば、目的のオブジェクトが完成します。

この方法のメリットは以下のとおりです。

  • clone + foreach の組み合わせよりもコードが簡潔になる
  • 元のオブジェクトや配列を一切変更せず、新しいオブジェクトを安全に生成できる
  • 処理の意図(「同じキー構造で値が空のオブジェクトを作る」)がコードから読み取りやすい

まとめ

非クラスオブジェクト(stdClass)のプロパティ構造を継承しつつ、値をすべて null にしたい場合は、cloneforeach の組み合わせでも実現できますが、array_fill_keys(array_keys($array), null) を使う方法のほうがシンプルで安全です。テンプレート用の空オブジェクトや初期化済みのデータ構造が必要な場面でぜひ活用してください。

  1. PHPのget_object_vars()関数の使い方を徹底解説

    PHPのget_object_vars()関数は、指定されたオブジェクトが持つプロパティを取得するための関数です。オブジェクト内で定義されているプロパティを、プロパティ名をキーとした連想配列の形式で返します。 構文 get_object_vars(object) パラメータ object − プロパティを取得したいオブジェクトのインスタンスを指定します。 戻り値 get_object_vars()関数は、指定されたオブジェクトの定義済みプロパティを連想配列として返します。まだ値が代入されていないプロパティについては、NULLが返されます。 なお、この関数をクラスの外部から呼び出した場合、取

  2. C#のObjectクラスとは?全クラスの基底クラスと主要メソッドを徹底解説

    C#におけるObjectクラスは、すべてのクラスの継承階層において最も上位に位置する基底クラス(ルートクラス)です。C#で定義されるあらゆる型は、明示的に指定しなくても自動的にObjectクラスを継承しており、そのためすべてのオブジェクトはObjectクラスが提供するメソッドを利用できます。Objectクラスの主なメソッド一覧Objectクラスには、以下のような重要なメソッドが用意されています。番号メソッドと説明1Equals(Object)指定されたオブジェクトが、現在のオブジェクトと等しいかどうかを判定します。2Equals(Object, Object)指定された2つのオブジェクトインス