• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP对象转换为数组array(object) 数组值读取

php 搞代码 4年前 (2022-01-25) 20次浏览 已收录 0个评论
文章目录[隐藏]

PHP对象转换为数组array(object) 数组值读取

<code>$objecta class objecta {    protected $temp; }$arr = (array)$objecta;</code>

$arr 怎样读取 temp值?
$arr[‘temp’],$arr[‘*temp’] 都读取不到
官方说明:

如果一个 object 类型转换为 array,则结果为一个数组,其单元为该对象的属性。键名将为成员变量名,不过有几点例外:整数属性不可访问;私有变量前会加上类名作前缀;保护变量前会加上一个 ‘*’ 做前缀。这些前缀的前后都各有一个 NULL 字符。这会导致一些不可预知的行为:

<code><?phpclass A {    private $A; // This will become '\0A\0A'}class B extends A {    private $A; // This will become '\0B\0A'    public $AA; // This will become 'AA'}var_dump((array) new B());?></code>

回复内容:

PHP对象转换为数组array(object) 数组值读取

<code>$objecta class objecta {    protected $temp; }$arr = (array)$objecta;</code>

$arr 怎样读取 temp值?
$arr[‘temp’],$arr[‘*temp’] 都读取不到
官方说明:

如果一个 object 类型转换为 array,则结果为一个数组,其单元为该对象的属性。键名将为成员变量名,不过有几点例外:整数属性不可访问;私有变量前会加上类名作前缀;保护变量前会加上一个 ‘*’ 做前缀。这些前缀的前后都各有一个 NULL 字符。这会导致一些不可预知的行为:

<code><?phpclass A {    private $A; // This will become '\0A\0A'}class B extends A {    private $A; // This will become '\0B\0A'    public $AA; // This will become 'AA'}var_dump((array) new B());?></code>

<code class="lang-php"><?phpclass Objecta {    protected $protected_v<strong style="color:transparent">¥本文来源gaodai#ma#com搞@@代~&码网^</strong><small>搞gaodaima代码</small>al = 'default_protected';    public $public_val = 'default_public';    private $private_val = 'default_private';    public function __construct($params)    {        $this->public_val = $params['public'];    }}$object2array = function ($object) {    $ref = new ReflectionClass($object);    $props = $ref->getProperties();    $arr = [];    foreach ($props as $prop) {        $prop->setAccessible(true);        $arr[$prop->getName()] = $prop->getValue($object);        $prop->setAccessible(false);    }    return $arr;};$result = $object2array(new Objecta([    'public' => 'public_val',]));var_dump($result);</code>

我觉得你应该实现ArrayAccess接口

我觉得还是类型的原因。protectprivate的属性本来就不能从外部获取到吧,我试了一下只有public的属性能获取到。

感觉还是用 ArrayAccess 吧, 最简单的数组形式访问对象,直接在你的类上实现该接口。反射之类的用在这有点怪怪的呢、

<code class="lang-php">class Obj implements \ArrayAccess{}</code>

\ArrayAccess 接口的结构,你的类必须要实现这些方法。

<code class="lang-php"> ArrayAccess {/* 方法 */abstract public boolean offsetExists ( mixed $offset )abstract public mixed offsetGet ( mixed $offset )abstract public void offsetSet ( mixed $offset , mixed $value )abstract public void offsetUnset ( mixed $offset )}</code>

小示例、

<code class="lang-php">class Obj implements \ArrayAccess{    protected $_data = 'data aaa';    /**     * 检查数组键是否存在,本例中对象成员就是数组元素、     * 对一个实现了 ArrayAccess 接口的对象使用 isset() 或 empty() 时,此方法将执行。     * ~~~     * $obj = new Obj();     * var_dump(isset($obj['_data']));     * ~~~     * @param mixed $offset 要检查的键名     * @return boolean     */    public function offsetExists($offset) {        return array_key_exists($offset, get_object_vars($this));    }    /**     * 检查数组键是否存在,在本例中我们把键设置为     * 对一个实现了 ArrayAccess 接口的对象使用 isset() 或 empty() 时,此方法将执行。     * ~~~     * $obj = new Obj();     * unset($obj['_data']);     * var_dump(isset($obj['_data']));     * ~~~     * @param mixed $offset 要检查的键名     * @return boolean     */    public function offsetUnset($key) {        if (array_key_exists($key,get_object_vars($this)) ) {            unset($this->{$key});        }    }    /**     * 累了不写了这个是设置数组成员,本例中就是对象属性、     */    public function offsetSet($offset, $value) {        $this->{$offset} = $value;    }    public function offsetGet($var) {        return $this->$var;    }}$obj = new Obj();echo $obj['_data'];</code>

不好意思,回答时激情满满,写几行就枯燥了、后俩没注释你自己翻资料去吧、

<code class="lang-php"><?phpclass objecta implements arrayaccess {    public $temp = 1;     public function offsetSet($offset, $value) {        var_dump(__METHOD__);    }    public function offsetExists($var) {        var_dump(__METHOD__);        if ($var == "foobar") {            return true;        }        return false;    }    public function offsetUnset($var) {        var_dump(__METHOD__);    }    public function offsetGet($var) {        var_dump(__METHOD__);        return "value";    }}$obj = new objecta();echo $obj['temp'];</code>

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP对象转换为数组array(object) 数组值读取

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址