به طور کلی اکه بخوام به شما توضیح بدم که 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;
}
}
خیلی ساده میتونیم اون پراپرتی رو به شکل زیر صداش بزنیم:
ممنون و تشکر از شما مفهوم کلمه کلیدی 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 رو صدا میزنه