PHPで存在しない、または存在しない既知のメンバーに何かを自由に割り当てることはできますか? メンバー名と連想配列のインデックスに違いはありますか?
私は違いがあります
$a = array();
$a['foo'] = 'something';
と
$a->foo = 'something';
違いがある場合、「空の」オブジェクトを作成してメンバーを動的に追加するにはどうすればよいですか?
配列(データのバッグ/コンテナー)とオブジェクト(セマンティックな意味と機能を備えたデータのラッピング)を混合しています。
他の言語で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のマジックメソッドを使用して、説明したような動作を作成するオプションはまだあります。それにもかかわらず、これはエラーにつながり、(単体)テストではるかに困難な時間を与えるため、オブジェクトにデータを格納する通常の方法ではないと見なす必要があります。
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
これが問題の解決に役立つことを願っています。
連想配列の場合のようにオブジェクトに任意のメンバーを割り当てたい場合は、おそらく 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"
?>
空のクラスオブジェクトを作成し、後でプロパティを追加できます。例:
<?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" }
個人的には、配列ではなくオブジェクトクラスを使用することを好みます。