Ali Ghaleyan
5 سال پیش توسط Ali Ghaleyan مطرح شد
13 پاسخ

متد های استاتیک و void

سلام
در لاراول اگر دقت کرده باشید function where خودش استاتیک نیست ولی میشه ازش استفاده کرد
اما آبجیک های دیگه هم که داخل تابع where ازش استفاده میشه هم استاتیک نیست اما کار میکنه
به صورت معمولی در پی اچ پی وقتی بخواهیم این کار رو انجام بدیم ارور میده و $this ارور میده
توابع لاراول چطور این اجازه میدن و درست کار میکنن؟


ثبت پرسش جدید
علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش آپدیت شد
1

@alighalehban1379

سوالتون٬ سوال بسیار خوبیه...

برای درک بهتر این موضوع٬ به ۲ تابعی که داخل همین بحث براتون توضیح دادم دقت کنید:

  • call__
  • callStatic__

. این‌ها Magic Methods یا متدهای جادویی هستند. (construct__ هم یکی از این متدهاست)
و کارشون اینه که: اگر بخواهید از تابعی استفاده کنید که در کلاس موجود نباشه٬ اول این ۲ تا متد اجرا میشند.(call برای توابع معمولی و callStatic برای توابع استاتیک)
برای مثال٬ کد زیر رو اجرا کنید:


<?php

Class One
{
    public static function __callStatic($method, $params)
    {
        echo "Called from magic Method: $method ";
    }

}

One::Two();
?>

با وجود اینکه ما تابع استاتیک Two رو نداریم اما باز هم بخاطر وجود callStatic__ این کد اجرا میشه.

حالا...
در فایل Illuminate\Database\Eloquent\Model ما متد استاتیک where رو نداریم. پس به متد callStatic__ پاس داده میشه.

    public static function __callStatic($method, $parameters)
    {
        return (new static)->$method(...$parameters);
    }

و نتیجش میشه چیزی شبیه به زیر:

$class->where($parameters)

سپس تابع معمولی where خوانده میشه٬ اما اون هم موجود نیست... پس به متد call__ پاس داده میشه.

و در این متد یه instance از Illuminate\Database\Eloquent\Builder ساخته میشه و اگر داخل این فایل رو چک کنید میبینید که متد where در واقع در این فایل هست و یک متد معمولیه و به همین علت ٬ شما به this$ دسترسی دارید.

موفق باشید.


حسام موسوی
تخصص : طراح و برنامه نویس
@hesammousavi 5 سال پیش مطرح شد
0

با استفاده از magic متدهای که php وجود دارند


Ali Ghaleyan
تخصص : برنامه نویس لاراول
@Serjik 5 سال پیش مطرح شد
0

@hesammousavi
سلام آقا خسته نباشید
آقای موسوی نمونه کد دارید ازش
میشه بگید چطور همچین چیزی انجام میده دقیق تر


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
1

@alighalehban1379
متدهای مخصوصی در شئ‌گرایی PHP هستند و تمام مدل‌ها هم از فایل Illuminate\Database\Eloquent\Model.php ارث‌بری میکنند. داخل این فایل ۲ تا متد وجود داره.
کار این ۲ تا متد اینهکه چک میکنند٬ اگر تابعی خوانده بشه و تعریف هم نشده باشه ابتدا این توابع اجرا میشند.

   public function __call($method, $parameters)
    {
        if (in_array($method, ['increment', 'decrement'])) {
            return $this->$method(...$parameters);
        }

        return $this->newQuery()->$method(...$parameters);
    }

    public static function __callStatic($method, $parameters)
    {
        return (new static)->$method(...$parameters);
    }

اولی برای متدهای عادی و دومی برای متدهای استاتیک استفاده میشه.


Ali Ghaleyan
تخصص : برنامه نویس لاراول
@Serjik 5 سال پیش مطرح شد
0

@ali.bayat
اصلا اجازه نمیده که this$ استفاده بشه داخل کلاس


Ali Ghaleyan
تخصص : برنامه نویس لاراول
@Serjik 5 سال پیش آپدیت شد
0

بزارید دقیق تر توضیح بدم

من یه کلاس تعریف کردم برای مثال به اسم پست و داخلش یه متد به اسم ایندکس ساختم و داخل متد از یک کلاس دیگه به شکل استاتیک و از متد ایندکسی که داخلش هست استفاده کردم
داخل کلاس دوم و متدی که نام برده شده از ابجکتها یا متدهایی که داره میخوام استفاده کنم طوری که اون ابجکت ها و متد ها ویژگی استاتیک نداشته باشن و همچنین اینکه با استفاده از this$ صدا زده بشن همینطور که داخل متد where لاراول از کوئری با استفاده از this$ نام برده...


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
1

@alighalehban1379

ببینید this$ در واقع به کلاسی اشاره میکنه که شما در حال کارکردن باهاش هستید. در صورت امکان توضیح بدید شما قصد انجام چه کاری رو دارید؟ یا کدتون رو به اشتراک بذارید


Ali Ghaleyan
تخصص : برنامه نویس لاراول
@Serjik 5 سال پیش آپدیت شد
0

}Class post
}()Public function index
;()OtherClass::index
{
{

     } Class OtherClass 

;'Public $name='name
}()Public function index
;Echo $this->name
{
{

@ali.bayat


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
1

@alighalehban1379
متد index شما باید از نوع استاتیک باشه که بتونید بصورت ()Class::method ازش استفاده کنید.

<?php

Class Post 
{
    public static function index()
    {
        (new OtherClass)->index();
    }
}

Class OtherClass
{
    public $name  = 'name';
    public function index()
    {

        echo $this->name;
    }
}

Post::index();

Ali Ghaleyan
تخصص : برنامه نویس لاراول
@Serjik 5 سال پیش مطرح شد
0

من از ایندکس استفاده میکنم هیچ مشکلی نداره
(new OtherClass)->index();
اینجا که شما اینطوری فراخونیش کردین میخوام به صورت استاتیک باشه طوری که بقیه ی کدا عوض نشن فقط این تکه کد رو عوض کنید


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
1

در اون حالت کد زیر:

<?php

Class Post 
{
    public static function index()
    {
        OtherClass::index();
    }
}

Class OtherClass
{
    public static $name  = 'name';

    public static function index()
    {

        echo self::$name;
    }
}

Post::index();

Ali Ghaleyan
تخصص : برنامه نویس لاراول
@Serjik 5 سال پیش مطرح شد
0

@ali.bayat
سلام و درود اقای بیات
ممنون از راهنماییتون

ولی سوال من اینه که داخل تابع where لارول رو اگه نگاه کنید ، خود where به صورت استاتیک صدا زده میشه اما داخلش $this استفاده شده
حتما نگاه کنید... سوالم اینه چطوری این اتفاق افتاده
داخل کدی که شما فرستادین تابع و ابجکت کلاش otherClass رو استاتیک کردین اما داخل where لاراول همیچین اتفاقی نیفتاده


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش آپدیت شد
1

@alighalehban1379

سوالتون٬ سوال بسیار خوبیه...

برای درک بهتر این موضوع٬ به ۲ تابعی که داخل همین بحث براتون توضیح دادم دقت کنید:

  • call__
  • callStatic__

. این‌ها Magic Methods یا متدهای جادویی هستند. (construct__ هم یکی از این متدهاست)
و کارشون اینه که: اگر بخواهید از تابعی استفاده کنید که در کلاس موجود نباشه٬ اول این ۲ تا متد اجرا میشند.(call برای توابع معمولی و callStatic برای توابع استاتیک)
برای مثال٬ کد زیر رو اجرا کنید:


<?php

Class One
{
    public static function __callStatic($method, $params)
    {
        echo "Called from magic Method: $method ";
    }

}

One::Two();
?>

با وجود اینکه ما تابع استاتیک Two رو نداریم اما باز هم بخاطر وجود callStatic__ این کد اجرا میشه.

حالا...
در فایل Illuminate\Database\Eloquent\Model ما متد استاتیک where رو نداریم. پس به متد callStatic__ پاس داده میشه.

    public static function __callStatic($method, $parameters)
    {
        return (new static)->$method(...$parameters);
    }

و نتیجش میشه چیزی شبیه به زیر:

$class->where($parameters)

سپس تابع معمولی where خوانده میشه٬ اما اون هم موجود نیست... پس به متد call__ پاس داده میشه.

و در این متد یه instance از Illuminate\Database\Eloquent\Builder ساخته میشه و اگر داخل این فایل رو چک کنید میبینید که متد where در واقع در این فایل هست و یک متد معمولیه و به همین علت ٬ شما به this$ دسترسی دارید.

موفق باشید.


Ali Ghaleyan
تخصص : برنامه نویس لاراول
@Serjik 5 سال پیش مطرح شد
0

@ali.bayat
آقای بیات واقعا ممنون دست شما درد نکنه :)
راستش این سوال خیلی وقت بود ذهن منو درگیر کرده بود
ممنون که وقتتون رو داید


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

ورود یا ثبت‌نام