首页 > 解决方案 > Laravel 如何像数组一样使用 app 对象?

问题描述

我正在用 PHP 建立一个应用程序,试图遵循 Laravel 中规定的一些约定,我可以看到有很多参考$this->app["some_var"];

但是在我的应用程序中,它会抛出一个错误,说“不能将对象用作数组”。

我知道 Laravel 使用了我已经包含的魔术方法__get()__set() 但是我仍然得到相同的结果。

我在 App 对象的父类中使用的魔术 getter 和 setter 代码

  /**
  * 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;
  }

预期结果是它可以访问对象上不可访问的任何属性?

目前抛出一个Fatal error: Uncaught Error: Cannot use object Application as type of array.

标签: phplaravellaravel-5magic-methods

解决方案


您需要实现 ArrayAccess 请参见https://www.php.net/manual/en/class.arrayaccess.php 中的以下代码 以下代码将数组值存储在 $container 数组中并将 $obj['key'] 代理到此数组对象

<?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);
?>

推荐阅读