2

PHPで存在しない、または存在しない既知のメンバーに何かを自由に割り当てることはできますか? メンバー名と連想配列のインデックスに違いはありますか?

私は違いがあります

$a = array();
$a['foo'] = 'something';

 $a->foo = 'something';

違いがある場合、「空の」オブジェクトを作成してメンバーを動的に追加するにはどうすればよいですか?

4

3 に答える 3

8

配列(データのバッグ/コンテナー)とオブジェクト(セマンティックな意味と機能を備えたデータのラッピング)を混合しています。

アレイアクセス

他の言語でHashTableまたはDictionaryのように機能する配列を使用しているため、最初の方法は正しいです。

$a = array();               // create an empty "box"
$a['foo'] = 'something';    // add something to this array

オブジェクトアクセス

2つ目は、オブジェクトアクセスです。次のようなものを使用します。

class Foo {
    public $foo;
}

$a = new Foo();
$a->foo = 'something';

その場合のより良い使用法は、このようなセッター/ゲッターアプローチを使用することですが。

class Foo {
    private $foo;
    public function setFoo($value) {
        $this->foo = $value;
    }
    public function getFoo() {
        return $this->foo;
    }
}

$a = new Foo();
$a->setFoo('something');
var_dump($a->getFoo());

PHPマジック

ただし、 PHPのマジックメソッドを使用して、説明したような動作を作成するオプションはまだあります。それにもかかわらず、これはエラーにつながり、(単体)テストではるかに困難な時間を与えるため、オブジェクトにデータを格納する通常の方法ではないと見なす必要があります。

class Foo {
    private $data = array();
    public function __set($key, $value) {
        $this->data[$key] = $value;
    }
    public function __get($key) {
        return $this->data[$key];
    }
}

$a = new Foo();
$a->foo = 'something';   // this will call the magic __set() method
var_dump($a->foo)        // this will call the magic __get() method

これが問題の解決に役立つことを願っています。

于 2012-07-13T12:43:03.840 に答える
3

連想配列の場合のようにオブジェクトに任意のメンバーを割り当てたい場合は、おそらく PHP のマジックプロパティ オーバーロードを調べる必要があります。

以下は、変数の割り当てと取得のみを可能にするクラスの例です (ほとんどは PHP のドキュメントから引用されています)。

<?php
class PropertyTest
{
    /**  Location for overloaded data.  */
    private $data = array();

    public function __set($key, $value) {
        $this->data[$key] = $value;
    }

    public function __get($key) {
        return $this->data[$key];
    }
}
// sample use:
$a = new PropertyTest();
$a->foo = "bar";

echo $a->foo; // will print "bar"
?>
于 2012-07-13T12:44:56.397 に答える
2

空のクラスオブジェクトを作成し、後でプロパティを追加できます。例:

<?php
$myObject = new StdClass();
$myObject->id = 1;
$myObject->name = "Franky";
$myObject->url = "http://www.google.com";
var_dump($myObject);

...これは生成する必要があります

object(stdClass)#1 (3) { ["id"]=> int(1) ["name"]=> string(6) "Franky" ["url"]=> string(21) "http://www.google.com" }

個人的には、配列ではなくオブジェクトクラスを使用することを好みます。

于 2012-07-13T12:43:30.487 に答える