PHP Laravel使用应用程序类作为数组而不是使用属性

时间:2015-01-01 19:45:27

标签: php laravel

好吧,我想知道他们如何将应用程序类用作数组

例如在应用程序文件

供应商/ laravel /框架/ SRC /照亮/容器/ Application.php

在魔术方法__set和__get中,他们使用$ this作为数组

这是代码

/**
 * Dynamically access container services.
 *
 * @param  string  $key
 * @return mixed
 */
public function __get($key)
{
    return $this[$key];
}

/**
 * Dynamically set container services.
 *
 * @param  string  $key
 * @param  mixed   $value
 * @return void
 */
public function __set($key, $value)
{
    $this[$key] = $value;
}
但是,如果没有任何错误,我不明白这是如何工作的

我尝试了类似的东西,但它给了我以下错误

这是我的代码

class Container{

    public function __get($key){
       return $this[$key];
    }

    public function __set($key,$val){
       $this[$key] = $val;
    }

}

$app = new Container();

$app->test = 'ok';

echo $app->test;

致命错误:无法在第10行的C:\ xampp \ htdocs \ test \ test.php中使用Container类型的对象

对此有何解释?

顺便说一句,我使用的是laravel v4.2.12

1 个答案:

答案 0 :(得分:3)

Laravel的Illuminate\Container\Container类实现了PHP的ArrayAccess接口,它为类提供了数组访问语法。要实现此界面,您必须为offsetExists()offsetGet()offsetSet()offsetUnset()方法提供实施。一旦您的类正确实现了ArrayAccess接口,您就可以使用数组访问语法。

这只是ArrayAccess实现的一个示例,但您可以尝试这样的事情:

// note the implementation
class Container implements ArrayAccess {

    protected $data = array();

    public function offsetExists($offset) {
        return array_key_exists($offset, $this->data);
    }

    public function offsetGet($offset) {
        return $this->data[$offset];
    }

    public function offsetSet($offset, $value) {
        $this->data[$offset] = $value;
    }

    public function offsetUnset($offset) {
        unset($this->data[$offset]);
    }

    public function __get($key) {
        return $this[$key];
    }

    public function __set($key, $val) {
        $this[$key] = $val;
    }
}

$app = new Container();

$app->test = 'ok';

echo $app->test.PHP_EOL.PHP_EOL.print_r($app, true);

您还可以查看Illuminate\Container\Container实现,了解Laravel实际上是如何实现的。