برچسب: php

  • ارسال با رفرنس در PHP

    ارسال با رفرنس در PHP

    توی پی اچ پی بجز اشیا بقیه ی مقادیر پریمیتیو هستند و رفرنس تایپ نیستن. ینی شما مثلا وقتی یه آرایه رو به یک آرایه دیگه assign میکنید اون دو تا آرایه جاهای جدا از حافظه رو اشغال میکنن و طبیعی هست که تغییر یکی روی اونیکی اثری نذاره. یه مثال ساده:

    <?php
    
    $numbers = [1, 2, 3];
    
    $anothers = $numbers;
    
    $anothers[1] = 5;
    
    var_dump($numbers);
    
    // Output:
    
    array(3) {
      [۰]=>
      int(1)
      [۱]=>
      int(2)
      [۲]=>
      int(3)
    }

    اشیا اینطور نیستن و میشه توی این مثال راحتتر منظورم رو برداشت کرد:

    <?php
    
    class Test {
        public $name;
    }
    
    $t1 = new Test();
    $t1->name = "Test 1";
    
    $t2 = $t1;
    $t2->name = "Test 2";
    
    var_dump($t1->name);
    
    // Output:
    string(6) "Test 2"

    برای اینکه اشیا رو ازشون کپی بگیریم خیلی راحت ازش clone میگیریم:

    <?php
    
    class Test {
        public $name;
    }
    
    $t1 = new Test();
    $t1->name = "Test 1";
    
    $t2 = clone $t1;
    $t2->name = "Test 2";
    
    var_dump($t1->name);
    
    // Output:
    string(6) "Test 1"

    پریمیتیو ها رو هم میشه مثل رفرنس اساین کرد به یه علامت & قبل از متغیری که میخواد اساین بشه:

    $a = 2;
    $b = &$a;
    $b++;
    var_dump($a);
    
    // Output:
    int(3)

    و نهایتا اگه بخوایم چیزی که primitive هست رو بصورت رفرنس ارسال کنیم یه علامت & قبل از اسمش میذاریم. به این صورت:

    $x = 3;
    
    function change(&$x) {
        $x++;
    }
    
    change($x);
    
    var_dump($x);
    
    // Output:
    
    int(4)

    توی یه سری زبون ها نیازه که جایی که کال میکنیم هم علامت رو بذاریم ولی توی پی اچ پی فقط توی ورودی تابع بنویسیم کافیه.

    امیدوارم به دردتون بخوره.

  • کار با Complex (curly) syntax در PHP

    توی زبون های مختلف وقتی با رشته ها کار میکنیم ممکنه بخوایم یه استرینگ رو مثلا اکو کنیم یا هر کار دیگه ای و داخل اون استرینگ یه متغیر هم باشه. توی PHP میتونید رشته رو توی دبل کوتیشن بذارید و رشته بصورت رندر شده داخل استرینگ نشون داده میشه. یه همچین چیزی منظورم هست:

    <?php
    $name = "Hamid";
    echo "My name is $name";
    
    // output: My name is Hamid

    ولی یسری مواقع هست که شما میخواید از یک آرایه ی Associative مقدار بکشی بیرون. فرض کنید از یه ریکوعست داده اومده واستون و میخواید داده ای که از $_GET اومده رو مستقیما توی رشته چاپ کنید. (این یه مثاله و قطعا توی این موارد بهتره validation انجام بشه).

    <?php
    
    echo "My name is $_GET['name']";
    
    // output: Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in strings.php on line 3

    توی همچین دو تا راه سخت دارید. یکی از سختا اینه که مقدار رو بیرون از رشته بگیرید داخل یه متغیر ذخیره کنید و بعد اونو بذارید داخل رشته که یدونه الکی متغیر هدر میره:

    <?php
    
    $name = $_GET['name'];
    echo "My name is $name";

    راه دوم سخت تر اینه که رشته ها رو بچسبونید به متغیر به این صورت که کار رو یکم سخت میکنه:

    <?php
    
    echo "My name is $name" . $_GET['name'];

    ولی راه قشنگتر اینه که از Complex (curly) syntax استفاده کنید که در میشه آرایه های Associative هم توی استرینگ مستقیم رندر کرد.

    <?php
    
    $user = [
        'name' => 'Hamid',
        'age' => 29
    ];
    echo "My name is {$user['name']} and I am {$user['age']} years old.";
    
    // output: My name is Hamid and I am 29 years old.

    میبینید که چقد شیک و ساده میشه اینکارو کرد توی ورژن های جدید PHP.

    شاد باشید 🙂

  • تدریس خصوصی PHP

    اگر قصد دارید برنامه نویسی بکند رو یاد بگیرید شاید این روزا بهترین گزینه PHP و فریمورک لاراول باشه. پی اچ پی یک زبان برنامه نویسی بکند هست که بخش زیادی از بازار توسعه وب دنیا رو در اختیار داره و حتی سی ام اس های معروفی مثل وردپرس هم با این زبان نوشته شدن و شما برای توسعه پلاگین برای وردپرس هم میتونید این زبان رو یاد بگیرید. همچنین فریمورک های معروفی مثل لاراول هم با زبان PHP نوشته شدن. ما در یک دوره ی کوتاه ولی منظم به شما مبانی کار با PHP رو به نحوی یاد میدیم که اولین پروژه ی خودتون رو که کاملا کاربردی باشه رو با PHP بزنید

    سرفصل های دوره ی PHP

    بصورت کلی سرفصل های زیر را در این دوره یاد خواهید گرفت.

    • مقدماتی در مورد برنامه نویسی وب
      • HTTP
      • مرورگر
      • مرور فرانت
        • HTML
        • CSS
        • JavaScript
    • مقدمات کار با سیستم عامل
      • کار با ترمینال
      • دستورات پایه
      • مدیریت حافظه
    • کار با انواع داده
    • ساختار های کنترلی
    • توابع
    • کلاس ها و اینترفیس ها
    • فضای نام در PHP
    • کار با composer
    • مفاهیم کامپوزر مثل autoloading
    • کار با دیتابیس MySQL
    • مفاهیم api نویسی و json
    • کار با postman
    • احراز هویت در PHP
      • ثبت نام
      • ورود به سیستم
      • فراموشی رمز عبور
    • ارسال ایمیل
    • ارسال پیامک
    • کار با فایل ها و آپلود فایل
    • سشن ها و کوکی ها

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

    اگر نیاز به مشاوره ی رایگان در مورد کلاس ها و نحوه آموزش دارید با من در واتساپ تماس بگیرید.

  • تدریس خصوصی MySQL برای PHP

    تدریس خصوصی MySQL برای PHP

    با اینکه این روزها سیستم های مدیریت پایگاه داده noSQL خیلی ترند تر هست ولی همچنان خیلی جاها نیاز هست که ما با سیستم های قدیمی و البته محبوب مثل MySQL کار کنیم. قدرت پایگاه داده های رابطه ای زمانی مشخص میشه که شما بخواید با داده های شدیدا رابطه ای کار کنید. مای اس کیو ال یه سیستم مدیریت پایگاه داده رابطه ای هست. اگر نیاز به یادگیری بصورت آموزش خصوصی MySQL دارید میتونید با من با شماره ۰۹۱۹۹۶۵۶۶۹۳ تماس بگیرید تا یادگیری کار با پایگاه داده با MySQL رو بهتون آموزش بدم.

    در این دوره چیا یاد میگیریم؟

    مای اس کیو ال از زبان SQL یا Structured Query Language استفاده میکنه که پرسش هایی که داره رو از دیتابیس انجام بده. در این دوره ما قصد داریم با استفاده از زبان برنامه نویسی PHP به شما یاد بدیم که چطور به دیتابیس وصل بشید و کارهایی مثل ذخیره و بازیابی داده و کارهای پیچیده تر مثل join ها و… رو انجام بدید. این دوره پیش نیاز دوره ی کار با datatables هست و با یادگیری اون قطعا راه برای ایجاد اپلیکیشن های پیچیده که دارای استوریج داده هستند باز میشه واستون.

    بعد از این دوره شما قادر خواهید بود که نیازهای خودتون رو بعنوان یک برنامه نویس متوسط رفع کنید و با کسب تجربه در آینده نزدیک کارهای خفن تری که تو ذهنتون هست رو انجام بدید.

    در این دوره با مباحث زیر بصورت عملی کار خواهید کرد:

    • دیتابیس چیه و چرا بوجود اومد؟
    • نصب MySQL
    • نصب GUI های معروف مثل PHPMyAdmin یا Table Plus
    • آشنایی با مفاهیم اولیه مثل جدول، سطر، ستون، پرسش و…
    • کامنت گذاری در MySQL
    • دستورات ساخت دیتابیس و جدول
      • ساخت و حذف دیتابیس
      • ساخت و حذف و اصلاح جدول
      • آشنایی با انواع داده در MYSQL
      • آشنایی با داده های مختلف برای تاریخ و زمان
      • انواع محدودیت یا constraint ها
      • فهرست گذاری یا INDEX
      • کلید های اولیه یا PRIMARY KEY
      • کلید های خارجی یا FOREIGN KEY
      • محدودیت CHECK در MySQL
    • واکشی داده با دستور SELECT
    • محدود کردن داده ی انتخاب شده با دستور WHERE
      • کار با دستور HAVING
      • کار با دستور EXISTS
      • کار با دستورات ANY و ALL
    • ترکیب چند عبارت با دستور های AND، OR و NOT
    • مرتب کردن داده با دستور ORDER BY
    • چک کردن مقادیر NULL
    • وار کردن داده ی جدید به دیتابیس با دستور INSERT
    • وارد کردن به جدول با انتخاب از جدول دیگه با دستور INSERT INTO SELECT
    • بروزرسانی داده ی قدیمی با دستور UPDATE
    • حذف ریکورد ها از دیتابیس با دستور DELETE
    • واکشی تعداد محدودی داده با دستور LIMIT
    • پیدا کردن حداقل و حداکثر روی یه ستون با دستورهای MIN و MAX
    • گرفتن تعداد سطر ها، جمع و میانگین با دستورهای AVG، COUNT و SUM
    • جستجو در فیلدها با دستور LIKE و Wildcard ها
    • استفاده از دستور IN برای جستجوی چند مقدار مختلف در یک ستون
    • کار با دستور BETWEEN برای جستجو در بازه روی یک فیلد از دیتابیس
    • مفهوم Alias ها و کار با اونها
    • ترکیب جدول ها با هم با استفاده از JOIN و آموزش انواع جوین ها:
      • INNER JOIN
      • LEFT JOIN
      • RIGHT JOIN
      • CROSS JOIN
      • جوین به جدول فعلی یا همون self join
      • UNION ها که البته جوین حساب نمیشن!
    • کار با دستور مهم GROUP BY برای گروه زدن بر اساس فیلدها
    • کار با دستور CASE
    • کار با عملگر ها
    • کار با VIEW ها در MySQL
    • کار با توابع یا Functions
    • آموزش کار با Stored Procedure ها
    • آموزش کار با Stored Function ها
    • آموزش کار با Trigger ها در SQL
    • آشنایی با ORM ها

    آیتم های فوق رو برای اینکه صفر تا ۱۰۰ از مای اس کیو ال رو یاد بگیرید نوشتم. ولی اگر شما نیاز به آموزش مقدماتی دارید میشه بخشی از مفاهیم بالا رو میشه ازشون رد شد. برای مشاوره و اطلاعات بیشتر در مورد دوره ها با من تماس بگیرید.

  • استاندارد PSR-1 در PHP

    یسری نکات تو کد نویسی تو هر زبانی هستن که رعایت کردنشون میتونه شما رو خیلی حرفه ای تر نشون بده و رعایت نکردنشون زیاد جالب نیست برای یک برنامه نویس که ادعای خفن بودن میکنه 🙂

    تو زبان PHP یسری استاندار تعریف شده که امروزه همه برنامه نویسای خوب PHP رعایتش میکنن، این میتونه برای همه خوب باشه… هم کسی که کد مینویسه و هم کسی که کد میخونه.

    استانداردی که تو این پست میخام بصورت خلاصه در موردش حرف بزنم PSR-1 هست که اشاره میکنه استاندارد های پایه ی کد نویسی در PHP.

     

    تو PHP چند روش برای باز کردن کد PHP و بستن اون وجود داره ولی این استاندارد میگه که از این روش استفاده کنید :‌<?php ?> یا از نوع کوتاهش به این صورت :‌ <? =?>

    کاراکتر انکودینگی که استفاده میشه باید UTF-8  باشه و بدون BOM .

    نکته ی دیگه ای که خیلی مهمه اینه که اجرای منطق برنامه با include  و تعریف کردن تابع و… یک جا نباشن، یعنی مثلا شما اگه دارید یه فانکش تعریف میکنید بالاش مثلا echo  نکنید. این مثالی که در زیر اومده یه نمونه غلط طبق این استاندارد هست :

    <?php
    // side effect: change ini settings
    ini_set('error_reporting', E_ALL);
    
    // side effect: loads a file
    include "file.php";
    
    // side effect: generates output
    echo "<html>\n";
    
    // declaration
    function foo()
    {
        // function body
    }

    ولی در مثال زیر استاندار PSR-1 بخوبی رعایت شده :

    <?php
    // declaration
    function foo()
    {
        // function body
    }
    
    // conditional declaration is *not* a side effect
    if (! function_exists('bar')) {
        function bar()
        {
            // function body
        }
    }

    namespace ها و نام کلاس ها

    هر کلاس باید توی یه فایل نوشته بشه و مثلا وسط کد کلاس تعریف نکنید و یا مثلا دو تا کلاس رو توی یه فایل ننویسید. اسم کلاس ها باید بصورت StudlyCaps باشه که مشخصه ینی چجوری…

    برای ورژن ۵٫۳ به بعد از روش رسمی فضای نام ها استفاده کنید، برای مثال :‌

    <?php
    // PHP 5.3 and later:
    namespace Vendor\Model;
    
    class Foo
    {
    }

    ولی برای ورژن های قبل که از این قابلیت پشتیبانی نمیکنن از pseudo-namespacing استفاده کنید که یه پیشوند Vendor_ به اسم کلاسها اضافه میشه و sub namespace ها بعد از اون نوشته میشن و در نهایت نام کلاس نوشته میشه :

    <?php
    // PHP 5.2.x and earlier:
    class Vendor_Model_Foo
    {
    }

    ثابت ها در کلاس ها 

    ثابت ها در کلاسها طبق این استاندارد باید با حروف بزرگ تعریف بشن و برای جدا کردن از underscore  استفاده کنید. یچیزی مثل کد زیر :

    <?php
    namespace Vendor\Model;
    
    class Foo
    {
        const VERSION = '1.0';
        const DATE_APPROVED = '2012-06-01';
    }

    در مورد پراپرتی ها در کلاس ها دستور خاصی گفته نشده ولی کلاس ها باید بصورت camelCase()  تعریف بشن.

    همین روزا بقیه استاندارا رم میتویسم واستون که بخونیم و رعایت کنیم. مرسی 🙂

     

  • دیزاین پترن singleton در PHP

    در ادامه بحث هامون در مورد دیزاین پترن ها امروز میخوام بصورت خلاصه در مورد singleton design pattern بنویسم که فکر میکنم به درد خیلی هاتون بخوره و خیلی از پیچیدگی کد نویسی رو براتون کمتر کنه. بصورت خلاصه و مفید اگه بخوام بگم این دیزاین پترن همونطور که از اسمش پیداست از تکرار جلوگیری میکنه و جاهایی استفاده میشه که بخوایم یه کد تکراری رو فقط یکبار بنویسیم. پس سینگلتون جاهایی به کارمون میاد که ما به یه نمونه از شی بصورت گلوبال میخوایم دسترسی داشته باشیم. مثلا شما ممکنه مجبور باشید توی یک سیستم بارها به دیتابیس وصل بشید. یا ممکنه بخواید از api یه سایت دیگه هر چند بار پشت سر هم استفاده کنید یا هر چیز دیگه ای که خودتون صلاح میدونید… با مثال توضیح میدم که ایده ی این الگو چطور هست. در زیر یه پیاده سازی پایه از این الگو رو میبینیم :

    class Database
    {
        public static function Instance()
        {
            static $inst = null;
            if ($instnce === null) {
                $instnce = new Database();
            }
            return $instnce;
        }
    
        public function getUsers()
        {
            return 'users...';
        }
        
        public function getPosts()
        {
            return 'posts...';
        }
    }
    
    $users = Database::Instance()->getUsers();
    $posts = Database::Instance()->getPosts();

    همونطور که میبینید Instance  به صورت متد استاتیک تعریف شده و بصورت استاتیک بهش دسترسی پیدا میکنیم.

  • دیزاین پترن Simple Factory در PHP

    سلام، بعد از یه وقفه ی نسبتا طولانی امروز دوباره تصمیم گرفتم که این وبلاگ متروکه رو آپدیت کنم و یسری پست که احساس میکنم خوبن رو اینجا بفرستم… البته پستای قبلیمو دارم میبینم اکثرا چرت و پرتن و ارزش خوندن ندارن ولی به هر حال وبلاگ خودمه و کلی پول هاست و دامین دادم و دوس دارم که بعنوان یادگاری همینجا باشن و کسی اگه اعتراض داره میتونه مراتب اعتراضش رو تحت یک کامنت برام ارسال کنه تا بررسی و پاسخ داده بشه 🙂

    Design patternها یا فارسیش میشه احتمالا الگوهای طراحی نرم افزار توی همه زبان ها خیلی خیلی مهمن. معمولا وقتی کدی مینویسیم که قرار نیست در آینده گسترش داده بشه خیالمون راحته و از یجای کار شروع میکنیم و یجا تموم میکنیم و کار رو تحویل میدیم، ولی وقتی کارفرما میگه که “در آینده قراره امکانات زیادی از قبیل فلان۱ و فلان۲ و… به سیستم اضافه بشه”، اونجا باید یه فکر پایه ای تر برای سیستم داشته باشیم. طوری که اگه قرار شد یه بخش جدید رو به سیستم اضافه کنیم مجبور نباشیم تو بخشای قبلی دست اندازی کنیم یا حداقل کم مجبور باشیم(!).

    فرض کنید که میخواید یه فروشگاه بنویسید که ادمین روزی چند تا محصول از نوع اسباب بازی به سیستم اضافه میکنه. ابتدایی ترین روشی که به فکر همه ما میرسه اینه که یه کلاس ایجاد کنیم تحت نام Product  و توی اون درج، اصلاح، حذف و … محصول که فعلا اسباب بازی هست رو انجام بدیم. یه چیزی شبیه این :

    <?php
    class Product {
        public function __construct($name) {}
    
        public function save() {}
    }
    $product = new Product('first toy');
    $product->save();

    تا اینجا همه چی خوبه و شما در آرامش قبل از طوفان به سر میبرید! مشکل زمانی پیش میاد که مجبور بشید مثلا بجز اسباب بازی ، کتاب هم در فروشگاهتون بفروشید. اینجا دیگه روش ایجاد و اصلاح و … فرق میکنه و نمیتونید همین متد های قبل رو استفاده کنید. توی دیزاین پترن بالا شما مجبورید یه $type  زمان نمونه گیری از کلاس بگیرید و توی هر متد if و else بذارید و بگید اگه این دسته بود این کارو بکن و اگه… که قطعا روش خوبی نیست و مثلا وقتی چنتا دسته دیگه بعدها اضافه بشه کدمون خیلی داغون میشه.

    نحوه ی پیاده سازی دیزاین پترن Simple Factory در PHP

    سیمپل فکتوری دیزاین پترن میگه که شما این کارو بکنید :

    اول یه کلاس factory بسازید :

    class ProductFactory {
      public function __construct(){ }
    
      public static function create($type){
         if ($type == '')
            throw new Exception('invalid product type');
         else {
            $className = 'product_' . ucfirst($type);
            if (class_exists($className))
               return new $className;
            else
               throw new Exception('Product type not found');
         }
      }
    }
    

    حالا واسه ساخت اسباب بازی از روش خیلی ساده زیر استفاده کنید :  

    class product_Toy
    {
      public function __construct(){
         echo "toy is creating";
      }
    }
    $toy = ProductFactory::create('toy');
    

    حالا اگه یه دسته جدید مثل کتاب به محصولاتون اضافه شه خیلی راحت میتونید کلاسش رو بسازید محصولتون رو اضافه کنید :

    class product_Book
    {
      public function __construct(){
         echo "book is creating";
      }
    }
    $book = ProductFactory::create('book');
    

    در مجموع simple factory method خیلی ایده ی سختی نداره. میگه وقتی داری از یه کلاس نمونه میگیری که خودش میتونه انواع مختلفی داشته باشه یدونه فکتوری واسش درست کن و از فکتوری نمونه بگیر که هر بار مجبور نشی هزار تا جایی که ازش نمونه گرفتی رو تغییر بدی. بعد برو توی فکتوری و چک کن که با توجه به کانفیگت کدوم کلاس رو نمونه بگیری.

    احتمالا الان میگید که این که خیلی پیش پا افتاده بود و شاید شما خیلی کارای خفن تر هم میتونید انجام بدید ولی خب بعضی وقتا همین کارای ساده باعث منظم شدن برنامه میشن و در آینده خودتون و مخصوصا دیگران کمتر اذیت میشن. البته این دیزاین پترن همونطور که از اسمش مشخصه سیمپل بود و  در آینده در مورد پترن های دیگه هم صحبت خواهیم کرد حتما

    امیدوارم کمکتون کرده باشم و خوشحال میشم نظراتتون رو بشنوم 🙂

  • file_get_content بوسیله curl در php

    همونطور که میدونید تابع flie_get_contents()  سورس فایل مورد نظر رو که میتونه حتی یک صفحه وب باشه رو میریزه توی یه رشته و میتونید هر بلایی سرش بیارید(مثلا با html-dom-parser به المنت هاش دسترسی پیدا کنید). بعضی وقتا ssl و… نمیذارن که بصورت مستقیم به محتویات صفحه دسترسی پیدا کنید. همینطور وقتی میخواید یه عکس رو از یه صفحه ای که ssl روش هست کپی کنید…  من به این مشکل برخوردم و با curl مشکلم رو حل کردم… جمع و جورش رو براتون در قالب یه فانکشن گذاشتم که امیدوارم به دردتون بخوره…

     function file_get_contents_curl( $url ) {
            $ch = curl_init();
            curl_setopt( $ch, CURLOPT_AUTOREFERER, TRUE );
            curl_setopt( $ch, CURLOPT_HEADER, 0 );
            curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
            curl_setopt( $ch, CURLOPT_URL, $url );
            curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, TRUE );
            curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0);
            curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0);
            $data = curl_exec( $ch );
            curl_close( $ch );
            return $data;
        }

    موفق باشید…

  • پراپرتی و متدهای استاتیک در php

    قبل از اینکه بخوام در مورد facade  در لاراول صحبت کنم باید اطلاعات کلی در مورد توابع یا متدهای استاتیک php داشته باشید. متدهای استاتیک متدهایی از یک کلاس هستند که بدون نمونه گیری از کلاس و بصورت استاتیک قابل دسترسی هستند. یعنی بدون داشتن شئ از کلاس ، میتونیم از این نوع متدها استفاده کنیم.

    قبل از مثال در مورد متدهای استاتیک میخوام کمی در مورد متغیرها یا پراپرتی های استاتیک صحبت کنم. یک پراپرتی استاتیک بدون استفاده از $this  و به راحتی با استفاده از ::  قابل دسترسی هست. همچنین میتونید یک متغیر استاتیک رو با استفاده از کلمه کلیدی static  تعریف کنید. به مثال زیر توجه کنید :

    class test
    {
    public static $a;//Static variable
    }
    test::$a = 5;
    echo test::$a;

    میبینید که چقدر راحت میشه به پراپرتی های استاتیک دسترسی داشت. با استفاده از کلمه های کلیدی self  و parent  هم میتونید به پراپرتی های این کلاس و یا کلاس پدر دسترسی داشته باشید.

    class testParent
    {
    public static $var1;
    }
    class testChild extends testParent
    {
    public static $var2;
    public $abc =2;
    function testFunction()
    {
    self::$var2 = 3;
    parent::$var1 = 5;
    }
    }
    echo testChild::$abc; //throw fatal error

    نحوه ی تعریف متدهای استاتیک

    <?php
    class Game
    {
    	public static function start()
    	{
    		echo "Go!";
    	}
    }
    
    Game::start();

    همونطور که در بالا میبینید متد start()  بصورت استاتیک تعریف شده و خیلی شیک و مجلسی میشه ازش نمونه ساخت. این نوع توابع در نگاه اول خیلی جالب به نظر میرسن… و سوالی که پیش میاد اینه که چرا همه متد هارو استاتیک تعریف نمیکنیم؟ 

    متدهای استاتیک با اینکه اولش خیلی باحال به نظر میرسن ولی محدودیتی دارن که تنها در بعضی موارد میتونیم ازشون استفاده کنیم : “بخاطر استاتیک تعریف شدن این متدها ، امکان استفاده از $this  در این نوع متدها وجود ندارد.” ولی در مجموع این نوع متدهای خیلی پرکاربرذ هستند.

  • آموزش و کاربرد استفاده IOC container در Laravel

    امروز بحث رو اندکی تخصصی تر میکنیم و میریم سمت container قدرتمند لاراول. یکی از مشخصه هایی که لاراول رو از سایر فریمورک های PHP جدا میکنه ، همین IOC هست. Dependency injection  یا DI یا تزریق نیازمندیها یک موضوع مهم در همه زبانهای شئ گراست. اینکه شما سایر کلاسها رو در کلاس خودتون استفاده کنید خیلی مهمه.

    اما IOC کانتینر چیست؟

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

    $myInstance = new MyClass();
    
    $myInstance->method();

    حتما بارها شده که مقدار Request $request رو بعنوان ورودی به یک تابع در کنترلر میفرستید. سوالی که پیش میاد اینه که بدون نمونه گرفتن از کلاس Request چطور PHP اونو میشناسه؟ اینجاست که کاربرد IOC مشخص میشه. لاراول با کانتینرش شرایطی رو مهیا کرده که شما به راحتی با آبجکت ها کار کنید و ازشون نمونه بگیرید. لاراول وقتی کدی مثل FOO $foo رو میبینه دنبال کلاس FOO میگرده که از اون نمونه بگیره به شرطی که کلاس FOO به کانتینر معرفی شده باشه قبلا. این خیلی خوبه. شما بدون اینکه از کلاس نمونه بگیرید نمونه گرفته میشه. بعضی وقتا پیش میاد که شما میخواید یک ریپازیتوری بنویسید که دیگران هم بتونن ازش استفاده کنن. اینجا نیاز هست که کلاس خودتون رو به لاراول برای نمونه گیری معرفی کنید و شما باید بصورت دستی کلاس رو به IOC بچسبونید یا به اصطلاح bind کنید.

    نحوه ی bind یک کلاس به IOC در لاراول

    ساده ترین روش بایند کردن کلاس به ioc استفاده از فساد App هست که باهاش میتونید هر جایی در برنامه یه کلاس رو به کانتینر بایند کنید. (هر چند بهترین جا برای بایند کردن استفاده از service provider ها هست)

    App::bind('Hamid\Repositories\User\UserRepository', function($app)
    {
        return new EloquentUserRepository( new User );
    });

    در کد بالا EloquentUserRepository رو چسبوندیم به کانتینر و از این به بعد لاراول کلاس EloquentUserRepository رو میشناسه همه جا و resolve اش میکنه.

    حتما در مورد فساد ها در لاراول اطلاعاتی دارید. همه ی کلاسهایی که در فساد ها ازشون استفاده میکنیم قبلا به کانتینر بایند شدن. مثلا در زیر بخشی فایل Illuminate/Support/Facades/Auth.php رو میبینید که مربوط به فساد Auth هست که هر روز ازش استفاده میکنیم:

    class Auth extends Facade
    {
        /**
         * Get the registered name of the component.
         *
         * @return string
         */
        protected static function getFacadeAccessor()
        {
            return 'auth';
        }

    همونطور که میبینید متد استاتیک getFacadeAccessor داره یه رشته رو برمیگردونه که در فایل Illuminate/Auth/AuthServiceProvider.php بصورت زیر به کانتینر بایند شده:

    $this->app->singleton('auth', function ($app) {
         return new AuthManager($app);
    });