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

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

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


ثبت پرسش جدید
علی بیات
علی بیات
تخصص :توسعه دهنده ارشد وب
@ali.bayat7 سال پیشمطرح شد
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$ دسترسی دارید.

موفق باشید.


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

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


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

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


علی بیات
علی بیات
تخصص :توسعه دهنده ارشد وب
@ali.bayat7 سال پیشمطرح شد
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
Ali Ghaleyan
تخصص :برنامه نویس لاراول
@Serjik7 سال پیشمطرح شد
0

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


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

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

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


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

@alighalehban1379

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


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

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

     } Class OtherClass 

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

@ali.bayat


علی بیات
علی بیات
تخصص :توسعه دهنده ارشد وب
@ali.bayat7 سال پیشمطرح شد
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
Ali Ghaleyan
تخصص :برنامه نویس لاراول
@Serjik7 سال پیشمطرح شد
0

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


علی بیات
علی بیات
تخصص :توسعه دهنده ارشد وب
@ali.bayat7 سال پیشمطرح شد
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
Ali Ghaleyan
تخصص :برنامه نویس لاراول
@Serjik7 سال پیشمطرح شد
0

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

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


علی بیات
علی بیات
تخصص :توسعه دهنده ارشد وب
@ali.bayat7 سال پیشمطرح شد
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
Ali Ghaleyan
تخصص :برنامه نویس لاراول
@Serjik7 سال پیشمطرح شد
0

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


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

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