تالار گفتمان nCIS.ir

نسخه‌ی کامل: پیمایش کردن obj ها بصورت آرایه
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
در پکیج شرح دادید برای اینکه چنین کدی را اجرا کنیم :
$myuser = new Users();
$myuser['tabesh'] = 'tabesh@tabesh.com';
$myuser['ali'] = 'ali@ali.com';
$myuser['google'] = 'google.info.com';
echo $myuser['ali'];
باید این رابط را پیاده سازی کنیم :
<?php
class Users implements ArrayAccess{
private $user;
public function __construct(){
$this->user = array();
}
public function offsetExists($key){
return isset ($this->user[$key]);
}
public function offsetGet($key){
return $this->user[$key];
}
public function offsetSet($key , $val){
$this->user[$key] = $val;
}
public function offsetUnset($key){
unset ($this->user[$key]);
}
این درست . اما بدون این رابط و بدین شکل هم کار میکند :
$myuser = new ArrayObject();
$myuser['tabesh'] = 'tabesh@tabesh.com';
$myuser['ali'] = 'ali@ali.com';
$myuser['google'] = 'google.info.com';
echo $myuser['ali'];
پس کارایی این رابط ArrayAccess چیست ؟ اینکه بود و نبودش یکی است .
این رابط اجازه میده کلاس معمولی خودتون رو که کلی فیلد و متد دیگه هم میتونه داشته باشه تبدیل به ساختار آرایه ای کنید. ArrayObject تنها خاصیتش همینه و متد خاص دیگه ای نداره که بتونید ازش استفاده کنید. ممکنه کلاس شما چندین قابلیت دیگه هم داشته باشه و بخواین قابلیت دسترسی بصورت آرایه رو هم بهش اضافه کنید. در اینصورت میتونید رابط ArrayAccess رو پیاده سازی کنید تا به نتیجه دلخواه برسین.
ببخشید ولی من متوجه نشدم
تمام متد هایی که ما توی arrayAccess پیاده سازی میکنیم توی arrayObject هست
public function offsetExists($key){
return isset ($this->user[$key]);
}
public function offsetGet($key){
return $this->user[$key];
}
public function offsetSet($key , $val){
$this->user[$key] = $val;
}
public function offsetUnset($key){
unset ($this->user[$key]);
}
اینها همه متد های ArrayAccess هست که عینا ArrayObject هم دارد
میشه با یک مثال فرقشون رو بگید ؟
در ArrayAccess متدهای abstract توسط شما پیاده سازی میشن
اما در ArrayObject  که متدهای abstract رو پیاده سازی کرده
درصورت extend شدن باید توسط شما دوباره بازنویسی بشن.

پس

ArrayAccess دسترسی به آبجکت بصورت آرایه
ArrayObject کار با آرایه بصورت شی گرا


interface ArrayAccess {
/* Methods */
abstract public boolean offsetExists ( mixed $offset )
abstract public mixed offsetGet ( mixed $offset )
abstract public void offsetSet ( mixed $offset , mixed $value )
abstract public void offsetUnset ( mixed $offset )
}

ArrayObject implements IteratorAggregate , ArrayAccess , Serializable , Countable {
.
.
.
}

//Array interface
$arrayfruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
ksort($arrayfruits);
foreach ($arrayfruits as $key => $val) {
    echo "$key = $valn";
}

//ArrayObject interface
$arrayfruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
$fruitArrayObject = new ArrayObject($arrayfruits);
$fruitArrayObject->ksort();
foreach ($fruitArrayObject as $key => $val) {
    echo "$key = $valn";
}

http://php.net/arrayaccess
http://php.net/arrayobject

همونطور که میبینید، ArrayAccess یه رابط هست که باید پیاده سازی کنید درحالی که ArrayObject یه کلاسه که خودش رابط ArrayAccess رو پیاده سازی کرده. پس طبیعیه که تمام متدهای تعریف شده توی ArrayAccess داخل ArrayObject موجود باشه.

اما هدف و کاربرد این دوتا فرق میکنه:

توضیح کلاس ArrayObject
نقل قول:
This class allows objects to work as arrays.

یعنی کلاس ArrayObject به شما اجازه میده یک شئ ایجاد کنید و ازش بصورت یه آرایه استفاده کنید (که در اصل آرایه نیست و توی حافظه Heap ایجاد شده) و کلی متد سودمند دیگه مثل append و کلی روش مرتب سازی مثل asort و ksort و nsort و... در اختیارتون میگذاره.

توضیح رابط ArrayAccess
نقل قول:
Interface to provide accessing objects as arrays.

درمقابل رابط ArrayAccess این متدها رو نداره ولی به شما اجازه میده به هر کلاس دیگه که خودتون نوشتین، درصورتی که این رابط رو پیاده سازی کنه، اجازه بدین که از اشیاء اون کلاس مثل آرایه استفاده بشه. مثلاً یه کلاس برای نگهداری اطلاعات دانشجویان نوشتین که متدهایی برای محاسبه میانگین نمرات و اعلام نام و نام خانوادگی و نام پدر و شماره دانشجویی و... داره و حالا میخواین با اطلاعات این دانشجو (یک شئ از کلاسی که نوشتین) مثل یه آرایه رفتار کنید. برای اینکار رابط ArrayAccess رو پیاده سازی میکنید و لازم نیست کلاستون از ArrayObject مشتق بشه که کلی متدهای دیگه هم داخل خودش داره که ممکنه توی اون مورد خاص، بدرد کار شما نخوره.
درک من از این موضوع :
arrayObject یک ابر کامپیوتر است
arrayAccess یک لپ تاپ هست
تمام کارهایی رو که با لپ تاپ میشه انجام داد با ابرکامپیوتر هم میتوان انجام داد
اما
تمام کارهایی رو که با ابرکامپیوتر میتوان انجام داد با لپ تاپ نمیتوان انجام داد

-----------------
ولی ما چون ابرکامپیوتر همه کارست همیشه سراغ اون نمیریم و طبق نیازمون وسیله مورد نظر را بکار میگیریم

پس تمام کارهای ما توسط arrayObject امکان پذیره اما ما "فقط" برای اینکه کار اضافی نکنیم بعضی جاها از arrayAccess استفاده میکنیم
ولی اگر هم خواستیم کاراضافی کنیم میتوانیم همه جاها از arrayObject استفاده کنیم .

درک من از این موضوع درست است استاد ؟
تقریباً. به این نکته دقت کنید که اگه بخواین از ArrayObject استفاده اختصاصی کنید، میتونین یه کلاس ازش مشتق کنین و امکانات موردنظرتون رو بهش اضافه کنین.