کاربرد Late Static Binding کجاست؟

پرسیده شده
فعالیت 967 روز پیش
دیده شده 395 بار
0

عرض سلام و ادب

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

 

فایل پیوست

پویا پارسایی
پویا پارسایی

17 شهریور 00

1
حذف شده

درود

به این مثال دقت کنید

<?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 داره به کلاس کنونی اشاره میکنه ن کلاسی که داخلش تعریف شده

فایل پیوست

امیر صالحی

توسط

امیر صالحی

17 شهریور 00