PHP ArrayAccess Predefined Interface

আমরা হয়ত অনেকেই জানিনা PHP তে প্রি-ডিফাইন কিছু ইন্টারফেইস আর ক্লাস আছে। তারমধ্যে ArrayAccess একটি।
মূলত ArrayAccess এর কাজ হল কোন একটা ক্লাসকে ইনস্টানশিয়েট কিংবা অবজেক্ট তৈরি করা হলে সেটি যেন একটা সাধারণ অ্যারে এর মত আচরণ করে।
অর্থাৎ অ্যারেতে ইনডেক্স সহ কিংবা ইনডেক্স ছাড়া ভ্যালু সেট করা, সেটাকে অ্যাকসেস করা, আবার ভ্যালু আছে কিনা সেটা দেখা ও আনসেট/রিমুভ করা ইত্যাদি।

কোন ক্লাসে ArrayAccess ইন্টারফেইসটি ইমপ্লিমেন্ট করতে হলে যথাক্রমে offsetSet, offsetGet, offsetExistsoffsetUnset মেথড গুলো ডিফাইন করতে হবে।

offsetSet এর কাজ হল ভ্যালু সেট করা।
offsetGet এর কাজ হল ভ্যালু গেট করা।
offsetExists এর কাজ হল অ্যারেতে কোন ইনডেক্স/অফসেট আছে কিনা সেটা দেখা।
আর offsetUnset এর কাজ হল ভ্যালু রিমুভ করা।

নিচে একটি উদাহরণ দেয়া হলঃ

<?php

class Person implements ArrayAccess
{
    private $data = [];

    public function __construct()
    {
        $this->data = [
            'first_name' => 'Sohel',
            'last_name' => 'Amin',
        ];
    }

    public function offsetSet($offset, $value)
    {
        if (is_null($offset)) {
            $this->data[] = $value;
        } else {
            $this->data[$offset] = $value;
        }
    }

    public function offsetGet($offset)
    {
        return isset($this->data[$offset]) ? $this->data[$offset] : null;
    }

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

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

$person = new Person;

// Accessing existing value
var_dump($person['first_name']);

// Accessing undefined value
var_dump($person['email']);
// Defining value with an offset
$person['email'] = 'sohelamincse@gmail.com';
// Accessing just defined value
var_dump($person['email']);
// Determining if an offset exist
var_dump(isset($person['last_name']));

// Unsetting an offset with value
unset($person['last_name']);
// Accessing just unset value
var_dump($person['last_name']);

// Defining value without any offset
$person[] = 'Other...';
// Accessing just unset value
var_dump($person[0]);

আবার একই ক্লাসটিকে যদি অবজেক্ট এর মত করে ব্যাবহার করতে চান তাহলে একই নিয়মে __set, __get, __isset, __unset ম্যাজিক মেথড গুলো ডিফাইন করতে হবে।

নিচে উভয় পদ্ধতির সমন্বয় করে একটা উদাহরণ দেয়া হলঃ

<?php

class Person implements ArrayAccess
{
    private $data = [];

    public function __construct()
    {
        $this->data = [
            'first_name' => 'Sohel',
            'last_name' => 'Amin',
        ];
    }

    public function offsetSet($offset, $value)
    {
        if (is_null($offset)) {
            $this->data[] = $value;
        } else {
            $this->data[$offset] = $value;
        }
    }

    public function offsetGet($offset)
    {
        return isset($this->data[$offset]) ? $this->data[$offset] : null;
    }

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

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

    public function __set($offset, $value)
    {
        $this->data[$offset] = $value;
    }

    public function __get($offset)
    {
        return isset($this->data[$offset]) ? $this->data[$offset] : null;
    }

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

    public function __unset($offset)
    {
        unset($this->data[$offset]);
    }
}

$person = new Person;

// Accessing value as array's index
var_dump($person['first_name']);
// Accessing value as object's property
var_dump($person->first_name);

// Defining value as object's property
$person->email = 'sohelamincse@gmail.com';
// Accessing value as array's index
var_dump($person['email']);
Posted in: php