آشنایی با مفهوم Interface در متودولوژی OOP


در آموزش آشنایی با مفهوم OOP و بررسی اصول چهارگانهٔ شیئ‌گرایی گفتیم که یکی از اصول کلیدی این متودولوژی Polymorphism است بدان معنا که یک کلاس می‌تواند به اَشکال مختلفی نمودِ عینی پیدا کند و برای برخورداری از این قابلیت،‌ نیاز است تا با مفاهیمی همچون Interface و Abstract Class آشنا شویم که مورد اول را در این آموزش و مورد دوم را در آموزش بعد مورد بررسی قرار خواهیم داد. در واقع، در پاسخ به این پرسش که «اینترفیس چیست؟» می‌توان گفت که اینترفیس همچون یک سندی است که مشخص می‌کند کلاس‌هایی که از آن استفاده می‌کنند می‌باید حاوی چه متدهایی باشند مضاف بر این که اینترفیس‌ها این امکان را در اختیار توسعه‌دهندگان می‌گذارند تا این اطمینان حاصل گردد که برخی کلاس‌های پروژه از ساختاری واحد تبعیت می‌کنند.

به منظور درک بهتر مفهوم اینترفیس، داخل پوشهٔ oop پروژه‌ای تحت عنوان interface می‌سازیم و داخل پوشهٔ classes فایلی با نامی دلخواه همچون SampleInterface.php ساخته و کدهای زیر را داخل آن می‌نویسیم:

<?php
namespace SokanAcademy;

interface SampleInterface
{
    public function showFirstName();
    public function showLastName();
    public function showFullName();
}

همان‌طور که می‌بینیم، پیش از هر چیز نِیم‌اِسپیس این فایل را مشخص ساخته‌ایم سپس به منظور ساخت یک اینترفیس در زبان برنامه‌نویسی پی‌اچ‌پی از کیورد interface استفاده کرده سپس نامی دلخواه همچون SampleInterface برایش در نظر می‌گیریم که می‌باید این نام با نام فایل مذکور یکسان باشد. داخل بدنهٔ این اینترفیس که ساختاری همچون یک کلاس دارا است، سه متد تعریف کرده‌ایم با این توضیح که متدهای مذکور فقط و فقط دارای یک شناسه هستند و از هیچ بدنه‌ای که بتوان داخل آن کدی را نوشت برخوردار نمی‌باشند که در ظاهر ممکن است کمی عجیب به نظر برسد!

در ادامه، داخل پوشهٔ classes فایلی به نام User.php ساخته و کدهای زیر را داخل آن می‌نویسیم و خواهیم دید که چگونه می‌توان از اینترفیس فوق در آن استفاده نمود:

<?php
namespace SokanAcademy;

class User implements SampleInterface
{

}

همان‌طور که می‌بینیم، چنانچه بخواهیم کلاسی را موظف به تبعیت از یک اینترفیس نماییم، می‌باید پس از نام انتخابی برای کلاس خود از کلیدواژهٔ implements استفاده نموده سپس نام اینترفیس مد نظر را بیارویم. در واقع، از این لحظه به بعد کلاس User را موظف ساخته‌ایم تا از ساختار تعریف‌شده داخل اینترفیس SampleInterface پیروی کند. جهت تست این کلاس، وارد فایل index.php شده و آبجکتی از روی این کلاس داخل این فایل می‌سازیم:

<?php
ini_set('display_errors', '1');
require_once 'vendor/autoload.php';

$user = new SokanAcademy\User();

در صورت اجرای فایل فوق شاهد خروجی زیر خواهیم بود:

/var/www/oop/7-interface$ php index.php 
PHP Fatal error:  Class SokanAcademy\User contains 3 abstract methods and must therefore be declared abstract or implement the remaining methods (SokanAcademy\SampleInterfa
ce::showFirstName, SokanAcademy\SampleInterface::showLastName, SokanAcademy\SampleInterface::showFullName) in /var/www/oop/interface/classes/User.php on line 4

متن این ارور حاکی از آن است که اینترفیسِ SampleInterface حاوی سه متد است که هر سه می‌باید داخل کلاس User که از این اینترفیس ایمپلیمنت می‌کند تعریف شوند اما این کار صورت نگرفته است که برای رفع این ارور، کلاس User را به صورت زیر تکمیل می‌کنیم:

<?php
namespace SokanAcademy;

class User implements SampleInterface
{
    public function showFirstName()
    {
        return "This method is to show the firstname.";
    }
    public function showLastName()
    {
        return "This method is to show the lastname.";
    }
    public function showFullName()
    {
        return "This method is to show the fullname.";
    }
}

اکنون اگر فایل index.php را مجدد اجرا کنیم، خواهیم دید که ارور مرتفع شده است. در واقع،‌ کاری که داخل کلاس User انجام داده‌ایم آن است که این کلاس را موظف به تبعیت از ساختار اینترفیس SampleInterface کرده‌ایم و از آنجا که این اینترفیس می‌گوید سه متد ()showFirstName و ()showLastName و همچنین متد ()showFullName را می‌باید داخل کلاسی که از این اینترفیس ایمپلیمنت می‌شود داشته باشیم، داخل کلاس User این متدها را نوشته سپس داخل بدنهٔ آن‌ها نیز دستور ساده‌ای را درج نموده‌ایم.

در حقیقت، اگر کلاس دیگری مثلاً تحت عنوان User2 داشته باشیم و آن هم از اینترفیس SampleInterface ایمپلیمنت کند،‌ این تضمین ایجاد می‌گردد که هر دو کلاس User و User2 از ساختاری یکسان برخوردار خواهند بود اما در عین حال هر کدام می‌توانند پیاده‌سازی مخصوص به خود را داشته باشند که این کار به نوعی مرتبط با ویژگی Polymorphism است.

همچنین لازم به یادآوری است که استفاده از اینترفیس‌ها در پروژه‌هایی که به صورت تیمی توسعه پیدا می‌کنند راه‌گشا خواهد بود چرا که اگر گروهی روی کلاس User کار کنند و گروهی دیگر روی کلاس User2، این تضمین داده می‌شود که هر دو گروه از دولوپرها ساختاری یکسان را دنبال می‌کنند و این کار به هر چه استانداردتر شدن پروژه کمک می‌کند.

آنچه در ارتباط با کلاس و اینترفیس وجود دارد این است که یک کلاس نمی‌تواند از بیش از یک کلاس ارث‌بری کند اما در عین حال یک کلاس می‌تواند از بیش از یک اینترفیس ایمپلیمنت کند. برای درک بهتر این موضوع، فایل دیگری داخل پوشهٔ classes تحت عنوان UserInterface.php ساخته و کدهای زیر را داخل آن می‌نویسیم:

<?php
namespace SokanAcademy;

interface UserInterface
{
    public function showUsername();
}

طبق آنچه پیش از این آموختیم، اینترفیسی تحت عنوان UserInterface ساخته که صرفاً حاوی متد ()showUsername است. حال طبق روال زیر، داخل کلاس User از این اینترفیس نیز استفاده خواهیم کرد:

<?php
namespace SokanAcademy;

class User implements SampleInterface, UserInterface
{
    public function showFirstName()
    {
        return "This method is to show the firstname.";
    }
    public function showLastName()
    {
        return "This method is to show the lastname.";
    }
    public function showFullName()
    {
        return "This method is to show the fullname.";
    }
}

در واقع، پس از نام اینترفیس SampleInterface یک علامت , قرار داده سپس نام اینترفیس UserInterface را نوشته‌ایم و به همین ترتیب به هر تعداد که بخواهیم می‌توانیم از اینترفیس‌های مختلف استفاده کنیم. حال اگر فایل index.php را اجرا کنیم خواهیم داشت:

/var/www/oop/interface$ php index.php 
PHP Fatal error:  Class SokanAcademy\User contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (SokanAcademy\UserInterface:
:showUsername) in /var/www/oop/interface/classes/User.php on line 4

می‌بینیم که همچون مورد قبل، مفسر پی‌اچ‌پی از ما ایراد می‌گیرد که از اینترفیسی تحت عنوان UserInterface داخل کلاس User استفاده کرده اما متد ()showUsername را داخل این کلاس تعریف نکرده‌ایم که برای رفع این ارور، کلاس User را به صورت زیر تکمیل می‌کنیم:

<?php
namespace SokanAcademy;

class User implements SampleInterface, UserInterface
{
    public function showFirstName()
    {
        return "This method is to show the firstname.";
    }
    public function showLastName()
    {
        return "This method is to show the lastname.";
    }
    public function showFullName()
    {
        return "This method is to show the fullname.";
    }
    public function showUsername()
    {
        return "This method is to show the username.";
    }
}

که در این صورت اگر فایل index.php را مجدد اجرا کنیم، هیچ گونه اروری دریافت نخواهیم کرد.

این بخش از محتوا مخصوص کاربرانی است که ثبت‌نام کرده‌اند.
جهت مشاهدهٔ این بخش از محتوا لاگین نمایید.

جمع‌بندی
در مبحث شیئ‌گرایی، یکی از مباحث پرکاربرد چیزی است تحت عنوان اینترفیس و در این آموزش دیدیم که در زبان پی‌اچ‌پی چگونه می‌توانیم اقدام به ساخت یک اینترفیس سپس استفاده از آن داخل کلاس‌های مختلف نمود. همچنین به بررسی این موضوع پرداختیم که به چه شکل می‌توان اینترفیس‌های به اصطلاح Built-in داخل هستهٔ زبان پی‌اچ‌پی را مورد استفاده قرار داد.

دانلود فایل‌های تمرین

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان