是否有像in_array
这样的功能,但可以在对象上使用?
答案 0 :(得分:25)
不,但您可以将对象强制转换为数组并将其传递给in_array()
。
$obj = new stdClass;
$obj->one = 1;
var_dump(in_array(1, (array) $obj)); // bool(true)
但这违反了各种OOP原则。请参阅我对您的问题的评论和Aron's answer。
答案 1 :(得分:14)
默认情况下,PHP对象不能像数组一样进行迭代。实现对象迭代的一种方法是实现Iterator接口。
关于您的具体问题,您可能需要查看ArrayAccess interface:
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
答案 2 :(得分:7)
您可以将对象强制转换为数组:
$obj = new stdClass();
$obj->var = 'foobar';
in_array( 'foobar', (array)$obj ); // true
答案 3 :(得分:5)
function in_object($needle, $haystack) {
return in_array($needle, get_object_vars($haystack));
}
答案 4 :(得分:3)
我不推荐它,因为这是非常糟糕的做法,但你可以使用get_object_vars。
根据范围获取给定对象的可访问非静态属性。
您还应该参考文档以了解其是否适合您。
if(in_array('find me', get_object_vars($obj)))
答案 5 :(得分:3)
令人难以置信所有人都错过了in_object PHP方法的实用性!这是我提出的,它非常有用,你会明白为什么!
这是我编写的一个简单函数,它将检查是否可以在对象中找到值。
<?php
// in_object method
// to check if a value in an object exists.
function in_object($value,$object) {
if (is_object($object)) {
foreach($object as $key => $item) {
if ($value==$item) return $key;
}
}
return false;
}
?>
如果动态创建了一个对象(特别是来自您无法控制的外部代码,如应用程序插件,CMS等),这非常有用。知道对象的属性。 上面的函数将返回属性,因此您稍后可以在代码中使用它。
这是一个非常好的基本示例,说明了这个函数的用途!
<?php
class My_Class {
function __construct($key, $value) {
$this->$key = $value;
// As you can see, this is a dynamic class, its properties and values can be unknown...
}
}
function in_object($value,$object) {
if (is_object($object)) {
foreach($object as $key => $item) {
if ($value==$item) return $key;
}
}
return false;
}
function manipulate_property($value,$object) {
if ($property = in_object($value,$object)) {
// value found. I can now use this property.
// I can simply echo'it (makes no sense, as I could instead simply echo "value")
echo "<br />I found the property holding this value: ".$object->$property;
// or (here comes the good part)
// change the property
$object->$property = "This is a changed value!";
echo "<br />I changed the value to: ".$object->$property;
// or return it for use in my program flow
return $property;
} else {
echo "Value NOT FOUND!<br />";
return false;
}
}
// imagine if some function creates the class conditionally...
if ( 1 == 1) {
$class = new My_Class("property","Unchanged Value");
} else {
$class = new My_Class("property","Some Other Value");
}
// now let's check if the value we want exists, and if yes, let's have some fun with it...
$property = manipulate_property("Unchanged Value",$class);
if ($property) {
$my_variable = $class->$property;
echo "<br />This is my variable now:".$my_variable;
} else $my_variable = $some_other_variable;
?>
只需运行它就可以自己看看!
答案 6 :(得分:0)
这是最有效和最正确的解决方案。通过一些修改,它可以应用于检查任何对象中存在的任何数据类型。
if(gettype($object->var1->var2) == "string"){
echo "Present";
}