PHP, SPL, интерфейс ArrayAccess

Я пытаюсь понять идею интерфейса ArrayAccess,

Я не понимаю, о чем каждый метод. Если эти методы (функции) являются «встроенными» функциями, а интерфейс ArrayAccess (также «встроенный») - это только «убедитесь», что я собираюсь реализовать эти «встроенные» методы (функции )

Я пытаюсь понять, что делает каждая из этих функций с нашим кодом «За кулисами».

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

Если я понимаю, что ArrayAccess — это встроенный интерфейс, который содержит уплотнения для реализации, когда мы их реализуем, мы реализуем только ссылки на встроенные функции, я буду рад, если кто-нибудь поможет мне сделать это правильно.


person Aviel Fedida    schedule 04.07.2012    source источник
comment
Этот класс хорошо задокументирован здесь php.net/manual/en/class.arrayaccess.php< /а>   -  person Ziumin    schedule 04.07.2012


Ответы (2)


Если вы реализуете этот интерфейс, то объект действует как массив. например, если $foo является экземпляром класса, который реализует ArrayAccess:

$foo['bar'] = 42 звонит offsetSet('bar', 42).

echo $foo['bar'] звонит offsetGet('bar').

unset($foo['bar']) звонит offsetUnset('bar').

isset($foo['bar']) звонит offsetExists('bar').

Вы никогда не вызываете функции offset* самостоятельно. Это происходит неявно, когда вы обращаетесь к объекту как к массиву.

person Matthew    schedule 04.07.2012
comment
Большое спасибо, Мэтью, я буду очень рад, если вы подтвердите мое понимание этого предмета. Интерфейс массива — это встроенный интерфейс, этот интерфейс содержит сигнатуры этих функций, эти функции являются ссылками на встроенные функции, которые автоматически реагируют, когда мы получить доступ к объекту как к массиву, и большое спасибо за ваш ответ, я пробовал руководство и не понял этот интерфейс, если вы можете просто подтвердить, хорошего дня, Мэтью. - person Aviel Fedida; 04.07.2012
comment
Интерфейс встроен с этими четырьмя сигнатурами функций, но PHP-программист должен фактически реализовать их. Поведение автоматического вызова функций смещения* при доступе к ним как к массиву также является встроенным... то, что вы не можете сделать со своими собственными интерфейсами. (Есть несколько встроенных интерфейсов, реализация которых аналогичным образом влияет на основные функции PHP.) - person Matthew; 04.07.2012
comment
Спасибо, Мэтью, если я правильно понял, это только сигнатуры функций и параметров, а также поведение автоматического вызова смещения *, но скажите мне, пожалуйста, это поведение говорит только о том, что вы обращаетесь как к вызову массива. говоря, это поведение относится только к имени функции? что означает, что я отвечаю за то, чтобы функции работали так, как я хочу, и еще раз спасибо. - person Aviel Fedida; 05.07.2012
comment
Программист должен написать функции offset*, чтобы сделать что-то полезное. например, обычно offsetSet($key, $val) что-то вроде $this->data[$key] = $val. PHP позаботится обо всем остальном. Напишите тестовый код, и вы увидите, что он работает. - person Matthew; 05.07.2012
comment
Мэтью Большое вам спасибо, я действительно пытался понять это до сих пор, я не понял руководство, и я искал ответ, подобный вашему, хорошего дня, и еще раз спасибо. - person Aviel Fedida; 05.07.2012

При сравнении 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 заключаются в том, что в качестве смещения можно использовать не только целые числа и строки.

person hakre    schedule 05.11.2012