1

ArrayAccessインターフェイスの背後にある考え方を理解しようとしています。

それぞれのメソッドが何であるかわかりません。これらのメソッド(関数)が「組み込み」関数であり、ArrayAccessインターフェイス(「組み込み」)が「確実」である場合は、これらの「組み込み」メソッド(関数)を実装します。 )。

私は、各関数が「舞台裏」のコードで何をしているのかを理解しようとしています。

function offsetSet($offset, $value);
function offsetGet($offset);
function offsetUnset($offset);
function offsetExists($offset);

ArrayAccessが実装するシールを含む組み込みインターフェースであることを理解している場合、それらを実装するときは、組み込み関数への参照のみを実装します。誰かがこれを正しく行うのを手伝ってくれると嬉しいです。

4

2 に答える 2

6

そのインターフェイスを実装すると、オブジェクトは配列のように機能します。たとえば、if$fooは、以下を実装するクラスのインスタンスですArrayAccess

$foo['bar'] = 42を呼び出しますoffsetSet('bar', 42)

echo $foo['bar']を呼び出しますoffsetGet('bar')

unset($foo['bar'])を呼び出しますoffsetUnset('bar')

isset($foo['bar'])を呼び出しますoffsetExists('bar')

関数offset*を自分で明示的に呼び出すことは決してありません。オブジェクトに配列としてアクセスすると、暗黙的に発生します。

于 2012-07-04T17:58:51.360 に答える
0

(それを実装していない内部クラス)と比較ArrayAccessしている間、私も興味がありました。SimpleXMLElementインターフェースはすでにマニュアルに十分に文書化されているので、オフセットタイプとの特定の違いを強調したいと思いました。

しかし、まず第一に、ArrayAccessアクセスされたときに出力を与えることを実装するクラスの定型的な実装例:

/**
 * ArrayAccess Example
 */
class ExampleArrayLikeAccess implements ArrayAccess
{

    /**
     * Whether a offset exists
     *
     * @link http://php.net/manual/en/arrayaccess.offsetexists.php
     * @param mixed $offset - An offset to check for.
     * @return boolean true on success or false on failure.
     *
     * The return value will be casted to boolean if non-boolean was returned.
     */
    public function offsetExists($offset) {
        echo "  - offsetExists(", $this->varString($offset),")\n";
    }

    /**
     * Offset to retrieve
     *
     * @link http://php.net/manual/en/arrayaccess.offsetget.php
     * @param mixed $offset The offset to retrieve.
     * @return mixed Can return all value types.
     */
    public function offsetGet($offset) {
        echo "  - offsetGet(", $this->varString($offset),")\n";
    }

    /**
     * Offset to set
     *
     * @link http://php.net/manual/en/arrayaccess.offsetset.php
     * @param mixed $offset The offset to assign the value to.
     * @param mixed $value The value to set.
     * @return void
     */
    public function offsetSet($offset, $value) {
        echo "  - offsetSet(", $this->varString($offset), ", ", $this->varString($value), ")\n";
    }

    /**
     * Offset to unset
     * @link http://php.net/manual/en/arrayaccess.offsetunset.php
     * @param mixed $offset  The offset to unset.
     * @return void
     */
    public function offsetUnset($offset) {
        echo "  - offsetUnset(", $this->varString($offset),")\n";
    }

    /**
     * helper to give a variable dump in form of a string
     */
    private function varString($var) {
        ob_start();
        var_dump($var);
        return trim(strtr(ob_get_clean(), ["\n" => '', "\r" => '']), ' {}');
    }

}

いくつかの使用例を実行します-それを使った例。コメントの形でメモを残しました。それはかなり自明であるはずです:

$like = new ExampleArrayLikeAccess();


/* offsetExists */

// indexes/keys that behave similar to PHP arrays:

isset($like[1]);    # integer stay integer
# offsetExists(int(1))

isset($like['1']);  # string like an integer - converted to integer
# offsetExists(int(1))

isset($like['01']); # string unlike an integer - stays string
# offsetExists(string(2) "01")

isset($like[TRUE]); # booleans are converted to integer
# offsetExists(bool(true))

// indexes/keys that differ to PHP arrays:

isset($like[1.1]);     # a float stays a float (double)
# offsetExists(double(1.1))

isset($like[NULL]);    # NULL stays NULL
# offsetExists(NULL)

isset($like[array()]); # array stays array
# offsetExists(array(0))

isset($like[$like]);   # object stays object
# offsetExists(class SxeLikeAccess#2 (0))


/* offsetGet */

// indexes/keys behave the same as with offsetExists:
$like[1];    # offsetGet(int(1))
$like['1'];  # offsetGet(int(1))
$like['01']; # offsetGet(string(2) "01")
// ...


/* offsetSet */

$like[1] = 'value';    # index/key behaves the same as with offsetExists
# offsetSet(int(1), string(5) "value")

$like[] = 'value';     # index/key is NULL
# offsetSet(NULL, string(5) "value")

$like[NULL] = 'value'; # index/key is NULL
# offsetSet(NULL, string(5) "value")


/* offsetUnset */
unset($like[1]);       # index/key behaves the same as with offsetExists
unset($like[NULL]);    # same for NULL

標準のPHP配列との主な違いは、オフセットとして整数と文字列だけでなく使用できることです。

于 2012-11-05T13:42:06.660 に答える