PDA

View Full Version : سوال: چرا تو این کلاس مشخصات دیتابیس رو private گذاشته بعد تو فانکشن public؟



nekooee
دوشنبه 23 اردیبهشت 1392, 00:59 صبح
سلام دوستان.
کدهای یک کلاس برای ارتباط با دیتابیس اینجوری شروع شده:



<?PHP
//Copyright محمد مصطفي شهركي @ http://www.ncis.ir
require_once('config.php');

class Articles
{
private $host;
private $user;
private $pass;
private $db;

public function Articles()
{
global $host;
global $user;
global $pass;
global $db;
$this->host=$host;
$this->user=$user;
$this->pass=$pass;
$this->db=$db;
}

private function Connect()
{
mysql_connect($this->host,$this->user,$this->pass);
mysql_select_db($this->db);
mysql_query('SET NAMES \'utf8\'');
}



اینجا من تو مسئله private شدن و public شدن کلاس و فانکشنهای بعدش گیج شدم. میشه یکم کد رو برام توضیح بدید ؟

MostafaEs3
دوشنبه 23 اردیبهشت 1392, 01:13 صبح
تا اونجایی که میدونم ، Function ها و Property ها درکلاس سه حالت دارند ::

1- Public :: قابل فراخوانی و استفاده توسط خود کلاس ، فرزندان و آبجکت (بیرون از کلاس)
2- Protected :: قابل فراخوانی و استفاده توسط خود کلاس و فرزندان
3- Private :: قابل فراخوانی و استفاده فقط توسط خود کلاس

یک مثال برای پروپرتی ها ::


class Test {
public $var_1 = 1;
protected $var_2= 2;
private $var_3 = 3;

}

$test = new Test();
echo $test->var_1 . "\n <br />";
echo $test->var_2 . "\n <br />";
echo $test->var_3 . "\n <br />";

همونطور که میبینید در این مثال فقط مورد اول چاپ میشه و با رخ دادن خطای Fatal در مورد دوم ، اسکریپت درهمونجا متوقف میشه
-----------------------------
موفق باشید

nekooee
دوشنبه 23 اردیبهشت 1392, 01:20 صبح
خیلی ممنون. راستش من تعریف های اینها رو میدونم. اما از نظر استراتژی برنامه نویسی یکم گیج هستم.
اول متغیرهایی که می خواد در طول کلاس برای مقادیر اطلاعات ورود به دیتابیس استفاده کنه رو پریویت تعریف کرده و بهشون مقدارهای خارجی از فایل config و نسبت داده. خوب تا اینجا هدف این بوده که از این متغیرها فقط داخل کلاس استفاد بشه و بیرون ا زکلاس نیازی نداریم بهشون. به همین دلیل پریویت تعریف کرده. اما خود فانکشن ها چون بعدا بیرون از کلاس قرار هست فراخوانی بشن باید به صورت public بودن درسته؟ یعنی اگر فانکشن رو هم به صورت پریویت تعریف میکردیم دیگه نمیشده فانکشن رو از بیرون از کلاس فراخوانی کرد

درسته؟؟

اما اگر تابع کانکشن رو ابتدای هر تابع که نیاز به ویرایش دیتابیس داره داخل خود کلاس فراخوانی کنیم و تابعی که تغییرات ایجاد میکنه رو در فایلهای دیگه فراخوانی کنیم دیگه نیاز به پابلیک بودن تابع کانکشن نیست درسته؟ چون تابع کانکشن در این حالت دیگه مستقیم جای دیگه فراخوانی نمیشه و فقط داخل خود کلاس و تابع های داخل خود کلاس فراخوانی میشه
درسته؟

MMSHFE
دوشنبه 23 اردیبهشت 1392, 08:01 صبح
بله دقیقاً درست متوجه شدین. اما من متد Connect رو Public تعریف کردم تا اگه در جایی از پروژه خواستم فقط یک اتصال به دیتابیس داشته باشم و کار دیگری انجام ندم، این متد در دسترس باشه.