in_array - “in_object”等价物?

2022-08-30 15:57:45

有没有这样的函数,如,但可以在对象上使用?in_array


答案 1

否,但您可以将对象强制转换为数组并将其传递到 .in_array()

$obj = new stdClass;
$obj->one = 1;
var_dump(in_array(1, (array) $obj)); // bool(true)

不过,这违反了各种OOP原则。请参阅我对您的问题和Aron答案的评论。


答案 2

首先,数组对象完全不同的

默认情况下,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

推荐