مشاوره رایگان
دریافت لینک های دانلود دریافت پستی درب منزل مبلغ کل: تومان
جهت دریافت کد تخفیف به کانال تلگرام مراجعه و یا با پشتیبان آنلاین هماهنگ نمایید

مفهوم ارث بری یا inheritance در PHP - بررسی با مثال


با استفاده از فیلم های آموزشی تولید شده توسط کلیک سایت، به راحتی می توانید مفهوم ارث بری یا inheritance در PHP - بررسی با مثال را آموزش ببینید. در ادامه دعوت می شود که فیلم دمو (بخش اول آموزش) را در زیر مشاهده نمایید.


مقدمه ارث بری (inheritance) در PHP

ایده وراثت خیلی قدرتمند است. زیرا به شما اجازه می دهد تا یک کلاس جدید ایجاد کنید و بتوانید از propertyها و متد های یک کلاس موجود، دوباره استفاده کنید.

یک کلاس که از کلاس دیگری به ارث می برد، زیر کلاس (subclass) یا  کلاس فرزند (childclass) یا کلاس مشتق شده (derived class) نامیده می شود.

کلاسی که یک کلاس فرزند دارد و خواص آن را به ارث می برد به عنوان کلاس والد یا پدر و مادر (parentclass) یا یک سوپرکلاس (superclass) یا کلاس پایه (basedclass) شناخته می شود.

علاوه بر propertyها و متد های ارث برده شده از کلاس پدر و مادر، یک زیر کلاس می تواند propertyها و متد های اضافی نیز داشته باشد.

اگر می خواهید چندین کلاس مشابه ایجاد کنید وراثت می تواند برای شما بسیار مفید باشد.

شما propertyها و متد های مشترک را در کلاس پدر و مادر و propertyها و متد های خاص را در کلاس های فرزند قرار دهید.

این به شما کمک می کند تا از تکرار کدها جلوگیری کنید.

مثالی برای ارث بری (inheritance) در PHP

در جلسات قبلی، در آموزش "اشیاء و کلاسها  در php"، ما یک کلاس حساب بانکی به نام (BankAccount) ایجاد کردیم. ما می توانیم کلاس حساب بانکی (BankAccount) را به وسیله ی ساخت کلاس های دیگری گسترش (extend) دهیم. به عنوان مثال می توانیم یک کلاس به نام کلاس حسابها (saving account class) و یک کلاس دیگر به نام چک کردن حساب بانکی(checking account class) بسازیم که از کلاس حساب بانکی (BankAccount) ارث بری کنند و به این ترتیب از property ها و متدهای کلاس حساب بانکی (BankAccount) می توانیم چند بار در کلاس های دیگر، استفاده کنیم.

نمودار وراثت UML

ما می توانیم روابط بین کلاس های BankAccount ، SavingAccount و CheckingAccount را با استفاده از نمودار کلاس UML به صورت زیر مقایسه کنیم:

ساختار فایل های class

ما معمولا کد هر کلاس را در یک فایل پی اچ پی جداگانه قرار می دهیم که دارای نامی مشابه نام کلاس است. همه فایل های کلاس معمولا در یک پوشه به نام "classes" به صورت زیر قرار می گیرند:

مثال 

برای به ارث بردن از یک کلاس، از کلمه کلیدی extended استفاده کنید. مثال زیر نشان می دهد که چگونه کلاس SavingAccount از کلاس BankAccount به ارث می برد:

<?php



class SavingAccount extends BankAccount{

 /**

 * monthly interest rate

 * @var float

 */

 private $interestRate;



 /**

 * init saving account with account no, initial amount and

 * interest rate

 * @param string $accountNo

 * @param float $initialAmount

 * @param float $interestRate

 */

 public function __construct($accountNo,$initialAmount,$interestRate){

 parent::__construct($accountNo, $initialAmount);

 $this->interestRate = $interestRate;

 }



 /**

 *  Add interest to the balance

 */

 public function addInterest(){

 $amount = parent::getBalance() * $this->interestRate / 100;

 parent::deposit($amount);

 }

}

بیایید کلاس SavingAccount را دقیق تر بررسی کنیم.

ابتدا باید کلاس SavingAccount از کلاس BankAccount ارث بری کند برای این کار از کلمه کلیدیextended  به صورت زیر استفاده می کنیم :

class SavingAccount extends BankAccount{

....

}

ما در مرحله ی دوم، در داخل سازنده (constructor) کلاس SavingAccount، سازنده کلاس BankAccount را با استفاده از سینتکس زیر فراخوانی می کنیم:

parent::__construct($accountNo, $initialAmount);

علاوه بر این، ما همچنین نرخ بهره ( interest rate)در سازنده کلاس SavingAccount را مقداردهی اولیه (initialize) می کنیم.

در مرحله ی سوم، ما یک متد به نام addInterest()  را در کلاس SavingAccount اضافه می کنیم.

 ما در این متد، متدهای کلاس والد یعنی (BankAccount) را با استفاده از سینتکس زیر فراخوانی می کنیم :

parent::getBalance()

و

parent::deposit($amount)

همانطور که می بینید، متد addInterest موجود در کلاس SavingAccount از متدهای موجود در کلاس والد یعنی BankAccount استفاده می کند.

 

بیایید کلاس جدید SavingAccount را آزمایش کنیم.

<?php

require_once('classes/bankaccount.php');

require_once('classes/savingaccount.php');



$sa = new SavingAccount('12121424', 2000, 2.5);



echo 'Bank account #' . $sa->getAccountNumber() . '<br/>';

echo 'Balance: $' . $sa->getBalance() . '<br/>';



echo 'Adding interest...' . '<br/>';

$sa->addInterest();



echo 'Balance: $' . $sa->getBalance();

ما می توانیم همین کار را برای کلاس CheckingAccount انجام دهیم.

<?php



class CheckingAccount extends BankAccount{



 /**

 * monthly fee

 * @var float

 */

 private $fee;



 /**

 * init checking account with account no, initial amount and

 * monthly fee

 * @param string $accountNo

 * @param float $initialAmount

 * @param float $fee

 */

 public function __construct($accountNo,$initialAmount,$fee){

 parent::__construct($accountNo, $initialAmount);

 $this->$fee = $fee;

 }



 /**

 *  Deduct monthly fee from balance

 */

 public function deductFee(){

 parent::withdraw($this->fee);

 }

}

بازنویسی متدها (Overriding methods)

فرض کنید دو کلاس داریم، یکی پدر و دیگر فرزند که کلاس فرزند از کلاس پدر ارث بری می کند. حال اگر بخواهیم در کلاس فرزند، متدی هم نام با متدی که در کلاس والد هست، ایجاد کنیم ، ولی این متد، دارای کدهای متفاوتی نسبت به متد موجود در کلاس والد باشد، باید آن متد (متد کلاس فرزند) را بازنویسی یا override کنیم.

در override کردن یک متد، می توانیم کدهای متد کلاس والد را در متد کلاس فرزند نیز اضافه کنیم و یا کلاً کدهای جدیدی بنویسیم.

در کلاس BankAccount ما می توانیم از متد جادویی __toString() استفاده کنیم. بطوریکه با استفاده از آن می توانیم، شیء حساب بانکی را به عنوان یک رشته با استفاده از تابع echo()  نمایش دهیم.

<?php

class BankAccount{

 /**

 * returns bank account object as a string

 */

 public function __toString(){

 return sprintf("Account #: %s <br/> Balance:$%0.2f",

 $this->accountNumber,

 $this->totalBalance);

 }

       //.. other methods and properties

}

در کلاس فرزند SavingAccount، ما می توانیم از همان متد __toString() استفاده کنیم.

متد __toString() در کلاس SavingAccount، متد __toString() را در کلاس BankAccount بازنویسی یا override می کند.

<?php



class SavingAccount extends BankAccount{

 public function __toString(){

 $str = parent::__toString();

 $str .= sprintf("<br/>Interest rate:%0.2f",$this->interestRate);

 return $str;



 }

}

توجه داشته باشید که ما می توانیم از کدهای متد __toString() در کلاس BankAccount با استفاده از فراخوانی متد __toString() در زیر کلاس (SavingAccount) استفاده کنیم :

$str = parent::__toString();

 

حالا ما متد __toString() را از شی SavingAccount فراخوانی می کنیم :

<?php

require_once('classes/bankaccount.php');

require_once('classes/savingaccount.php');

$sa = new SavingAccount('12121424', 2000, 2.5);

echo $sa;

کلاس ها و متدهای Final

کلاس Final

کلاس های Final کلاس هایی هستند که قابل توسعه (Extend) نیستند. این بدین معنا ست که دیگر کلاس ها ، نمی توانند از کلاس های Final ارث بری کنند. برای تعریف این گونه کلاس ها از کلیدواژه Final به صورت زیر استفاده می کنیم :

final class MyClass{

 //...

}

اگر کلاسی از یک کلاس Final  ارث بری کند ، PHP خطای مهلک (Fatal error) را صادر می کند.

چرا شما نیاز به کلاس هایی دارید که از ارث بری کلاس های دیگر جلوگیری می کند ؟دو دلیل اصلی وجود دارد:

امنیت (Security) :

یکی از تکنیک های رایج که هکرهای مخرب برای بهره برداری از سیستم استفاده می کنند، ایجاد یک "زیر کلاس" از یک کلاس است و کلاس مدنظر خود را با استفاده از "زیر کلاس" جایگزین می کنند.

"زیر کلاس" مشابه کلاس والد است اما به طور متفاوتی رفتار می کند که موجب آسیب به سیستم می شود.

طراحی (Design) :

یکی دیگر از دلایل ایجاد کلاس Final، طراحی شی گرا (object-oriented design) است. شما ممکن است به این نتیجه برسید که کلاس شما "کامل  یا perfect" است و نباید "زیر کلاس" داشته باشد.

متد  Final

وقتی متدی را در کلاسی از نوع Final تعریف می کنیم، کلاس های فرزند نمی توانند متدهای کلاس والد را بازنویسی یا Override کنند.

 قبل از انجام این کار، اطمینان حاصل کنید که متد شما در کلاس، به طور مداوم کد ثابتی خواهد داشت.

شما باید از کلمه کلیدی Final استفاده کنید تا یک متد Final را به صورت زیر تعریف کنید:

class MyClass{

 public final function finalMethod(){

 //...

 }

}

شما می توانید کل کدهای این آموزش را به صورت یکجا در زیر مشاهده کنید:

bankaccount.php

<?php

class BankAccount{

                        /**

                         * bank account number

                         * @var string bank account number

                         */

                        private $accountNumber;

                        /**

                         * total balance

                         * @var float total balance

                         */

                        private $totalBalance;



                        /**

                         * inits bank account with a particular account no and

                         * initial amount

                         * @param string $accountNo

                         * @param float  $initialAmount

                         */

                        public function __construct($accountNo, $initialAmount){

                                                $this->accountNumber = $accountNo;

                                                $this->totalBalance = $initialAmount;

                        }



                        /**

                         * deposit money to the bank account

                         * @param float $amount amount to deposit

                         */

                        public function deposit($amount){

                                                $this->totalBalance += $amount;

                        }



                        /**

                         * withdraw money from the bank account

                         * @param double $amount

                         */

                        public function withdraw($amount){

                                                if($amount > $this->totalBalance)

                                                                        die('Not enough money to withdraw');



                                                $this->totalBalance -= $amount;

                        }



                        /**

                         * returns total balance

                         * @return float total balance

                         */

                        public function getBalance(){

                                                return $this->totalBalance;

                        }



                        /**

                         * return bacnk account number

                         */

                        public function getAccountNumber(){

                                                return $this->accountNumber;

                        }



                        /**

                         * set bank account number

                         * @param string $accountNumber

                         */

                        public function setAccountNumber($accountNumber){

                                                $this->accountNumber = $accountNumber;



                        }

                       

                        /**

                         * returns bank account object as a string

                         */

                        public function __toString(){

                                                return sprintf("Account #: %s <br/> Balance:$%0.2f",

                                                                                                                                                $this->accountNumber,

                                                                                                                                                $this->totalBalance);

                        }

}

 

checkingaccount.php

<?php



class CheckingAccount extends BankAccount{

                       

                        /**

                         * monthly fee

                         * @var float

                         */

                        private $fee;

                       

                        /**

                         * init checking account with account no, initial amount and

                         * monthly fee

                         * @param string $accountNo

                         * @param float $initialAmount

                         * @param float $fee

                         */

                        public function __construct($accountNo,$initialAmount,$fee){

                                                parent::__construct($accountNo, $initialAmount);

                                                $this->$fee = $fee;

                        }

                       

                        /**

                         *  Deduct monthly fee from balance

                         */

                        public function deductFee(){

                                                parent::withdraw($this->fee);

                        }

                       



                        public function __toString(){

                                                $str = parent::__toString();

                                                $str .= sprintf("<br/>Montly fee:%0.2f",$this->fee);

                                                return $str;

                        }

}

 

savingaccount.php

<?php



class SavingAccount extends BankAccount{

                        /**

                         * monthly interest rate

                         * @var float

                         */

                        private $interestRate;



                        /**

                         * init saving account with account no, initial amount and

                         * interest rate

                         * @param string $accountNo

                         * @param float $initialAmount

                         * @param float $interestRate

                         */

                        public function __construct($accountNo,$initialAmount,$interestRate){

                                                parent::__construct($accountNo, $initialAmount);

                                                $this->interestRate = $interestRate;

                        }



                        /**

                         *  Add interest to the balance

                         */

                        public function addInterest(){

                                                $amount = parent::getBalance() * $this->interestRate / 100;

                                                parent::deposit($amount);

                        }

                       

                        public function __toString(){

                                                $str = parent::__toString();

                                                $str .= sprintf("<br/>Interest rate:%0.2f",$this->interestRate);

                                                return $str;

                                               

                        }

}


index.php

<?php

require_once('classes/bankaccount.php');

require_once('classes/savingaccount.php');

$sa = new SavingAccount('12121424', 2000, 2.5);

echo $sa;

در این آموزش، ما به شما نشان دادیم که چگونه از وراثت (inheritance) در php  برای ایجاد کلاس های جدید استفاده کنیم که نه تنها از کلاس های والد، ارث بری می کنند، بلکه دارای propertyها و متدهای خاص خود هستند. علاوه بر این، ما در مورد بازنویسی متدها (overriding) بحث نمودیم و همچنین در ادامه مفاهیم کلاس ها و متد های Final  را بیان کردیم تا بتوانید از آنها برای انعطافِ بیشتر در طراحی شی گرا ، استفاده نمایید.

فصلِ: 1 , تعداد قسمت ها: 7 , سطح: صفر تا صد
موضوعات: آموزش PHP

این فصل در یک نگاه:

در این مجموعه به ساخت سیستم نظردهی در php می پردازیم.…

بنا به درخواست یکی از کاربران گرامی سایت (امیر تجاره) طی چند مجموعه آموزشی قصد داریم نحوه ساخت و پیاده سازی سیستم ثبت نظرات و هم چنین نحوه ثبت پاسخ به هر نظر را مورد بررسی قرار دهیم. این مج…
فصلِ: 1 , تعداد قسمت ها: 2 , سطح: صفر تا صد
موضوعات: آموزش PHP

این فصل در یک نگاه:

در این مجموعه به آموزش ارسال ایمیل در phpmailer می پردازیم.یکی از مزایای phpmailer و ارسال ایمیل در php با استفاده از ph…

بی شک ارسال ایمیل php از مهم ترین توانایی های یک برنامه نویس php  به شمار می رود. این ایمیل می تواند برای تبلیغات و یا اطلاع رسانی و موارد بسیار زیادی به کار رود. در php روش های مختلفی برای…
فصلِ: 2 , تعداد قسمت ها: 232 , سطح: صفر تا صد

این فصل در یک نگاه:

در این فصل به معرفی پایگاه داده می پردازیم و با مفهوم دیتابیس و پایگاه های داده آشنایی پیدا می کنیم.…

آیا اصلا من میتونم یک طراح سایت و برنامه نویس بشم؟ آیا یادگیری طراحی سایت سخته ؟ آیا باید حتما زبان انگلیسی رو مسلط باشم؟ آیا حتما نیاز هست که رشته کامپیوتر باشم ؟ آیا یادگیری برنامه نویسی …
فصلِ: 2 , تعداد قسمت ها: 119 , سطح: صفر تا صد

این فصل در یک نگاه:

در این فصل با زبان سمت سرور PHP آشنا می شویم و توابع و دستورات مهم این زبان برنامه نویسی را بررسی خواهیم کرد…

  بنام خدا   با سلام خدمت تمامی دوستان عزیز کلیک سایت. بسیار خرسندیم که با یک دوره پروژه محور دیگر در خدمت شما دوستان محترم هستیم که انشالله قرار است قدم بگذاریم به دنیای بسیار جذاب و مح…
فصلِ: 2 , تعداد قسمت ها: 100 , سطح: صفر تا صد

این فصل در یک نگاه:

در این فصل می آییم یک سایت بلاگ با cms اختصاصی را پیاده سازی می کنیم که هم مروری باشه برای زبان برنامه نویسی PHP و هم شم…

توجه: این دوره دائما توسط مهندس روشنایی (مدرس دوره) بروز گردیده و مطابق با آخرین استانداردهای برنامه نویسی آپدیت می شود. توجه فرمائید دریافت آپدیت ها برای خریداران قبلی رایگان می باشد و نیاز…
فصلِ: 3 , تعداد قسمت ها: 169 , سطح: مقدماتی
موضوعات: آموزش PHP آموزش PHP

این فصل در یک نگاه:

آشنایی با دستورات html ، css و js و انجام مینی پروژه سامانه نمرات دانش آموزان مدرسه آلفا…

توضیحات کلی مجموعه: در این دوره به مفاهیم و توابع php و mysql پرداخته شده و این دوره منتج به تولید یک پروژه بزرگ نخواهد شد در پایان این دوره یک مینی پروژه مثل سامانه کارنامه دانش آموزان مدر…
فصلِ: 1 , تعداد قسمت ها: 19 , سطح: متوسط

این فصل در یک نگاه:

وب سایت فروشگاهی خود را بدون دانش برنامه نویسی و بدون پیش نیاز طراحی کنید.فروشگاه اینترنتی با افزونه ووکامرس که به شهرت …

راه اندازی فروشگاه اینترنتی در وردپرس با افزونه ووکامرس آموزش حرفه ای فروشگاه ساز وردپرس با افزونه ووکامرس           آخرین باز تولید آموزش ویدیویی ووکامرس در  1396/11/15  صورت گرفت.       …
فصلِ: 14 , تعداد قسمت ها: 188 , سطح: صفر تا صد

این فصل در یک نگاه:

سلام . پیشنهاد میکنم حتما دموی دوره رو مشاهده کنید درباره فریم ورک Yii: در پاسخ به سوالات : آیا این فریم ورک سریع است؟ آیا این یک فریم ورک امن است؟ آیا این یک فریم ورک حرفه ای است؟ آیا ا…
فصلِ: 28 , تعداد قسمت ها: 253 , سطح: صفر تا صد

این فصل در یک نگاه:

آشنایی با امکانات جدید لاراول ۷…

برخی از سرفصل های این پکیج آموزشی :   لاراول چیست و چرا ما لاراول استفاده میکنیم کامپوزر کارش چیه و نصب اون نصب لاراول آموزش نصب لاراول از طریق اینستالر آموزش نصب لاراول با استفاده ا…
فصلِ: 1 , تعداد قسمت ها: 6 , سطح: صفر تا صد

این فصل در یک نگاه:

داشتن یک اپلیکیشن موبایل برای وب سایت به برند سازی و اعتبار وب سایت بهبود و تسریع می بخشد لذا توصیه می شود با وجود همگان…

  دوره آموزش طراحی و ساخت اپلیکیشن موبایل برای وب سایت   قطعا شما هم دوست دارید برای وب سایت خود اپلیکیشن بسازید و پس از پیگیری متوجه شدید که هزینه ای بیش از 5.000.000 تومان باید پرداخت بکن…
فصلِ: 9 , تعداد قسمت ها: 215 , سطح: صفر تا صد

این فصل در یک نگاه:

در اصل فصل در مورد performance صحبت خواهیم کرد :-React Performance-Lazy-Error Boundaries و سایت را بر روی هاست واقعی قرا…

با سلام خدمت کلیک سایتی های عزیز، به دوره ی صفر تا صد طراحی سایت با react js خوش آمدید. نکته:این دوره کاملا پروژه محور میباشد نکته:این دوره هیچ پیش نیازی ندارد ReactJS  چیست؟ ReactJS اس…
فصلِ: 11 , تعداد قسمت ها: 162 , سطح: صفر تا صد

این فصل در یک نگاه:

در این فصل(فصل یازدهم مجموعه)،به طراحی CMS (سیستم مدیریت محتوا)اختصاصی فروشگاه می پردازیم.هدف از طراحی این بخش،آنست که م…

در این مجموعه آموزشی قصد داریم از صفر تا صد طراحی یک فروشگاه اینترنتی رو به صورت کامل آموزش بدهیم.این فروشگاه شامل تمامی بخش های مورد نیاز یک فروشگاه اینترنتی است. هدف از این مجموعه،آموزش…
فصلِ: 1 , تعداد قسمت ها: 4 , سطح: متوسط

این فصل در یک نگاه:

در بازاریابی نوین روش جدیدی ابداع شده که این روزا ها بسیار کسب و کارهای اینترنتی را با هزینه بسیار بسیار پایین و بازدهی …

توضیحات کلی مجموعه: (توجه: حتما با کلیک روی عکس این دوره آموزشی در بالا دمو را مشاهده کنید یا قسمت اول را رایگان دانلود کنید) در بازاریابی اینترنتی هر روز شاهد روش های جدید و استراتژی های ن…
فصلِ: 4 , تعداد قسمت ها: 240 , سطح: صفر تا صد

این فصل در یک نگاه:

طراحی پنل مدیریت(دسته بندی)- دسته بندی یا category - نمایش دسته های فرعی در view با ورود به یکی از دسته های اصلی و آشن…

توضیحات کلی مجموعه: این مجموعه توسط فریمورک محبوب و دوست داشتنی bootstrap  و به صورت تضمینی  و صفر تا صد جهت یادگیری کارآموزان عزیز ارائه گردیده و دوستانی که این دوره را به طور کامل و دقیق…
فصلِ: 8 , تعداد قسمت ها: 77 , سطح: صفر تا صد

این فصل در یک نگاه:

  پیشنهاد میکنیم دمو دوره رو حتما مشاهده کنید با سلام خدمت دوستان عزیز . ابتدا عرض کنم که این دوره برای دوستانی آماده شده که میخوان وب اپلیکیشن های مدرنی رو طراحی بکنن و وارد بازار کار ط…
فصلِ: 5 , تعداد قسمت ها: 25 , سطح: صفر تا صد

این فصل در یک نگاه:

فصل پنجم…

توضیحات کلی مجموعه: درباره گیت: لذت پیش بردن پروژه های برنامه نویسی خود را با بهترین ورژن کنترل سیستم جهان تجربه کنید کامل ترین دوره ی آموزشی گیت و گیت هاب به همراه مثال های کاربردی گی…
فصلِ: 5 , تعداد قسمت ها: 201 , سطح: صفر تا صد

این فصل در یک نگاه:

ایجاد پروژه آژانس مسافرتی.....…

فصل اول: آشنایی با مبانی برنامه نویسی اندروید   آشنایی با معماری برنامه های اندرویدی ساخت شبیه ساز جهت تست پروژه اندروید آشنایی با دستور Toast و حلقه for در برنامه های اندروی…
فصلِ: 1 , تعداد قسمت ها: 2 , سطح: متوسط

این فصل در یک نگاه:

بهترین و پر بازده ترین روش تبدیل بازدیدکننده سایت به مشتری تبلیغات هدفمند و برند سازی هوشمندانه با ایمیل می باشد. ایمیل…

  وبینار(سمینار آنلاین) آموزش تکنیک های ایمیل مارکتینگ   اگر تا انتها این متن را مطالعه کنید نظر شما در مورد ایمیل مارکتینگ 180 درجه عوض می شود!! بر هیچکس پوشیده نیست که از سال 1972 که ای…
فصلِ: 4 , تعداد قسمت ها: 368 , سطح: صفر تا صد

این فصل در یک نگاه:

مباحث تکمیلی فریم ورک لاراول…

فصل اول :آموزش مقدماتی فریم ورک لاراول معرفی فریم ورک لاراول و پیشنیازهای انجام کار انجام کانفیگ های اولیه برای نصب و راه اندازی فریم ورک معرفی روش های نصب پروژه لاراولی از طریق سایت گی…
فصلِ: 1 , تعداد قسمت ها: 155 , سطح: صفر تا صد

این فصل در یک نگاه:

مباحث مقدماتی فریم ورک react.js…

توضیحات کلی مجموعه: فصل اول : آشنایی با مباحث مقدماتی فریم ورک react.js نصب و راه اندازی node.js  و کلیه پیش نیازهای لازم نصب فریم ورک react روی لوکال و انجام تست های لازم آغاز آشنایی …

تولید شده توسط کلیک سایت

پشتیبانی آنلاین
آماده پاسخگویی هستیم
انتخاب تصویر جهت ارسال:
در حال ضبط صدا

(جهت توقف و یا لغو ضبط از دکمه های زیر استفاده کنید)

توقف و ارسال :
لغو ضبط
در حال حاضر تمامی کارشناسان آفلاین هستند. همواره می توانید با شماره تلگرام / واتساپ 09010005000 به صورت آنلاین با ما در ارتباط باشید. جهت ورود به واتساپ کلیک کنید
0 پیام جدید
پشتیبان در حال تایپ ...
ارسال تصویر ضبط صدا
0 کارشناسان آنلاین می باشند
این گفت و گو توسط پشتیبان به اتمام رسید