想知道是否可以执行以下操作(我知道代码不会按预期工作,只是试图达到目的):
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/