13

PHP 文档不是很明确,只声明:

SplObjectStorage::offsetExists 检查存储中是否存在对象。(PHP >= 5.3.0)

SplObjectStorage::contains 检查存储是否包含提供的对象。(PHP >= 5.1.0)

这对我来说几乎是一样的。

问题:除了 offsetExists 仅在 5.3.0 中可用之外,两者之间有什么区别?


我进行的小测试...

$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));

输出:

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 object, string given in index.php on line 16
null
4

1 回答 1

14

它们完全相同。

offsetExists被定义为方法别名contains并被包含在内只是为了符合ArrayAccess接口。

您可以在源代码中看到SPL_MA正在使用(方法别名),并且还设置了几个其他别名。

  • offsetExists = 包含
  • offsetSet = 附加
  • offsetUnset = 分离
于 2012-08-16T08:23:11.617 回答