通常使用java。我今天看到了这样的片段
$oStrategie = new Strategie();
foreach($aData as $key=>$value) {
$oStrategie[$key] = $value;
}
$oStrategie->doSomething()
策略是一个自制的php类,没什么特别的。简单的构造函数什么都不重要等等。
在类策略中,方法doSomething()访问$ aData的ArrayValues
$this['array_index_1']
为什么我可以在那里访问数组,即使Strategie类doesent有任何属性已定义且没有setter被覆盖或类似的东西?任何人都可以解释我在那里发生的事情吗?在php ???中没有必要在类中有属性
答案 0 :(得分:3)
您的类实现了ArrayAccess
接口。这意味着它实现了以下方法:
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 )
}
这允许您在此类的实例上使用数组访问$var[$offset]
。这是类这样的类的标准实现,使用$container
数组来保存属性:
class Strategie implements ArrayAccess {
private $container = array();
public function __construct() {
$this->container = array(
"something" => 1,
);
}
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;
}
}
不看Strategie
的实际实现或它派生的类,很难说它实际上在做什么。
但是使用它,您可以控制类的行为,例如,在访问不存在的偏移时。假设我们将offsetGet($offset)
替换为:
public function offsetGet($offset) {
if (isset($this->container[$offset])) {
return $this->container[$offset];
} else {
Logger.log('Tried to access: ' + $offset);
return $this->default;
}
}
现在每当我们尝试访问不存在的偏移时,它将返回默认值(例如:$this->default
)并记录错误,例如。
请注意,您可以使用魔术方法__set()
,__get()
,__isset()
和__unset()
来完成类似的行为。我刚才列出的法术方法与ArrayAccess
之间的区别在于您通过$obj->property
而不是$obj[offset]