php - __set/__get 数组属性

标签 php

想知道是否可以执行以下操作(我知道代码不会按预期工作,只是试图达到目的):

class Form
{
    private $v = array();

    function __set($varName, $varValue)
    {
        ... do some treatment on the varValue ...
        $this->v[$varName] = $varValue;
    }

    function &__get($varName)
    {
        if(!isset($this->v[$varName]))
            $this->v[$varName] = NULL;

        return $this->v[$varName];
    }
};

我希望能够像这样设置一个变量:

$form->Values['whatever'] = 'dirty';

并让它通过 setter 函数运行,该函数会调用一些清理操作并最终填充几个其他数组,如“HtmlValues”和“SqlValues”,这样我就可以提取为我想要的格式编码的值,所以我稍后可以调用

echo $form->HtmlValues['whatever'];

问题当然是正常问题,如果你只使用 _get,你最终会设置一个返回的值,即使 &_get 通过引用和类似的工作返回它, __set 从未真正被调用,即使你正在设置一个私有(private)成员。

所以基本上,我想知道是否有一种方法可以在您将值设置在一个数组中时调用一个函数(可能有多个数组深度,而不像 $form->Values['group'] ['item'] = '随便';

所需的输出类似于:

$form->Values['name'] = "&";
echo $form->HtmlValues['name']; = &

(只是为了强调,我不是在寻找实际的编码,只是在设置/更改每个变量时调用它的能力,而无需手动编码整个数组)

最佳答案

您想实现 ArrayAccess界面。链接页面有关于如何执行此操作的示例。

编辑:为了便于访问,我在下面包含了来自 php.net 的示例:

<?php
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;
    }
}

$obj = new obj;

var_dump(isset($obj["two"]));
var_dump($obj["two"]);
unset($obj["two"]);
var_dump(isset($obj["two"]));
$obj["two"] = "A value";
var_dump($obj["two"]);
$obj[] = 'Append 1';
$obj[] = 'Append 2';
$obj[] = 'Append 3';
print_r($obj);
?>

关于php - __set/__get 数组属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5939677/

相关文章:

php - 在 Laravel 中查询集合

php - MySQL 行数与 PHP 并显示结果

c# - 如何将 xml 从 c# 桌面应用程序发送到 php 服务器脚本并解析它?

php - PayPal IPN 在沙盒中返回无效

php - Nginx 与 PhpMyAdmin(通过 ssl 保护)

php - 比较 Silverstripe 中的两个 ManyManyLists

php - javascript : unexpected non-whitespace character after JSON data 中的 JSON 错误

php - 仅替换文件形式 preg_replace 中的特定组

php - facebook graph api 没有返回足够的新闻提要详细信息来重建您在 facebook 主页上看到的内容

php - mysql - 匹配日期时间字段的年份数组