هنگام مطالعهی کدهای لاراول متوجه شدم که بعضی از کلاسها، اینترفیسی به نام Countable را پیادهسازی کردهاند. با نیمنگاهی در مستندات فهمیدم که جریان از چه قرار است و خواستم شما را هم در جریان قرار دهم.
کلاس Countable از اینترفیسهای خود زبان PHP است. اگر با شیءگرایی در PHP آشنا باشید، میدانید که اینترفیسها، قراردادهایی هستند که کلاسهایی به پیادهسازیشان میپردازند و باید عیناً متدهای داده شده را اجرا کنند. واژهی Countable یعنی قابلشمارش و همین پرسشی را در ذهن ما میاندازد: چه چیزی را میشماریم؟
یک آرایه با چند عنصر میسازیم:
$users = ['Ali', 'Reza', 'Muhammad', 'Farhad', 'Saeid']; echo count($users);
خروجی عدد 5 است. از آنجا که آرایه 5 عنصر دارد، فانکشن count تعداد عناصر آرایه را برایمان برگردانده است.
حال به مثال زیر دقت کنید:
class Library { public $books = []; public function addBook($book) { $this->books[] = $book; } } $lib = new Library(); $lib->addBook('Grokking Algorithms'); $lib->addBook('Keep the Aspidistra Flying'); $lib->addBook('The Lord Of The Rings'); echo count($lib);
نتیجهی چنین کدی، هشدار زیر است:
count(): Parameter must be an array or an object that implements Countable
پارامترِ فانکشنِ count میبایست یک آرایه یا آبجکتی باشد که Countable را پیادهسازی کرده باشد!
بینگو، این همان گمشدهی ماست! باید در کلاس Library تغییری اعمال کنیم تا به نتیجهی دلخواه خود (دریافت تعداد کتابهای اضافهشده با فانکشن count) برسیم:
class Library implements Countable { public $books = []; public function addBook($book) { $this->books[] = $book; } public function count() { return count($this->books); } }
وقتی آبجکتی که در اصل، کلاس Countable را پیادهسازی کرده باشد را به عنوان پارامتر به فانکشن count بدهیم، متد count از کلاس یادشده اجرا میشود.