1


0

配列のようにstdClassを使用できますか?

stdClassオブジェクトを一般的なインデックス付き配列のように動作させることは可能ですか?

i.e. $ array = Array([0] ⇒ 120 [1] ⇒ 382 [2] ⇒ 552 [3] ⇒ 595 [4] ⇒ 616)

のように構築されます

$a = array();
$array[] = 120;
$array[] = 382;

etc.

しかし、オブジェクトでそれを行うと、それ自体が上書きされます:

$obj = new stdClass;
$obj->a = 120;
$obj->a = 382;

毎回「a」を変更できることは知っていますが、

これは愚かな質問ですが、何らかの理由で私を困惑させている場合は申し訳ありません!

ヘルプを感謝します:)

Dan

6 Answer


5


要するに、あなたは常にプロパティに名前を付ける必要があるからです。 ArrayAccessを使用して単純なクラスを作成するという問題を経験することは、パフォーマンスと透過性の極端な犠牲を除いて、基本的に何も表示しない配列を再作成したため、意味がありません。

配列を使用するだけでは問題を無限に解決できない理由はありますか、それとも単なる願い事ですか?

編集:https://stackoverflow.com/questions/1869812/casing-an-array-with-numeric-keys-as-an-object [この質問]で詳細を確認してください。


3


いいえ、できません。 そのような角括弧( [])を使用すると、PHPでは「ArrayAccess」と呼ばれ、 `stdClass`オブジェクトには実装されません。

次のようなものが欲しいかもしれません

$foo = new stdClass();
$foo->items = array();
$foo->items[] = 'abc';
$foo->items[] = '123';
$foo->items[] = 'you and me';

配列をstdClassとしてキャストして、何が起こるかを確認することもできます。

$foo = array();
$foo[] = 'abc';
$foo[] = '123';
$foo[] = 'you and me';
$foo = (object) $foo;
var_dump($foo);


1


あなたが何をするつもりなのか本当に分かりません

a = array();
$obj->a[] = 120;
$obj->a[] = 382;
// ...
?>

フィールドをオブジェクトに単純に「プッシュ」することはできません。 とにかく値を取得するには、フィールドの名前を知る必要があるので、ほとんど意味がありません。


1


オブジェクトは配列ではありません。 数値インデックス付きの要素が必要な場合は、配列を使用します。

名前付き要素が必要な場合は、オブジェクトまたは連想配列を使用します。

異なる動作が発生する理由については、配列ではインデックスを指定していないため、PHPは配列の長さをインデックスとして使用します。 オブジェクトでは、名前(この場合は「a」)を指定する必要があります。

あなたがしたいかもしれない他のことは、配列であるメンバーを持つオブジェクトを持っています:

$obj = new stdClass;
$obj->arr = array();
$obj->arr[] = 'foo';
$obj->arr[] = 'bar';

また、オブジェクトに配列をキャストできることを忘れないでください:

$obj = (object) array(
    'arr' => array(
        'foo',
        'bar'
    )
);


0


OOPのためだけに、クラスを使用しないでください。 この機能を本当に実装したい場合は、このクラスを使用してください。

class ArrayClass
{
    protected $storage = array();

    public function push($content) {
        $this->storage[] = $content;
        return $this;
    }

    public function get($index) {
        if (isset($this->storage[$index])) {
            return $this->storage[$index];
        } else {
            //throw an error or
            return false;
        }
    }
}


0


JavaScriptでこれを正確に取得できます。