تخفیف ویژه

مفهوم PHP Late Static Binding در زبان برنامه‌نویسی PHP

دسته بندی: آموزش
زمان مطالعه: 2 دقیقه
۰۱ مهر ۱۳۹۷

در این مقاله از سون‌لرن قصد داریم تا شما را با ویژگی PHP Late Static Binding (پی‌اچ‌پی لِیت استاتیک بایندینگ) آشنا کنیم که از نسخه‌ی 5.3 به PHP اضافه شده است.

مفهوم PHP Late Static Binding

اجازه دهید تا آموزش خود را با یک مثال ساده شروع کنیم. لطفاً به کد زیر نگاه کنید:

<?php
 
class Model{
 protected static $tableName = 'Model';
 public static function getTableName(){
 return self::$tableName;
 }
}
 
class User extends Model{
 protected static $tableName = 'User'; 
}

echo User::getTableName(); // Model, not User

اگر بخواهیم توضیحی درباره‌ی این کد PHP و مشکلی که در نبود PHP Late Static Binding وجود دارد، داشته باشیم:

  • ما یک کلاس با نام Model ایجاد کردیم که شامل پراپرتی استاتیک tableName$ با مقدار Model و متود استاتیک ()getTableName می‌شود. این متود، مقدار tableName$ را باز می‌گرداند. توجه داشته باشید که ما برای اینکه به پراپرتی استاتیک داخل کلاس Model در متود ()getTableName دسترسی داشته باشیم از self و اپراتور :: استفاده کردیم.
  • ما کلاس دیگری با نام User که فرزند کلاس Model است ساختیم. این کلاس نیز دارای پراپرتی استاتیک tableName$ اما با مقدار User می‌باشد.
  • در نهایت، ما متود ()getTableName را از کلاس User صدا می‌زنیم اما برخلاف انتظار، در خروجی به جای کلاس User کلاس Model صدا زده می‌شود. دلیل چنین اتفاقی این است که هنگامی که از کلیدواژه‌ی self استفاده می‌شود همیشه کلاسی صدا زده می‌شود که متود به آن کلاس تعلق دارد. به عبارت دیگر، اگر شما یک متود در کلاس والد تعریف کنید و آن را از کلاس فرزند صدا بزنید، بر خلاف انتظاری که دارید، آن متود به جای صدا زده شدن از کلاس فرزند، از کلاس والد صدا زده می‌شود.

برای حل این مشکل، از نسخه‌ی 5.3 در PHP یک ویژگی جدید با نام PHP Late Static Binding معرفی شده است که به جای استفاده از کلیدواژه‌ی self، شما می‌توانید از کلیدواژه‌ی static استفاده کنید تا به همان کلاس واقعی در زمان صدا زدن اشاره شود. اکنون اجازه دهید تا کد خود را ویرایش کنیم و نتیجه‌ی مورد انتظار خود را با استفاده از مفهوم PHP Late Static Binding در خروجی ببینیم:

<?php
 
class Model{
 protected static $tableName = 'Model';
 public static function getTableName(){
 return static::$tableName;
 }
}
 
class User extends Model{
 protected static $tableName = 'User'; 
}
 
echo User::getTableName(); // User

توجه داشته باشید که ::static تنها به متودها و پراپرتی‌های استاتیک اشاره می‌کند.

چه امتیازی به این مقاله می دید؟
نویسنده Alireza Najafipour

نظرات کاربران

اولین دیدگاه این پست رو تو بنویس !

ارسال دیدگاه
خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :