عرض سلام و ادب
میشه مثال کاربردی بزنید که کجا میتونیم از self و کجا از static استفاده کنیم؟
درود
به این مثال دقت کنید
<?php
class Model
{
protected static $tableName = 'Model';
public static function getTableName()
{
return self::$tableName;
}
}
ما یک کلاس داریم به اسم Model (مدل ها توی معماری mvc برای ارتباط با دیتابیس استفاده میشن) که داخلش یه پراپرتی به نام tableName وجود داره که نام جدول رو داخل خودش داره به شکل static هم هست.
حالا ما یه تابع static به اسم getTableName داریم که نام جدول رو از همون پراپرتی که بالاتر تعریف کردیم با استفاده از self که به همون کلاس اشاره میکنه دریافت میکنیم.
اگه ما متد getTableName رو صدا بزنیم به ما چی برمیگردونه؟
echo Model::getTableName(); // Model
اگه ما این متد رو صدا بزنیم طبق چیزی که انتظار داشتیم به ما Model رو برمیگردونه
حالا شما فرض کنید که ما یه مدل دیگه میخوایم بسازیم برای کاربرانمون و از این مدل میخوایم ارث بری کنیم تا بتونیم از پراپرتی و متدهایی که داخلش داری استفاده کنیم
class User extends Model
{
protected static $tableName = 'User';
}
من الان داخل مدل User اومدم برای خودم tableName رو تغییر دادم و طبیعی هم هستش چون نام جدول من فرق میکنه و اینجا اسم User هستش. حالا بیایید ما این بار تابع getTableName رو که داخل Model بود و ازش ارث بری کردیم رو روی مدل User صداش بزنیم
echo User::getTableName(); // Model
این دفعه هم به ما Model برگردوند اما ما در حقیقت اسمش رو تغییر داده بودیم، چرا این اتفاق افتاد؟
دقیقا به خاطر اینکه ما از self استفاده کردیم چون self به کلاسی که داخل هست اشاره میکنه ن به کلاسی کنونی که ارث بری شده.
حالا برای اینکه این مشکل بر طرف بشه میتونم از کلمه کلیدی static استفاده بکنم تا به کلاسی جاری اشاره بکنه ن کلاسی که فقط داخلش تعریف شده. محتوای داخل متد getTableName رو شکل زیر تغییر میدم
public static function getTableName()
{
return static::$tableName;
}
میبینید که به جای self الان از static استفاده کردیم، یه بار دیگه چاپ کنیم ببینیم نتیجه چی میشه
echo User::getTableName(); // User
این دفعه من از کلاس User متد رو صدا زدم و به من User برگدوند چون کلمه کلیدی static داره به کلاس کنونی اشاره میکنه ن کلاسی که داخلش تعریف شده