PHP文档不是很明确,只说明:
SplObjectStorage :: offsetExists 检查存储中是否存在对象.(PHP> = 5.3.0)
SplObjectStorage :: contains 检查存储是否包含提供的对象.(PHP> = 5.1.0)
这对我来说几乎是一回事.
问题:除了offsetExists仅在5.3.0中可用之外,2之间有什么区别?
我进行的小测试......
$s = new SplObjectStorage();
$o1 = new StdClass();
$o2 = new StdClass();
$o3 = "I'm not an object!";
$s->attach($o1);
var_dump($s->contains($o1));
var_dump($s->offsetExists($o1));
echo '<br>';
var_dump($s->contains($o2));
var_dump($s->offsetExists($o2));
echo '<br>';
var_dump($s->contains($o3));
var_dump($s->offsetExists($o3));
Run Code Online (Sandbox Code Playgroud)
输出:
boolean true
boolean true
boolean false
boolean false
Warning: SplObjectStorage::contains() expects parameter 1 to be object, string given in index.php on line 15
null
Warning: SplObjectStorage::offsetExists() expects parameter 1 to be …Run Code Online (Sandbox Code Playgroud) 在以下代码中:
$storage = new \SplObjectStorage();
$fooA = new \StdClass();
$fooB = new \StdClass();
$storage[$fooA] = 1;
$storage[$fooB] = array();
$storage[$fooA] = 2;
$storage[$fooB][] = 'test';
Run Code Online (Sandbox Code Playgroud)
我希望$storage[$fooA]是1,它是.我也希望$storage[$fooB]如此array('test'),但事实并非如此.这也会触发一条通知,内容为"间接修改SplObjectStorage的重载元素对...没有影响"
我认为这是因为ArrayAccessin 的实现SplObjectStorage不通过引用返回值.
有没有办法SplObjectStorage用作数据映射,其中键是对象,值是可变数组?做这种工作还有其他可行的选择吗?
所以我有这门课:
class JSObjectStorage extends \SplObjectStorage
{
/**Adds a JavaScript object inside the storage, and optionally associate it to some data.*/
public function attach($javaScript, $data = null){}
/**Removes the object from the storage.*/
public function detach($javaScript){}
/**Adds all objects-data pairs from a different JavaScriptBundle storage in the current storage.*/
public function addAll(\SplObjectStorage $storage){}
/**Removes objects contained in another storage from the current storage.*/
public function removeAll(\SplObjectStorage $storage){}
/**Removes all objects except for those contained in another storage from the current storage.*/ …Run Code Online (Sandbox Code Playgroud) 为什么会UnexpectedValueException被抛入session_start()?
我有具有属性的对象SPLObjectstorage.该对象被分配给会话
$_SESSION['foo'] = $barObject;
Run Code Online (Sandbox Code Playgroud)
我怀疑内部会话序列化面临问题解码它.我将会话存储在数据库中,看起来它正在序列化objectStorage但无法对其进行解码.
会话数据示例
self|O:4:"User":8:{s:5:"?*?id";N;s:7:"?*?nick";N;s:13:"?*?reputation";i:1;s:11:"?*?password";N;s:8:"?*?email";N;s:7:"?*?crud";O:10:"CRUDobject":2:{s:13:"?*?fieldCache";a:0:{}s:13:"?*?dependency";r:1;}s:7:"?*?auth";N;s:11:"?*?roleList";C:11:"RoleStorage":23:{x:i:1;N;,r:13;;m:a:0:{}}}
Run Code Online (Sandbox Code Playgroud)
RolestorageSPLObjectstorage
session_decode()在上面的字符串的延伸也返回false任何想法?
删除roleList属性使其正确序列化.
如果我单独做
$sr = serialize($roles); // $roles is RoleStorage object
var_dump($sr);
var_dump(unserialize($sr));
Run Code Online (Sandbox Code Playgroud)
它string 'C:11:"RoleStorage":22:{x:i:1;N;,r:3;;m:a:0:{}}' (length=46)在反序列化时打印然后失败并显示相同的消息.我不知道为什么会这样.
注意:在将对象附加到RoleStorageI时,将对象本身用作数据.表示它存储为参考.我不知道(if)如何在serialize()内部处理这个问题.
问候stackoverflow的人们,最近几天,我一直在研究websockets和一个名为Ratchet的PHP库(这是用PHP编写websockets服务器应用程序的理想选择)。他们在Ratchet官方文档中建议使用SplObjectStorage(我从未听说过)来管理客户端连接对象。
在大多数服务器应用程序中,您可能需要保留有关每个客户端的一些数据(例如,在我尝试编写一个简单的消息传递服务器的情况下,我需要保留诸如客户端的昵称之类的数据,也许还有其他内容),因此据我所知它可以在打开新连接时(如下所示)将客户端对象和包含客户端数据的数组添加到SplObjectStorage。
public function onOpen(ConnectionInterface $conn) {
//$this->clients is the SplObjectStorage object
$this->clients[$conn] = array('id' => $conn->resourceId, 'nickname' => '');
}
Run Code Online (Sandbox Code Playgroud)
但是,我不确定通过数据数组中的值(例如通过用户昵称)从SplObjectStorage中获取对象的最佳方法是什么,一种方法是这样的:
//$this->clients is my SplObjectStorage object where I keep all incoming connections
foreach($this->clients as $client){
$data = $this->clients->offsetGet($client);
if($data['nickname'] == $NickNameIAmLookingFor){
//Return the $client object or do something nice
}
}
Run Code Online (Sandbox Code Playgroud)
但是我认为这样做有更好的方法,因此任何建议都将不胜感激。
提前致谢。