🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ نیما جهان بخشیان
مشکل در ::static
امیر صالحی حل شده توسط امیر صالحی

سلام خسته نباشید

امکانش هست که در مورد  ::static 

توضیحاتی بدید و یا منبعی معرفی کند

چیز زیادی نتونستم در این مورد پیدا کنم

سلام و احترام

به طور کلی اکه بخوام به شما توضیح بدم که static دقیقا چی کار میکنه، static این امکان رو به ما میده تا بدون اینکه از یه شئ ای، یه آبکجت بسازیم به یک یا چند تا پراپرتی یا متد دسترسی داشته باشیم، برای مثال

<?php
class Foo {
    public static function aStaticMethod() {
        // ...
    }
}

من برای اینکه متد داخل کلاس بالا صدا بزنم دیگه نیازی به ساختن شئ از اون کلاس ندارم، میبینید که کلمه کلید static بعد از public استفاد شده:

Foo::aStaticMethod();

یا مثلا پراپرتی که به شما گفتم:

Example #2 Static property example
<?php
class Foo
{
    public static $my_static = 'foo';
    public function staticValue() {
        return self::$my_static;
    }
}

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

Foo::$my_static 

https://www.w3schools.com/php/php_oop_static_properties.asp

https://www.php.net/manual/en/language.oop5.static.php

 

امیر صالحی ۲۲ فروردین ۱۴۰۰، ۱۸:۴۸

ممنون و تشکر از شما
مفهوم کلمه کلیدی   static میدونم 
من  ::static رو نمیدونم که چرا و کجا باید استفاده بشه 
مثل کد زیر


class Queue
{
   private static $instance;
   public static function getInstance()
   {
       if (static::$instance === null) {
           static::$instance = new Queue();
       }
       return static::$instance;
   }
}
نیما جهان بخشیان ۲۲ فروردین ۱۴۰۰، ۱۹:۱۵

قبل از اینکه بریم کد زیر رو برسی کنیم، کد شما داخل اون کلاس داخل متد‌ها و پراپرتی‌های static رو صدا میزنه که کاملا مشخصه

به کد زیر دقت کنید

<?php
    class Car
    {
        public static function run()
        {
            return static::getName();
        }
        private static function getName()
        {
            return 'Car';
        }
    }
    class Toyota extends Car
    {
        public static function getName()
        {
            return 'Toyota';
        }
    }
    echo Car::run(); // Output: Car
    echo Toyota::run(); // Output: Toyota
?>

شما فرض کنید که داخل دو تا کلاس متفاوت دوتا متد هم نام که static هستند رو دارید

توی کلاس Car که ما متد getName داریم، وقتی این متد رو صدا میزنیم کاملا مشخصه که خروجی ما Car هستش و اگه متد run رو هم صدا بزنیم خروجی ما Car هستش

 اما وقتی ما برای مثال توی کلاس Toyota اومدیم و کلاس Car رو ارث بری کردیم و چون متد run بین این دو مشترکه و دو تا متد دقیقا مثل هم به اسم getName وجود داره خروجی‌ها متفاوته، اما چرا؟

وقتی ما اومدیم داخل متد run متد getName به این شکل static::getName() صدا زدیم اومدیم گفتیم که اون getName رو فراخوانی کن که متعلق به همون کلاسه

ینی اینکه من وقتی متد run رو از Car صدا میزنم میره متد getName همون کلاس رو صدا میزنه و وقتی متد run رو توی کلاس Toyota صدا میزنم میره متد getName کلاس خود Toyota رو صدا میزنه

به این موضوع Late static binding گفته میشه

 

بهترین پاسخ
امیر صالحی ۲۳ فروردین ۱۴۰۰، ۱۶:۰۶