in_array - “in_object”等价物?
有没有这样的函数,如,但可以在对象上使用?in_array
否,但您可以将对象强制转换为数组并将其传递到 .in_array()
$obj = new stdClass;
$obj->one = 1;
var_dump(in_array(1, (array) $obj)); // bool(true)
不过,这违反了各种OOP原则。请参阅我对您的问题和Aron答案的评论。
默认情况下,PHP 对象不能像数组一样进行迭代。实现对象迭代的一种方法是实现迭代器接口。
关于您的具体问题,您可能想看一下ArrayAccess界面:
class obj implements ArrayAccess {
private $container = array();
public function __construct() {
$this->container = array(
"one" => 1,
"two" => 2,
"three" => 3,
);
}
public function offsetSet($offset, $value) {
if (is_null($offset)) {
$this->container[] = $value;
} else {
$this->container[$offset] = $value;
}
}
public function offsetExists($offset) {
return isset($this->container[$offset]);
}
public function offsetUnset($offset) {
unset($this->container[$offset]);
}
public function offsetGet($offset) {
return isset($this->container[$offset]) ? $this->container[$offset] : null;
}
}
现在,您可以按以下方式像数组一样访问对象:
$object = new obj();
var_dump(isset($obj['two'])); // exists!
var_dump(isset($obj['foo'])); // does not exist
不过,在你疯狂之前,请考虑一下为什么你真的试图这样做,并看看 php.net 的例子。
选项 2:当您只是尝试查看属性是否存在时,可以使用 property_exists() 执行以下操作:
class foo {
public $bar = 'baz';
}
$object = new foo();
var_dump(property_exists($object, 'bar')); // true