ناشناس
سوال 2391
نمونه ای از پیاده سازی دیزاین پترن Iterator در زبان PHP وجود دارد؟
ثبت پاسخ جدید
برای ثبت پاسخ، لطفا وارد حساب کاربری خود شوید.
پاسخها
1 پاسخالگوی Iterator کمک میکند تا مجموعهای از دادهها را راحتتر مدیریت کنید. رابط Iterator دارای 5 متد میباشد، rewind ایندکس آرایه را به اولین خانه برمیگرداند، current عنصر جاری را برمیگرداند، key کلید (اندیس) عنصر جاری را برمیگرداند، next اشارهگر (اندیس) را یک واحد به جلو میبرد، valid میگوید که آیا عنصری (اندیسی) که اشارهگر به آن اشاره دارد، وجود داره یا نه. مثلا میتوانیم پستهای یک مطلب را به کلاسی بدهیم که از این رابط ارثبری کرده است و این کلاس پستها را پردازش میکند، به صورت زیر:
Class Post implements Iterator
{
private $posts = array();
public function __construct($posts)
{
if(in_array($posts))
{
$this->posts = $posts;
}
}
public function rewind()
{
reset($this->posts);
}
public function current()
{
return current($this->posts);
}
public function key()
{
return key($this->posts);
}
public function next()
{
return next($this->posts);
}
public function valid () {
return($this->current() !== false);
}
}
حالا فرض کنید کلاس مشابهی برای کامنتها داریم، و این کلاسها متدهای دیگری نیز دارند، نحوه استفاده از این کدها به صورت زیر است:
$blogposts = GetAllPosts();
$posts = new Posts($posts);
foreach($posts as $post)
{
echo $psot->GetTitle();
echo $psot->GetAuthor();
echo $psot->GetContet();
$comments = new Comments($post->GetComments);
foreach($comments as $comment)
{
echo $comment->GetAuthor();
echo $comment->GetContent();
}
}
اگر بخواهیم از foreach بتوانیم استفاده کنیم، باید رابط Iterator را پیادهسازی کرده باشیم. البته در آرایههای php این رابط به صورت پیشفرض پیادهسازی شده است اما میتوانیم ساختارش را تغییر بدهیم.
Class Post implements Iterator
{
private $posts = array();
public function __construct($posts)
{
if(in_array($posts))
{
$this->posts = $posts;
}
}
public function rewind()
{
reset($this->posts);
}
public function current()
{
return current($this->posts);
}
public function key()
{
return key($this->posts);
}
public function next()
{
return next($this->posts);
}
public function valid () {
return($this->current() !== false);
}
}
حالا فرض کنید کلاس مشابهی برای کامنتها داریم، و این کلاسها متدهای دیگری نیز دارند، نحوه استفاده از این کدها به صورت زیر است:
$blogposts = GetAllPosts();
$posts = new Posts($posts);
foreach($posts as $post)
{
echo $psot->GetTitle();
echo $psot->GetAuthor();
echo $psot->GetContet();
$comments = new Comments($post->GetComments);
foreach($comments as $comment)
{
echo $comment->GetAuthor();
echo $comment->GetContent();
}
}
اگر بخواهیم از foreach بتوانیم استفاده کنیم، باید رابط Iterator را پیادهسازی کرده باشیم. البته در آرایههای php این رابط به صورت پیشفرض پیادهسازی شده است اما میتوانیم ساختارش را تغییر بدهیم.