Heim  >  Artikel  >  Backend-Entwicklung  >  Was ist ArrayAccess in PHP? Einführung in ArrayAccess in PHP (Codebeispiel)

Was ist ArrayAccess in PHP? Einführung in ArrayAccess in PHP (Codebeispiel)

不言
不言nach vorne
2018-11-23 15:45:093085Durchsuche

Der Inhalt dieses Artikels befasst sich mit der Frage, was ArrayAccess in PHP ist. Die Einführung (Codebeispiel) von ArrayAccess in PHP hat einen gewissen Referenzwert. Freunde in Not können darauf verweisen.

php bietet 6 häufig verwendete vordefinierte Schnittstellen zur Implementierung bestimmter spezifischer Funktionen. Das am häufigsten verwendete ist ArrayAccess, das von beliebten Frameworks wie Laravel verwendet wird.

Was ist ArrayAccess?

Wie in der offiziellen Dokumentation angegeben, stellt es „eine Schnittstelle bereit, die den Zugriff auf Objekte wie Arrays ermöglicht.“

Es stellt 4 Schnittstellen bereit

/**
 * Interface to provide accessing objects as arrays.
 * @link http://php.net/manual/en/class.arrayaccess.php
 */
interface ArrayAccess {

    /**
     * Whether a offset exists
     * @link http://php.net/manual/en/arrayaccess.offsetexists.php
     * @param mixed $offset <p>
     * An offset to check for.
     * </p>
     * @return boolean true on success or false on failure.
     * </p>
     * <p>
     * The return value will be casted to boolean if non-boolean was returned.
     * @since 5.0.0
     */
    public function offsetExists($offset);

    /**
     * Offset to retrieve
     * @link http://php.net/manual/en/arrayaccess.offsetget.php
     * @param mixed $offset <p>
     * The offset to retrieve.
     * </p>
     * @return mixed Can return all value types.
     * @since 5.0.0
     */
    public function offsetGet($offset);

    /**
     * Offset to set
     * @link http://php.net/manual/en/arrayaccess.offsetset.php
     * @param mixed $offset <p>
     * The offset to assign the value to.
     * </p>
     * @param mixed $value <p>
     * The value to set.
     * </p>
     * @return void
     * @since 5.0.0
     */
    public function offsetSet($offset, $value);

    /**
     * Offset to unset
     * @link http://php.net/manual/en/arrayaccess.offsetunset.php
     * @param mixed $offset <p>
     * The offset to unset.
     * </p>
     * @return void
     * @since 5.0.0
     */
    public function offsetUnset($offset);
}

Wir implementieren diese 4 Schnittstellen, die der Reihe nach den Isset-, Lese-, Setz- und Unset-Operationen des Arrays entsprechen. Wozu dient

Die Definition ist sehr klar und bietet die Möglichkeit, auf Objekte zuzugreifen, beispielsweise auf Arrays. Damit kann eine Klasse sowohl Objektreferenzen als auch Array-Referenzen unterstützen.

Code-Implementierungsbeispiel

class Container implements ArrayAccess
{

    /**
     * @var array 单例对象索引
     */
    private $instances = [];

    /**
     * @var array 可实例化对象定义索引
     */
    private $definitions = [];

    public function offsetExists($offset)
    {
        return isset($this->definitions[$offset]);
    }

    public function offsetGet($offset)
    {
        if (isset($this->instances[$offset])) {
            return $this->instances[$offset];
        } elseif (isset($this->definitions[$offset])) {
            return $this->make($offset);
        }

        throw new \Exception('未提供对象定义');
    }

    public function offsetSet($offset, $value)
    {
        // ... 省略一些较验判断
        $this->definitions[$offset] = $value;
    }

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

    private function make($offset)
    {
        $definition = $this->definitions[$offset];

        if ($definition instanceof \Closure) {
            return $this->instances[$offset] = $definition();
        }

        if (is_object($definition)) {
            return $this->instances[$offset] = $definition;
        }

        if (is_array($definition)) {
            $class = $definition['class'];
            $reflection = new \ReflectionClass($class);

            $dependencies = [];
            // ... 省略反射的实现代码
            $object = $reflection->newInstanceArgs($dependencies);
            return $this->instances[$offset] = $object;
        }

        throw new \Exception('对象定义不合法');
    }
}

Verwendungsbeispiel

$container = new Container();

$container['test'] = function () {
  return 'this is a test';
};

var_dump(isset($container['test']));

echo $container['test'];

unset($container['test']);

Das obige ist der detaillierte Inhalt vonWas ist ArrayAccess in PHP? Einführung in ArrayAccess in PHP (Codebeispiel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vorheriger Artikel:So verwenden Sie EditplusNächster Artikel:So verwenden Sie Editplus