دسته بندي ها

جستجو

لينک هاي روزانه

جعبه پیام




امکانات


آرشيو

خبرنامه

آمار

آنلاین : 1
بازدید امروز : 4
بازدید دیروز : 11
بازدید هفته گذشته : 38
بازدید ماه گذشته : 140
بازدید سال گذشته : 2193
کل بازدید : 10195

لينک دوستان


1
class Database
2
{
3
….
4
public function select($query)
5
{
6
// کدهاي مربوط به تابع
7
}
8
}
مقادير از ديتابيس مينويسيد.خب همينطور که ميدونيد بقيه اعضاي تيم بايد از اين متد استفاده کنن.اما يک تابع
مينويسيد تا قبل از اجراي دستور select چک کنه که آيا جدول مورد نظر در ديتابيس وجود داره يا خير؟

1
function table_exists($table)
2
{
3
///
4
}
تابع table_exists تابعي هست که نبايد توسط بقيه استفاده بشه و فقط بايد توسط متدهاي اصلي کلاس
 استفاده بشن.يعني در متد select قبل از اجراي کوئري طراحی وب سایت مورد نظر چک کنه که آيا جدول مورد نظردر ديتابيس 
وجود داره يا خير اگر نبود پيغام خطا بده :

1
function select()
2
{
3
if($this->table_exists($table))
4
{
5

6
}else
7
{
8
return false;
9
}
10
}
منظور من از مثال بالا اين بود که در برنامه نويسي شيء گرا بايد بعضي از متدها و متغيرهاي کلاس رو از ديد بقيه 
کساني که از کلاس ما(که شامل بقيه کلاسها هم ميشه) استفاده ميکنن مخفي نگه داريم تا نتونن توي مقادير
 و نحوه کار کرد کلاس خواسته يا ناخواسته خلل ايجاد کنن.

براي همين در شيء گرايي مفهومي ارايه شد به نام encapsulation که جدا از معني لغوي اين کلمه به نحوه
 دسترسي اعضاي کلاس شامل متد ها و متغير ها ، در خارج کلاس رو تعريف ميکنه.

در برنامه نويسي شيء گرا سه نوع نحوه دسترسي داريم :

Public

Private

Protected

در ادامه به توضيح هر کدوم از اينها ميپردازيم.

Public

کلاسهايي که ما مينويسيم در اکثر موارد بايد شامل متدها و متغيرهايي باشن تا در خارج از کلاس بتونيم 
بهشون دسترسي داشته باشيم.بهتره با يک مثال بريم جلو .

کلاس ديتابيس رو در نظر بگيريد.متد select متدي هست که بايد در خارج از کلاس بهش دسترسي داشته باشيم.
منظور از خارج از کلاس بقيه کاربران يا کلاسهايي هستند که ميخوان از کلاس ما استفاده کنن. براي دسترسي به 
يک متغير يا تابع درخارج از کلاس بايد از کلمه کليدي public استفاده کنيم :

1
class Database
2
{
3
public function select()
4
{
5
///codes
6
}
7
}
هنگامي که از کلمه کليدي public قبل از function استفاده ميکنيم به محيط خارج از کلاس اجازه ميديم که به متد 
ما دسترسي داشته باشن.

1
include 'database.php';
2
$db = new Database();
3
$db->select();
با اجراي کد بالا ميبينيد که کلاس Database اجازه دسترسي به متد select رو به شما ميده.

چون متد select به صورت public يا عمومي تعريف شده.

Private

در مثال اول ديديم که کاربران يا کلاسهاي ديگه نبايد به بعضي از متدها و متغيرهاي کلاس ما دسترسي داشته باشن
.به همين منظور بايد توابع و متغيرهامون رو به صورت private يا خصوصي تعريف کنيم تا فقط در داخل کلاس بشه
ازشون استفاده کرد.

1
class Database
2
{
3
public function select()
4
{
5
///codes
6
}
7
private function table_exists($table)
8
{
9
///
10
}
11

12
}
در کد بالا تابع table_exists در خارج از کلاس در دسترس نيست و با اجراي کد زير پيغام خطا دريافت خواهيد کرد:

1
include 'database.php';
2
$db = new Database();
3
$db->table_exists('users');
Protected

در مبحث ارث بري از اين نوع نحوه دستري زياد استفاده ميشه.پس بيايد ابتدا مروري بر ارث بري داشته باشيم
تا کاربرد protected رو بيشتر متوجه بشيم.

ارث بري

در يک پروژه تيمي قسمتي از پروژه که بايد توسط شما آماده بشه گاهي اوقات ممکنه فقط شامل سک کلاس باشه ي
ا ميتونه از چندين کلاس مختلف تشکيل بشه. در يک سيستم پيشرفته (وحتي متوسط) به شما ميگن بايد بخش 
ديتابيس رو بنويسيد.(هي نگين گير داده به ديتابيس به خاطر اين ميگم ديتابيس که ميدونم همه باهاش کار کردين 
و تصورش براتون راحت تره و کاربردي هم هست ;) ).ممکنه بخش ديتابيس يک سايت از چند کلاس مختلف تشکيل 
شده باشه.يک کلاس براي ساخت خودکار کوئري ها ، يکي براي اجراي کوئري ها ، يکي براي مديريت خطاها و …

در اين سيستم يک کلاس براي اجراي کوئري ها مثلا با نام Database مينويسيم.براي استفاده از اين کلاس دو راه داريم:

?- در هر جاي پروژه که بخوايم يک کوئري خاص رو اجرا کنيم بايد يک شيء از اين کلاس بسازيم بعد کوئري مورد نظر
 رو بهش پاس بديم تا اجرا بشه.

?- يک کلاس بنويسيم با نام Users که از کلاس Database ارث بري کنه.سپس به واسطه کلاس Users به متدهاي
کلاس Database دسترسي پيدا کنيم.

شايد بپرسيد که چه فرقي داره؟ در روش دوم هم ما بايد هر طراحی وب سایت جا تو پروژه نياز داشتيم از کلاس Users يک شيء بسازيم
. اما نکته اي که هست اينه که ما ميتونيم به واسطه کلاس Users يه سري تنظيمات رو فقط يکبار تعريف کنيم. با 
مثال بيشتر متجه ميشيد.

روش اول :

کلاس Database

1
class Database
2
{
3
private $table;
4
private $primary_key;
5
public function __construct($table , $pk)
6
{
7
$this->table = $table;
8
$this->primary_key = $pk;
9
}
10

11
public function exec($query)
12
{
13

14
// کدهاي مربوط
15
}
16
}
در روش اول براي هر بار اجراي يک کوئري بايد ابتدا نام جدول سپس کليد اصلي جدول رو تنظيم کنيم :

1
include 'database.php';
2
$db = new Database('users' , 'user_id);
روش دوم :

کلاس Database رو مثل قبل مينويسيم با اين تفاوت که نوع متغيرهاي $table , $primary_key رو از نوع protected ميزاريم
 که بتونيم در کلاس فرزند بهشون مقدار بديم  :

1
class Database
2
{
3
protected $table;
4
protected $primary_key;
5
public function __construct($table , $pk)
6
{
7
$this->table = $table;
8
$this->primary_key = $pk;
9
}
10

11
public function exec($query)
12
{
13

14
// کدهاي مربوط
15
}
16
}
در روش دوم بايد يک مرحله بيشتر انجام بديم. در اين روش بايد براي هر جدول در ديتابيس يک کلاس جدا
بسازيم مثلا کلاس Users که بايد از کلاس Database ارث بري کنه (با استفاده از کلمه کليدي extends ):

1
class Users extends Database{
2
<pre> protected $table = &#039;users&#039;;
3
protected $primary_key = &#039;user_id&#039;;</pre>
4
}
بيايد مزاياي روش دوم رو بررسي کنيم.

فرض کنيد شما در پروژه ??? بار به ديتابيس متصل ميشيد و جدول users رو دستکاري ميکنيد. ممکنه در آينده نام 
جدول يا نام کليد اصلي جدول رو بخوايد تغيير بديد. اگر از روش اول استفاده کنيد :

1
include 'database.php';
2

3
$db = new Database
4

5
('users' , 'user_id);
بايد همه جاهايي که کد بالا رو نوشتيد پيدا کنيد و تغييرش بديد.اما در روش دوم در صورتي هر تغييري در ديتابيس
 اجام بشه و نام فيلد اصلي و جدول تغيير کنه فقط با يکبار تغيير در کلاس Users ميتونيد توي کل پروژه اين تغيير 
رو اعمال کنيد.ميبينيم روش دوم يکي از مزاياي شيء گرايي که ” نگهداري و توسعه آسان ” هست رو در اختيار ما ميذاره.

بحث ارث بري يکي از شيرين ترين بحثهاي برنامه نويسي شيء گراست.تا اينجا رو گفتم که با مفهومش آشنا بشيد 
و کاربردش رو ببينيد به اميد خدا حتما در يک پست جدا در موردش صحبت ميکنيم.

حالا ببينيم کاربرد Protected در برنامه نويسي شيء گرا کجاست.

Protected به کلاسهاي فرزند اجازه استفاده از توابع و متغيرها رو ميده اما در خارج از کلاس اين اجازه داده نميشه.

يک مثال از دنياي واقعي : توي يک خانواده پدر ، مادر ، پسر ، دختر هستند.ممکنه در اين خانواده دختر و پسر
از پدرشون به خاطر بعضي مسايل انتقاد کنن.اما همين پسر و دختر به کسي که خارج از اعضاي خانواده است اجازه 
انتقاد از پدرشون رو نميدن.يعني فقط پسرو دختر و مادر حق انتقاد از پدر رو دارن.پس توي يک خانواده 
” انتقاد از پدر” به صورت protected تعريف شده و اگر کسي خارج از خانواده از پدر انتقاد کنه با کتک (پيغام خطا) مواجه ميشه.

اين بحث هم به پايان رسيد.اميد وارم خوب توضيح داده باشم و مفهوم رو رسونده باشم.به هر حال چيزي که توي آموزش PHP مد نظرم هست اينه که مفهوم رو بفهميد و سعي کنيد خودتون رو درگير اصطلاحات مختلف نکنيد.برنامه نويسي شيء گرا واقعا لذت بخشه.
نوشته شده در دوشنبه 18 شهريور 1392 ساعت 12:22 توسط : padideh | دسته : | 198 بازدید
  • []


  • سفارش تبليغات
    سفر به ترکیه | فرش کاشان | آژانس هواپیمایی | منزل مبله در شیراز | کفسابی | هتل و اقامت | آموزش بازاریابی | میز کانتر | گیت کنترل تردد | نوبت دهی پزشکان شیراز | پاپ آپ نمایشگاهی | دکتر نوروزیان | منزل مبله شیراز | طلایاب | سفر به تایلند| ثبت شرکت | راهنمای سفر | سفر به گرجستان | سفر به روسیه | منزل مبله | فلزیاب | محمد دبیری
    X
    تبليغات