0

属性にいくつかの情報を保持するクラスを作成しました。これには、このクラス属性に存在するすべての情報に新しい情報のセットを追加するadd()メソッドが含まれています。

そのオブジェクトを配列オフセットのように動作させたいのですが。たとえば、次のように呼び出します。

$obj = new Class[0];

最初の情報セットを含むオブジェクトを作成します。

そのクラスでforeach()ループも使用したいと思います。

属性の変更はクラスの外部から拒否する必要がありますが、私はそれらにアクセスできる必要があります。

それは可能ですか?

4

4 に答える 4

1

必要なのは、それが完全ArrayObjectに実装されていることですIteratorAggregate , Traversable , ArrayAccess , Serializable , Countable

echo "<pre>";
$obj = new Foo(["A","B","C"]);
foreach ( $obj as $data ) {
    echo $data, PHP_EOL;
}

echo reset($obj) . end($obj), PHP_EOL; // Use array functions on object
echo count($obj), PHP_EOL; // get total element

echo $obj[1] ; // you can get element
$obj[0] = "D"; //  Notice: Sorry array can not be modified 

出力

A
B
C
AC
3
B

使用したクラス

class Foo extends ArrayObject {
    public function offsetSet($offset, $value) {
        trigger_error("Sorry array can not be modified");
    }
}
于 2012-11-23T12:48:13.283 に答える
0

これは、異なるコンストラクター値を使用して複数のインスタンスを作成する方法です。

$objConfig = array( 
    array('id'=>1 , 'name'=>'waqar') , 
    array('id'=>2 , 'name'=>'alex')
);
$objects = array();

for($i=0; $i<count($objConfig) ; $i++)
{
    $objects[$i] = new ClassName($objConfig[$i]);
}
于 2012-11-23T12:35:08.293 に答える
0

インターフェイスを実装する必要がありArrayAccessます。例は非常に簡単です。

とにかく、設計上の目的でクラスと配列の動作を混在させることはお勧めしません。構文をより簡潔にするために、配列ごとのアクセスを使用する必要があります。

クラス、魔法のメソッド、リフレクションを最大限に活用してください。連想配列を超えて、明るく幸せな世界がそこにあります。

于 2012-11-23T12:40:41.977 に答える
0

この場合、なぜクラスインスタンスの配列だけを持っていないのですか?非常に簡単な例:

/**
 * @var MyClass[]
 */
$myClasses = array();

$myClasses[] = new myClass();

または、SplObjectStorageなどのより専門的なSPLクラスの1つを使用します:http : //php.net/manual/en/book.spl.php(私はこれを必要としませんでしたが、それはそれのように見えますあなたが必要なものかもしれません)

最後に、ArrayAccessを拡張し、クラスタイプを強制するクラスを作成するだけで、独自のクラスを作成できますか?

本当に必要なものによって異なります。ほとんどの場合、クラスを配列に格納し、モデルにビジネスロジックを適用することに依存します(配列の値が常に同じクラスになるようにするため)。これはパフォーマンスが低下する可能性がありますが、Webアプリを作成していると仮定すると、問題になる可能性はほとんどありません。

于 2012-11-23T12:48:06.047 に答える