Php没有属性需要?

时间:2012-11-15 23:02:17

标签: php arrays attributes

通常使用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 ???中没有必要在类中有属性

1 个答案:

答案 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]

访问了一个属性