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

- 3 هفته پیش
توسط Ali Ghaleyan آپدیت شد
Ali Ghaleyan ( 2025 تجربه )
3 هفته پیش

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

بهترین پاسخ انتخاب شده توسط Ali Ghaleyan
علی بیات
3 هفته پیش

@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$ دسترسی دارید.

موفق باشید.

حسام موسوی ( 98109 تجربه )
3 هفته پیش

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

Ali Ghaleyan ( 2025 تجربه )
3 هفته پیش

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

علی بیات ( 41372 تجربه )
3 هفته پیش

@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 ( 2025 تجربه )
3 هفته پیش

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

Ali Ghaleyan ( 2025 تجربه )
3 هفته پیش

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

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

علی بیات ( 41372 تجربه )
3 هفته پیش

@alighalehban1379

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

Ali Ghaleyan ( 2025 تجربه )
3 هفته پیش

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

     } Class OtherClass 

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

@ali.bayat

علی بیات ( 41372 تجربه )
3 هفته پیش

@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 ( 2025 تجربه )
3 هفته پیش

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

علی بیات ( 41372 تجربه )
3 هفته پیش

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

<?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 ( 2025 تجربه )
3 هفته پیش

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

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

علی بیات ( 41372 تجربه )
3 هفته پیش

@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 ( 2025 تجربه )
3 هفته پیش

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

برای ارسال پاسخ باید وارد سایت شوید