سلام
در لاراول اگر دقت کرده باشید function where خودش استاتیک نیست ولی میشه ازش استفاده کرد
اما آبجیک های دیگه هم که داخل تابع where ازش استفاده میشه هم استاتیک نیست اما کار میکنه
به صورت معمولی در پی اچ پی وقتی بخواهیم این کار رو انجام بدیم ارور میده و $this ارور میده
توابع لاراول چطور این اجازه میدن و درست کار میکنن؟
سوالتون٬ سوال بسیار خوبیه...
برای درک بهتر این موضوع٬ به ۲ تابعی که داخل همین بحث براتون توضیح دادم دقت کنید:
. اینها 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
سلام آقا خسته نباشید
آقای موسوی نمونه کد دارید ازش
میشه بگید چطور همچین چیزی انجام میده دقیق تر
@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);
}
اولی برای متدهای عادی و دومی برای متدهای استاتیک استفاده میشه.
بزارید دقیق تر توضیح بدم
من یه کلاس تعریف کردم برای مثال به اسم پست و داخلش یه متد به اسم ایندکس ساختم و داخل متد از یک کلاس دیگه به شکل استاتیک و از متد ایندکسی که داخلش هست استفاده کردم
داخل کلاس دوم و متدی که نام برده شده از ابجکتها یا متدهایی که داره میخوام استفاده کنم طوری که اون ابجکت ها و متد ها ویژگی استاتیک نداشته باشن و همچنین اینکه با استفاده از this$ صدا زده بشن همینطور که داخل متد where لاراول از کوئری با استفاده از this$ نام برده...
ببینید this$ در واقع به کلاسی اشاره میکنه که شما در حال کارکردن باهاش هستید. در صورت امکان توضیح بدید شما قصد انجام چه کاری رو دارید؟ یا کدتون رو به اشتراک بذارید
}Class post
}()Public function index
;()OtherClass::index
{
{
} Class OtherClass
;'Public $name='name
}()Public function index
;Echo $this->name
{
{
@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();
من از ایندکس استفاده میکنم هیچ مشکلی نداره
(new OtherClass)->index();
اینجا که شما اینطوری فراخونیش کردین میخوام به صورت استاتیک باشه طوری که بقیه ی کدا عوض نشن فقط این تکه کد رو عوض کنید
در اون حالت کد زیر:
<?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.bayat
سلام و درود اقای بیات
ممنون از راهنماییتون
ولی سوال من اینه که داخل تابع where لارول رو اگه نگاه کنید ، خود where به صورت استاتیک صدا زده میشه اما داخلش $this استفاده شده
حتما نگاه کنید... سوالم اینه چطوری این اتفاق افتاده
داخل کدی که شما فرستادین تابع و ابجکت کلاش otherClass رو استاتیک کردین اما داخل where لاراول همیچین اتفاقی نیفتاده
سوالتون٬ سوال بسیار خوبیه...
برای درک بهتر این موضوع٬ به ۲ تابعی که داخل همین بحث براتون توضیح دادم دقت کنید:
. اینها 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.bayat
آقای بیات واقعا ممنون دست شما درد نکنه :)
راستش این سوال خیلی وقت بود ذهن منو درگیر کرده بود
ممنون که وقتتون رو داید
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟