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

PHP Laravel using application class as an array instead of using attributes

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

例如在应用程序文件中

vendor/laravel/framework/src/illuminate/Container/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;

致命错误:无法在 C:\xampp\htdocs\test\test.php 第 10

行中将容器类型的对象用作数组

有什么解释吗?

顺便说一句,我正在使用 laravel v4.2.12

Laravel 的 Illuminate\Container\Container class 实现了 PHP 的 ArrayAccess 接口,它为 class 提供数组访问语法.要实现此接口,您必须提供 offsetExists()offsetGet()offsetSet()offsetUnset() 方法的实现。一旦您的 class 正确实现了 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 实际上是如何实现的。