忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/11/24 12:49 |
Zend Framework2.1.3 Zend\Stdlib\ArrayObject
Zend\Stdlib\ArrayObjectはデフォルトの\ArrayObjectを置き換えます。
デフォルトの\ArrayObjectには多次元配列を削除できないバグがあるからそれをどうにかするよ、って言ってるっぽいんですがよくわかりません。
使ってみましょう。
<?php
	header('Content-type: text/html; charset=UTF-8');
	require_once('path/to/channel/vendor/autoload.php');
	use Zend\Stdlib\ArrayObject;
	
	// Zend\Stdlib\ArrayObject
	$arrayobject = new ArrayObject();
	$arrayobject->append(array('a'));
	$arrayobject->append(array('b'));
	foreach($arrayobject as $key=>$val){
		// ループ内で自分自身を削除できる
		unset($arrayobject[$key]);
	}
	
	// \ArrayObject
	$default = new \ArrayObject();
	$default->append(array('a'));
	$default->append(array('b'));
	foreach($default as $key=>$val){
		// ここでArray was modified outside object and internal position is no longer valid
		unset($default[$key]);
	}

Zend\Stdlib\ArrayObjectは、配列のようにループ内で自分を削除することができます。
\ArrayObjectも実は削除はできているのですが、でもそこでNoticeが発生しています。
これが修正したというバグなのでしょうか?

なお、Zend\Stdlib\ArrayObjectはPHPで実装されているだけあってデフォルトの\ArrayObjectよりは動作が遅めです。
まあ10万件のappendが0.04秒から0.08秒になる程度なのでそこまで影響はないでしょう。
それ以上増やすと速度より先にメモリ不足で落ちます。


と、ここまで書いたところで気がついたのですが、最初から開発経緯を見とけよって話です。
<?php
	// Zend\Stdlib\ArrayObject
	$arrayobject = new Zend\Stdlib\ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS | ArrayObject::STD_PROP_LIST);
	$arrayobject['foo'] = array('bar'=>'baz');
	unset($arrayobject['foo']['bar']);
	var_dump($arrayobject['foo']);  // array(0) { }  // 消えている
	
	// \ArrayObject
	$default = new \ArrayObject(array(), \ArrayObject::ARRAY_AS_PROPS | \ArrayObject::STD_PROP_LIST);
	$default['foo'] = array('bar'=>'baz');
	unset($default['foo']['bar']);  // Notice: Indirect modification of overloaded element of ArrayObject has no effectが発生
	var_dump($default['foo']);  // array(1) { ["bar"]=> string(3) "baz" } // 消えてない

\ArrayObjectは、配列を突っ込んだときは配列内の値を消せないよ、という話だったようです。



PR


2013/04/01 23:52 | Comments(0) | PHP

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<Zend Framework2.1.4 Zend\Stdlib\ArrayObject | HOME | 買ったものリスト 2013/03/31>>
忍者ブログ[PR]