برنامه نویسی شی گرا در پی اچ پی برای مبتدیان

برنامه نویسی شی گرا در پی اچ پی برای مبتدیان
آفلاین
user-avatar
عرفان حشمتی
16 آبان 1399, خواندن در 7 دقیقه

برای بسیاری از برنامه نویسان جدید، مبتدیان یا حتی کسانی که خود را توسعه دهنده می‌دانند، مفهوم برنامه نویسی شی گرا می‌تواند ترسناک باشد. در این آموزش، ما سعی خواهیم کرد مفهوم OOP( شی گرا ) را توضیح دهیم تا مبتدیان در پی اچ پی بتوانند این مورد را انتخاب کرده و از آن در کد نویسی خود استفاده کنند.

برنامه نویسی رویه‌ای در PHP

قبل از اینکه در مورد برنامه نویسی شی گرا توضیح دهیم، بگذارید کمی در مورد برنامه نویسی رویه‌ای صحبت کنیم. برای کسانی که قبلا هرگز این موضوع را نشنیده‌اند، رویه مانند یک مفهوم برنامه نویسی است مانند اولین باری که با پی اچ پی کد زدید. مثلا:

<?php
$declare_variable1 = 'my variable value in string';
$declare_variable2 = 123 //integer
$declare_variable3 = true //boolean
//declaring function
function myPHP(){
   echo 'Rasyue Blog';
}
//calling your function
myPHP();
//you can also pass argument to your function
function nextPHP($input){
  echo $input;
}
nextPHP('Rasyue Blog Here too');
?>

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

<?php
/* a chunks of code to connect to database that you group into a function 
and name the function accordingly
*/
function connect_db(){
    global $sql_host, $sql_username, $sql_password, $sql_database;
    $conn=new mysqli($sql_host,$sql_username,$sql_password);
if(mysqli_connect_error($conn) !== null) {
        return false;
    }
$conn -> select_db($sql_database);
    return $conn;
}
?>

حال بیایید سعی کنیم همان تابع را برای رسیدن به همان هدف اما به سبک OOP (شی گرا) بنویسیم.

برنامه نویسی شی گرا (OOP)

وقتی در مورد OOP صحبت می‌کنیم، هرگز نمی‌توانیم از اصطلاحات زیر استفاده کنیم:

  • Class
  • Object
  • Method
  • Properties
  • Constructor

سعی می‌کنم اصطلاحات بالا را به ساده‌ترین شکل ممکن توضیح دهم تا بتوانید آن را درک کنید. بیایید با کلاس شروع کنیم.

Class - کلاس مانند طرح اولیه یا الگویی است که برای رسیدن به یک هدف ایجاد می‌کنید. در این طرح یا الگو می‌توانید متد‌ها یا خصوصیاتی را تعریف کنید که برای دستیابی به تابع مورد نظر خود نیاز دارید.

Object - یک شی اساسا نمونه‌ای از یک کلاس است. در واقع مانند این است که یک متغیر با مقدار رشته یا شاید یک عدد صحیح یا یک مقدار بولین اعلان شود. تعریف یک شی به این معنی است که شما تمام خصوصیات یا متدهای کلاس را خواهید داشت.

Methods - متدها در اصل توابع هستند. مانند نحوه نوشتن یک تابع در برنامه نویسی رویه‌ای، در کلاس همچنین می‌توانید توابع را بنویسید برای دستیابی به چیزی از جمله اتصال به یک پایگاه داده، واکشی داده‌ها از یک پایگاه داده یا نوشتن یک تابع برای مصرف REST API. همه چیز به خود شما بستگی دارد.

Properties - ویژگی‌ها کم و بیش شبیه attributes هستند. به عنوان مثال، هنگامی که در حال نوشتن یک کلاس هستید، ممکن است بخواهید که آن کلاس مقداری را داشته باشد، به عنوان مثال می‌خواهید یک کلاس دارای یک آدرس URL پایه باشد یا شاید می‌خواهید یک کلاس دارای ویژگی باشد از قد، وزن، طول یا عرض.

Constructor - آرام باشید و نفس عمیقی بکشید. سازنده را فقط به عنوان تابعی در نظر بگیرید که هر زمان یک شی از آن کلاس ایجاد می‌کنید، به طور خودکار اجرا می‌شود. چیز ساده‌ای است.

Access Modifiers - این چیزی است که به شما امکان می‌دهد دسترسی به خصوصیات یا متدها را در کلاس تنظیم کنید. سه دسترسی اصلاح کننده وجود دارد که می‌توانید از آن‌ها به صورت عمومی، خصوصی یا محافظت شده استفاده کنید. ما در این مورد بیشتر در مثال زیر صحبت خواهیم کرد.

در مورد شی گرایی در PHP بیشتر بدانید

بیایید سعی کنیم یک کلاس بنویسیم و سپس یک شی ایجاد کنیم که نمونه‌ای از کلاس است که ما ایجاد کرده‌ایم.

<?php
//declare our class here
class Rasyue{
  
}
/* and that's it! 
   this is how we define a class however the class Rasyue does not have
   any methods, properties or even a constructor, lets declare another Class below
*/
class RasyueOne {
// lets declare properties here
// this is like declaring a variable but in a Class, we call this properties because we are giving attributes to the Class
public $property_one;
// this is a property that holds the string value
public $property_two = 'Property Number Two';
}
/* Let's create an instance of the Class or as we call it, Object and try
 to access the $property_two value
*/
$rasyue = new RasyueOne();
/* this is how we create an instance of a Class, $rasyue is now an object
   and with that $rasyue now holds all the properties or methods of the Class RasyueOne(), let's try to access the properties of RasyueOne
*/
echo $rasyue->property_two
/*
if we do this, it will return an error. if you are wondering why, it is because, although we have to access to the properties of the Class, we need a method to be able to access it
Let's remove all of this and continue below.
*/
?>

به یاد داشته باشید که موارد بالا را حذف کنید و با کد پی اچ پی زیر شروع کنید.

class RasyueOne{
//declare properties here
public $property_one;
public $property_two = 'Property Number Two';
/* now in order for our object to echo out or access this properties, we need a method, let's define a method
*/
function getProperty(){
   return $this->property_two;
 }
}
/* 
Now let's create an Object of this Class and call the method
*/
$rasyue = new RasyueOne();
echo $rasyue->getProperty();

اکنون، اگر موارد بالا را کپی و پیست کنید، باید مقدار property_two$ را برگرداند. حالا بیایید کمی در مورد کلاسی که تعریف کردیم صحبت کنیم. ابتدا نام کلاس را RasyueOne می‌گذاریم. سپس دو ویژگی را اعلام می‌کنیم، ویژگی اول خالی است در حالی که ویژگی دوم دارای مقدار رشته است. هر دوی این خصوصیات دارای یک اصلاح کننده دسترسی هستند که قبل از متغیر آن‌ها قرار می‌گیرد که در این حالت عمومی است. سپس هنگام تعیین کلاس‌ها، اصلاح کننده دسترسی ضروری است، اصلاح کننده دسترسی عمومی (public) به پی اچ پی می‌گوید که این خصوصیات از هرجایی می‌توانند قابل دسترسی باشند، به همین دلیل عمومی است. دو مورد دیگر خصوصی و محافظت شده‌اند.

قسمت بعدی این است که ما متدی را تعریف می‌کنیم، اگر دوست دارید آن را تابع بخوانید. این اساسا یک تابع است اما چون ما آن را در کلاس تعریف می‌کنیم، از آن به عنوان متد یاد خواهیم کرد. متد ()getProperty مقدار property_two$  را برمی‌گرداند. هیچ چیز پیچیده‌ای در مورد متد وجود ندارد.

قسمت آخر این است که ما یک متغیر $rasyue = new RasyueOne() را اعلام می‌کنیم. بدین ترتیب که ما یک شی ایجاد می‌کنیم، ابتدا متغیری را می‌نویسیم که به دنبال آن کلید جدید و نام کلاس قرار می‌گیرد، در این حالت نام کلاس RasyueOne() است. اکنون متغیر rasyue$  یک شی است و با آن rasyue$ قادر به دسترسی به تمام خصوصیات یا متدهای کلاس خواهد بود.

یک لحظه صبر کنید. در $this->property_two ممکن است در مورد $this سوال کنید. خب، از $this نترسید. در حال حاضر علامت $ را فقط مانند یک متغیر خاص که برای دسترسی به متدها و خصوصیات کلاس استفاده می‌شود، در نظر بگیرید.

Constructor در کلاس چه کار می‌کند؟

حالا بیایید کمی در مورد constructor صحبت کنیم. constructor چیست؟ constructor یک تابع خاص است که ما آن را در یک کلاس با نام ()construction__ اعلان می‌کنیم. constructor چه ویژگی خاصی دارد؟

یک constructor تابعی است که همیشه در هر بار ایجاد نمونه‌ای از یک کلاس، به طور خودکار فراخوانی می‌شود. بیایید برای کمک به درک بهتر constructor چند خط کد بنویسیم. برای سهولت کار، کد زیر را در یک فایل php جدید کپی و جایگذاری کنید.

<?php
class Rasyue{
public $name;
public $age;
public $weight;
function __construct($name, $age, $weight){
     $this->name = $name;
     $this->age= $name;
     $this->weight= $name;
  }
  function returnProperty(){
     $text=  'My name is '.$this->name.'. My age is '.$this->age.'. My weight is '.$this->weight;
     return $text;
  }
}
$rasyue = new Rasyue('Rasyue', '100', '1080kg');
echo $rasyue->returnProperty();
?>

چرا شیئی که ما به عنوان نمونه‌ای از کلاس Rasyue تعریف می‌کنیم آرگومان را می‌پذیرد، اما اکنون 3 آرگومان ذکر نمی‌شود. در مورد قسمت $this->name یا $this->age چطور؟ آیا $this->name با $name متفاوت است؟

چیز جدیدی که ما در کلاس Rasyue تعریف کردیم یک constructor است. در برنامه نویسی رویه‌ای، وقتی یک تابع را تعریف می‌کنیم، می‌توانیم تابع را برای پذیرش آرگومان‌ها بنویسیم و به نوبه خود از آن آرگومان‌ها / ورودی‌ها به عنوان بخشی از کد در تابع استفاده کنیم. بنابراین چگونه اجازه می‌دهیم کلاس‌ها نیز آرگومان را بپذیرند؟

ساده است، ما فقط باید $rasyue = new Rasyue(‘args1’,’args2’) را اینگونه تعریف کنیم. با این حال انجام این کار هدر می‌رود زیرا ما قادر به پذیرش یا کنترل ورودی‌ها نیستیم و کلاس هیچ متدی برای کنترل آن ندارد. به همین دلیل ما constructor را تعریف می‌کنیم، البته هدف constructor محدود به این نیست، اما این بهترین مثال برای نشان دادن هدف شما از تعریف سازنده است.

سازنده‌ای(constructor) که ما در Rasyue تعریف می‌کنیم به نوبه خود 3 ویژگی کلاس را به مقدار 3 ورودی که در هنگام ایجاد کلاس وارد می‌کنیم، تنظیم می‌کند. نگاهی به کد زیر بیندازید.

class Rasyue{
/* these are the 3 properties that we declare which belongs 
   to this class Rasyue
   but wait, let's take a look at the __construct method, it accepts 3 arguments which have the same name as the properties, so how do we make sure that we don't get this mixed up ? Simple, by using $this followed by the name of the methods or properties, we can access the properties or methods that belong to the Class. Also this is the only way for us to access properties, using $this->name or $this->age.
Note that we omit the $ or the dollar sign from the properties.
If you want to call the methods inside a class you may also do it like so $this->methodname
Let's continue in the __construct()
*/
public $name;
public $age;
public $weight;
function __construct($name, $age, $weight){
/*
now, there are 3 inputs called $name, $age, $weight, of course you can set the variables name anything you like, but I did it this way to show you the difference between properties and variables.
*/
     // with this we set the property name to the input $name
     $this->name = $name;
     $this->age= $name;
     $this->weight= $name;
  }
  function returnProperty(){
     $text=  'My name is '.$this->name.'. My age is '.$this->age.'. My weight is '.$this->weight;
     return $text;
  }
}

به عنوان یک تمرین، سعی کنید یک کلاس بنویسید که بتواند یک تماس API برقرار کند. امیدوارم این مقاله برایتان مفید بوده باشد. اگر سوالی دارید، در بخش زیر مطرح کنید، خوشحال می‌شویم به آن پاسخ دهیم.

منبع

چه امتیازی به این مقاله می دید؟
خیلی بد
بد
متوسط
خوب
عالی

دیدگاه‌ها و پرسش‌ها

برای ارسال دیدگاه لازم است، ابتدا وارد سایت شوید.

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

آفلاین
user-avatar
عرفان حشمتی @heshmati74
مهندس معماری سیستم های کامپیوتری، طراح و توسعه دهنده وب سایت
دنبال کردن

گفتگو‌ برنامه نویسان

بخشی برای حل مشکلات برنامه‌نویسی و مباحث پیرامون آن وارد شو