web-dev-qa-db-ja.com

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

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

$aVal = array();

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

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

(object)$oVal = "";

$oVal->key1->var1 = "something";
$oVal->key1->var2 = "something else";
332
ed209
$x = new stdClass();

マニュアルの コメント はそれを最もよくまとめています:

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

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

760
zombat

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

$oVal = new stdClass();

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

$oVal = (object)[];

stdClassは初心者のプログラマーに誤解を招く可能性があるため(例:「クラスではなくオブジェクトが欲しい!」).

PHP <5.4と同じです。

$oVal = (object) array();

(object)[]new stdClass()と同等です。

PHPマニュアル( はこちら )を参照してください。

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

and( ここ ):

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


しかし@PaulPが言ったように、empty($ oVal)はfalseを返すことを忘れないでください。

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

あなたの例に関して、あなたが書いた場合:

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

PHPは、暗黙のうちにプロパティkey1(オブジェクト自身)を作成することで、以下のWarningを作成します。

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

あなたの設定( エラー報告レベル を参照)がこの警告をブラウザに表示するならば、これは問題であるかもしれません。これは別のトピック全体ですが、迅速で汚いアプローチは エラー制御演算子(@) を使用して警告を無視することです。

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

PHPには、空のオブジェクトのようなものはありません。

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

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

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

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

Changelog関数からの引用

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

33
PaulP

php.netはそれが最高だと言った:

$new_empty_object = new stdClass();
17
HungryCoder

JavaScriptで匿名型のオブジェクトを作成するのがどれほど簡単か、私は気に入っています。

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

だから私はいつもこのようなオブジェクトをPHPに書き込もうとしています。javascriptはと同じです。

//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

また、このシンタクスを使うと、 面白い驚き を見つけることができますが、ほとんどの場合はうまくいきます。

12
campsjos

あなたがstdClassを忘れ続けるならゾンバットの答えに加えて

   function object(){

        return new stdClass();

    }

今、あなたはできる:

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

あなたは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 ) 
6
Amr

連想配列と同じように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};
5
GCoro

この方法でも試すことができます。

<?php
     $obj = json_decode("{}"); 
     var_dump($obj);
?>

出力:

object(stdClass)#1 (0) { }
4
Mukesh Jeengar

他の人が指摘したように、あなたはstdClassを使うことができます。しかし、私はそれがのように、()なしできれいだと思います:

$obj = new stdClass;

しかし、質問に基づいて、それはあなたが本当に欲しいものがその場でオブジェクトにプロパティを追加することができるということであるように思えます。そのためにstdClassを使用する必要はありませんが、できます。本当にあなたはどんなクラスでも使うことができます。任意のクラスのオブジェクトインスタンスを作成してプロパティの設定を開始するだけです。このような場合に使用したい基本的な拡張機能がいくつかあるだけで、他のクラスから拡張するのに適しているという独自のクラスを作成するのが好きです。基本的にそれは私自身の基本オブジェクトクラスです。私はまた単に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()関数の使用法を見つけるかもしれません。値を返すのは通常の関数で、コンストラクタほど制限はありません。たとえば、関数名は、呼び出し可能パラメータを受け入れる関数に文字列として渡すことができます。機能は連鎖もサポートします。そのため、次のようなことができます。$ result = o($ internal_value) - > some_operation_or_conversion_on_this_value();

これは、最上位層が完全な内部DSLで記述されている状態で、他の言語層を構築するための基本的な「言語」にとって素晴らしいスタートです。これはLISPスタイルの開発と似ており、PHPはほとんどの人が理解するよりもずっと良くそれをサポートしています。私はこれが質問に対するちょっとした接線であることを認識していますが、質問は私がPHPの力を十分に活用するための基礎であると思うものに触れます。

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
fredtma

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

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

あるいは配列をオブジェクトにキャストする

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

あなたがこれをしたくないならば:

$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',
);
2
Vasil Nikolov

これが反復の例です。

<?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; ?>
1
fingerman

この悪いが便利なテクニックがあります:

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