PHPで空のオブジェクトを定義する方法


384

新しい配列でこれを行います:

$aVal = array();

$aVal[key1][var1] = "something";
$aVal[key1][var2] = "something else";

オブジェクトに同様の構文はありますか

(object)$oVal = "";

$oVal->key1->var1 = "something";
$oVal->key1->var2 = "something else";

13
$var = (object) (boolean) (string) (int) (array) new StdClass; 安全のためにね
Xeoncross 2013年

1
Googleはこの質問のタイトルを次のようにインデックス化しました:Arrays - How to define an empty object in PHP。アレイとは何の関係もありません
Kolob Canyon

回答:


848
$x = new stdClass();

マニュアルでのコメント最高まとめて:

stdClassはデフォルトのPHPオブジェクトです。stdClassには、プロパティ、メソッド、親はありません。マジックメソッドをサポートしておらず、インターフェイスも実装していません。

スカラーまたは配列をObjectとしてキャストすると、stdClassのインスタンスが取得されます。汎用オブジェクトインスタンスが必要なときはいつでもstdClassを使用できます。


5
$ o =(オブジェクト)NULL; -オブジェクトがオブジェクトに変換された場合、オブジェクトは変更されません。他のタイプの値がオブジェクトに変換されると、stdClass組み込みクラスの新しいインスタンスが作成されます。値がNULLの場合、新しいインスタンスは空になります。配列は、キーによって名前が付けられたプロパティと対応する値を持つオブジェクトに変換されます。その他の値の場合、スカラーという名前のメンバー変数に値が含まれます。
DDS 2013年

11
stdClassは頭の中で「標準クラス」と言っています
sjagr 2014

1
私の答えを忘れてしまったら:)
RafaSashi

26
「見つかりません」に遭遇した場合:new \stdClass(); PHP Namespace Doc
2540625

3
@IvanCastellanos stdClass()言葉から思い出す方法を説明してくれませAIDSんか?
アダム

117

「空の」オブジェクトを作成する標準的な方法は次のとおりです。

$oVal = new stdClass();

しかし、PHP> = 5.4では、私は個人的に以下を使用することを好みます:

$oVal = (object)[];

それは短く、個人的にはstdClassがは初心者プログラマに誤解を招く可能性がある(つまり、「クラスではなく、オブジェクトが欲しい!」...)、。

PHP 5.4と同じです:

$oVal = (object) array();

(object)[] に相当 new stdClass()です。

PHPマニュアル(ここ):

stdClass:オブジェクトへの型キャストによって作成されます。

と(ここ):

オブジェクトがオブジェクトに変換された場合、オブジェクトは変更されません。他のタイプの値がオブジェクトに変換されると、stdClass組み込みクラスの新しいインスタンスが作成されますます。


しかし、覚えておいてください 、@ PaulPが言ったように、empty($ oVal)はfalseを返すことに注意してください。

プロパティのないオブジェクトは、空と見なされなくなりました。

あなたの例に関して、あなたが書くならば:

$oVal = new stdClass();
$oVal->key1->var1 = "something"; // PHP creates  a Warning here
$oVal->key1->var2 = "something else";

PHPは次の警告を作成し、暗黙的にプロパティを作成します key1(オブジェクト自体)を

警告:空の値からデフォルトオブジェクトを作成しています

構成(エラー報告レベルを参照)がこの警告をブラウザーに表示する場合、これは問題になる可能性があります。これは別のトピック全体ですが、警告を無視するために、エラー制御演算子(@)を使用することで、迅速でわかりにくいアプローチが考えられます。

$oVal = new stdClass();
@$oVal->key1->var1 = "something"; // the warning is ignored thanks to @
$oVal->key1->var2 = "something else";

3
問題を修正する代わりに、新しい問題を作成します。修正が必要な問題は、人々が何をするかを知っているべきだというstdClassことです。
Pacerier 2015年

2
何を書いたのかstdClassstdClass質問に答えるコードを使用しました。申し訳ありませんが、私は新しい問題を作成していません。それは私の個人的な意見でした(書いたとおり)。
cgaldiolo 2015年

6
"個人的な好み"!= "問題"
cgaldiolo 2015年

4
@Pacerier、私はあなたの頑固さを理解していません。問題は「PHPで空のオブジェクトを定義する方法」でした。私の答えは正しいので、「new stdClass()」を使用するように書きました。ユーザー「ed209」に提供したコードは正しく、「new stdClass()」を使用しました。さらに、個人的な意見を追加し、「標準的な」方法ではないことを明確にするために、「個人的に」大胆に使用しました。私の謙虚な意見では、非常に多くのコメントに値する問題は、少なくとも間違った答えになるはずです。代わりに、個人的な意見を問題と考える場合、これは建設的なアイデアの共有の問題かもしれません。
cgaldiolo 2015

9
私は省略形が本当に好きです(object) []
Rahil Wazir 2017

35

PHPには、空のオブジェクトのようなものは存在しないことを指摘しておきます。

$obj = new stdClass();
var_dump(empty($obj)); // bool(false)

もちろん、$ objは空になります。

一方、空の配列はどちらの場合も空を意味します

$arr = array();
var_dump(empty($arr));

空の変更ログ関数からの引用

プロパティのないオブジェクトは、空と見なされなくなりました。


空の変更ログでその引用を見つけることができませんでした。
powpow12

@ powpow12 かつてそこにあった。5.0.0で変更されました。
Stanley Umeanozie


14

JavaScriptで匿名型のオブジェクトを作成するのがいかに簡単かが大好きです。

//JavaScript
var myObj = {
    foo: "Foo value",
    bar: "Bar value"
};
console.log(myObj.foo); //Output: Foo value

だから私はいつもこの種のオブジェクトをjavascriptのようにPHPで書こうとします:

//PHP >= 5.4
$myObj = (object) [
    "foo" => "Foo value",
    "bar" => "Bar value"
];

//PHP < 5.4
$myObj = (object) array(
    "foo" => "Foo value",
    "bar" => "Bar value"
);

echo $myObj->foo; //Output: Foo value

ただし、これは基本的に配列であるため、jsのようにプロパティに無名関数を割り当てることはできません。

//JavaScript
var myObj = {
    foo: "Foo value",
    bar: function(greeting) {
        return greeting + " bar";
    }
};
console.log(myObj.bar("Hello")); //Output: Hello bar

//PHP >= 5.4
$myObj = (object) [
    "foo" => "Foo value",
    "bar" => function($greeting) {
        return $greeting . " bar";
    }
];
var_dump($myObj->bar("Hello")); //Throw 'undefined function' error
var_dump($myObj->bar); //Output: "object(Closure)"

まあ、あなたはそれをすることができますが、IMOは実用的ではありません/きれいです:

$barFunc = $myObj->bar;
echo $barFunc("Hello"); //Output: Hello bar

また、このSynthaxを使用すると、面白い驚きを見つけることができますが、ほとんどの場合は問題なく動作します。


1
これは受け入れられる答えになるはずです
マイクアロン

11

ゾンバの答えに加えて、忘れるなら stdClass

   function object(){

        return new stdClass();

    }

今あなたはできる:

$str='';
$array=array();
$object=object();

私はこのテクニックが大好きですが、ほとんどのIDEは「オブジェクト」という用語を他のプログラマーを混乱させる可能性がある関数として強調していません。しかし、ちょっと、それは私のために働きます!
Brixster

7

使用できますnew stdClass()(推奨):

$obj_a = new stdClass();
$obj_a->name = "John";
print_r($obj_a);

// outputs:
// stdClass Object ( [name] => John ) 

または、空の配列をオブジェクトに変換して、stdClass組み込みクラスの新しい空のインスタンスを生成することもできます。

$obj_b = (object) [];
$obj_b->name = "John";
print_r($obj_b);

// outputs: 
// stdClass Object ( [name] => John )  

または、null値をstdClass組み込みクラスの新しい空のインスタンスを生成するオブジェクトに変換できます。

$obj_c = (object) null;
$obj_c->name = "John";
print($obj_c);

// outputs:
// stdClass Object ( [name] => John ) 

5

連想配列で行うのと同じ方法でstdClassのデータにアクセスするには、{$ var}構文を使用します。

$myObj = new stdClass;
$myObj->Prop1 = "Something";
$myObj->Prop2 = "Something else";

// then to acces it directly

echo $myObj->{'Prop1'};
echo $myObj->{'Prop2'};

// or what you may want

echo $myObj->{$myStringVar};

4

他の人が指摘したように、stdClassを使用できます。ただし、次のように、()がない方がきれいだと思います。

$obj = new stdClass;

しかし、質問に基づいて、あなたが本当に欲しいのは、その場でオブジェクトにプロパティを追加できるようにすることです。stdClassを使用する必要はありませんが、使用できます。本当にあなたはどんなクラスでも使うことができます。クラスのオブジェクトインスタンスを作成し、プロパティの設定を開始するだけです。私は自分のクラスを作成するのが好きです。名前は単にoであり、これらの場合に使用したい基本的な拡張機能があり、他のクラスから拡張するのに適しています。基本的にそれは私自身のベースオブジェクトクラスです。また、単にo()という名前の関数が欲しいです。そのようです:

class o {
  // some custom shared magic, constructor, properties, or methods here
}

function o() {
  return new o;
}

独自のベースオブジェクトタイプを使用したくない場合は、o()で新しいstdClassを返すだけです。1つの利点は、クラス名、関数名、またはその両方として使用するかどうかに関係なく、oはstdClassより覚えやすく、短いということです。oクラス内にコードがない場合でも、大文字と小文字が区別されて名前が付けられたstdClass(「性感染症クラス」の概念を呼び出す可能性があります)よりも覚えやすくなります。oクラスをカスタマイズすると、コンストラクター構文の代わりにo()関数が使用されることがあります。これは値を返す通常の関数であり、コンストラクタよりも制限が少ないです。たとえば、関数名を文字列として呼び出し可能なパラメーターを受け入れる関数に渡すことができます。関数は連鎖もサポートします。だからあなたは次のようなことをすることができます:

これは、ベースの「言語」が他の言語層を構築するための素晴らしい出発点であり、最上層は完全な内部DSLで記述されています。これはlispスタイルの開発に似ており、PHPはほとんどの人が理解するよりも優れた方法でサポートします。これは少し問題の正接に気づきますが、問題は、PHPの力を最大限に活用するためのベースであると私が思うものに触れています。


2
@Pacerierは、括弧なしを意味しますか?;)cis.upenn.edu/~matuszek/General/JavaSyntax/parentheses.html
still_dreaming_1

1
それはタイプミスです、それは括弧がないはずです。
Pacerier、2015


4

未定義のプロパティの警告を受け取らずに、動的プロパティを持つオブジェクト(JavaScriptなど)を作成する場合。

class stdClass {

public function __construct(array $arguments = array()) {
    if (!empty($arguments)) {
        foreach ($arguments as $property => $argument) {
            if(is_numeric($property)):
                $this->{$argument} = null;
            else:
                $this->{$property} = $argument;
            endif;
        }
    }
}

public function __call($method, $arguments) {
    $arguments = array_merge(array("stdObject" => $this), $arguments); // Note: method argument 0 will always referred to the main class ($this).
    if (isset($this->{$method}) && is_callable($this->{$method})) {
        return call_user_func_array($this->{$method}, $arguments);
    } else {
        throw new Exception("Fatal error: Call to undefined method stdObject::{$method}()");
    }
}

public function __get($name){
    if(property_exists($this, $name)):
        return $this->{$name};
    else:
        return $this->{$name} = null;
    endif;
}

public function __set($name, $value) {
    $this->{$name} = $value;
}

}

$obj1 = new stdClass(['property1','property2'=>'value']); //assign default property
echo $obj1->property1;//null
echo $obj1->property2;//value

$obj2 = new stdClass();//without properties set
echo $obj2->property1;//null


4

汎用オブジェクトを使用して、キーと値のペアをマッピングします。

$oVal = new stdClass();
$oVal->key = $value

または、配列をオブジェクトにキャストします

$aVal = array( 'key'=>'value' );
$oVal = (object) $aVal;

3

これを行いたくない場合:

$myObj = new stdClass();
$myObj->key_1 = 'Hello';
$myObj->key_2 = 'Dolly';

次のいずれかを使用できます。

PHP> = 5.4

$myObj = (object) [
    'key_1' => 'Hello',
    'key_3' => 'Dolly',
];

PHP <5.4

$myObj = (object) array(
    'key_1' => 'Hello',
    'key_3' => 'Dolly',
);

3

ここで反復の例:

<?php
$colors = (object)[];
$colors->red = "#F00";
$colors->slateblue = "#6A5ACD";
$colors->orange = "#FFA500";

foreach ($colors as $key => $value) : ?>
    <p style="background-color:<?= $value ?>">
        <?= $key ?> -> <?= $value ?>
    </p>
<?php endforeach; ?>

0

あなたはこの悪いが便利なテクニックを持っています:

$var = json_decode(json_encode([]), FALSE);

0

stdClassはデフォルトのPHPオブジェクトです。stdClassには、プロパティ、メソッド、親はありません。マジックメソッドをサポートしておらず、インターフェイスも実装していません。

スカラーまたは配列をObjectとしてキャストすると、stdClassのインスタンスが取得されます。汎用オブジェクトインスタンスが必要なときはいつでもstdClassを使用できます。

<?php
// ways of creating stdClass instances
$x = new stdClass;
$y = (object) null;        // same as above
$z = (object) 'a';         // creates property 'scalar' = 'a'
$a = (object) array('property1' => 1, 'property2' => 'b');
?>

stdClassは基本クラスではありません!PHPクラスは、どのクラスからも自動的に継承しません。別のクラスを明示的に拡張しない限り、すべてのクラスはスタンドアロンです。PHPは、この点で多くのオブジェクト指向言語とは異なります。

<?php
// CTest does not derive from stdClass
class CTest {
    public $property1;
}
$t = new CTest;
var_dump($t instanceof stdClass);            // false
var_dump(is_subclass_of($t, 'stdClass'));    // false
echo get_class($t) . "\n";                   // 'CTest'
echo get_parent_class($t) . "\n";            // false (no parent)
?>

コードで 'stdClass'という名前のクラスを定義することはできません。その名前はすでにシステムで使用されています。'Object'という名前のクラスを定義できます。

stdClassを拡張するクラスを定義することはできますが、stdClassは何もしないため、何のメリットもありません。

(PHP 5.2.8でテスト済み)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.