PDA

View Full Version : سوال: دسترسی به متغییر درون کلاس



newman2006006
شنبه 08 بهمن 1390, 17:12 عصر
با سلام ، در یک کلاس در یکی از متدها به یک متغییر مقدار داده ام حالا می خواهم خارج از کلاس به مقدار متغییر دسترسی پیدا کنم ، باید چکار کنم ؟

باتشکر

MMSHFE
شنبه 08 بهمن 1390, 17:20 عصر
یا اون متغیر رو از نوع public تعریف کنید و یا اینکه یک تابع public بنویسید که مقدار اون متغیر رو return میکنه و اون تابع رو خارج از کلاس صدا بزنید و خروجیش رو مورد استفاده قرار بدین. موفق باشید.

newman2006006
شنبه 08 بهمن 1390, 17:29 عصر
تشکر از جوابتان اینکار را کردم اما چیزی خروجی نداد و مقدار null داشت ، البته من در همان قسمت یک بار دیگه از کلاس استفاده کردم ، ممکنه مشکل از آن باشد

MMSHFE
شنبه 08 بهمن 1390, 17:47 عصر
میشه کدتون رو بگذارین؟

newman2006006
شنبه 08 بهمن 1390, 17:50 عصر
دوست عزیز با تشکر ، مشکلم حل شد .
می گم شاید بدرد کسی خورد
یک متغییر بیرون کلاس مقدار اولیه دادم و در کلاس با کلمه global تعریف و مقداردهی کردم و دوباره خارج از کلاس به مقدار آن دسترسی پیدا کردم .

باتشکر از شما دوست عزیز

MMSHFE
شنبه 08 بهمن 1390, 17:56 عصر
هرچند این روش خیلی اصولی نیست ولی درهرحال خوشحالم مشکلتون برطرف شده. موفق باشید.

2okeee
دوشنبه 10 بهمن 1390, 02:23 صبح
یا اون متغیر رو از نوع public تعریف کنید و یا اینکه یک تابع public بنویسید که مقدار اون متغیر رو return میکنه و اون تابع رو خارج از کلاس صدا بزنید و خروجیش رو مورد استفاده قرار بدین. موفق باشید.

سلام

یک مثال قرار میدهید ؟؟

MMSHFE
دوشنبه 10 بهمن 1390, 07:27 صبح
مثال 1 (تعریف متغیر public) :


class Test {
public $var;

public function Test() {
$this->var = 0;
}

public function MakeRand() {
$this->var = rand();
}
}
// Usage:
$t = new Test();
$t->MakeRand();
echo $t->var;

مثال 2 (تعریف متغیر private و تابع public برای بازگرداندن مقدار) :


class Test {
private $var;

public function Test() {
$this->var = 0;
}

public function MakeRand() {
$this->var = rand();
}

public function GetVar() {
return $this->var;
}
}
// Usage:
$t = new Test();
$t->MakeRand();
echo $t->GetVar();

مزیت روش دوم در اینه که بیرون از کلاس نمیشه مقدار var$ رو تغییر بدیم چون private هست و تابعی هم برای تغییر مقدارش ننوشتیم. درنتیجه میتونیم مطمئن باشیم همیشه مقداری که مدنظر ماست داخلش هست. برای مثال، توی روش اول، کد زیر هم مجازه:


$t->var = -5;

که ممکنه برحسب نیاز ما، یک مقدار نامعتبر باشه. مثلاً ما میخواستیم یک عدد تصادفی مثبت داشته باشیم.
موفق باشید.

plague
یک شنبه 23 بهمن 1390, 15:51 عصر
ممکنه یک نمونه از سواستفاده هایی که از public بودن متغییر ممکنه انجام بشه مثال بزنید ؟
من همیشه پابلیک استفاده میکنم و داده هایی رو که از یوزر میگیرم قبل از رختن توی متغیر اعتبار سنجی میکنم

MMSHFE
یک شنبه 23 بهمن 1390, 16:26 عصر
وقتی یک عنصر public باشه، هیچ کنترلی روی مقدارش ندارین یعنی اینکه هر بخشی از کد که امکان مشاهده اون رو داشته باشه، قابلیت ویرایشش رو هم خواهد داشت. درنتیجه ممکنه مقداری بهش داده بشه که درست نباشه. مثلاً فرض کنید کلاسی نوشتین که مختصات یک نقطه رو در صفحه نگهداری میکنه. خوب فرضاً اگه مؤلفه x اون رو public بگذاریم و کسی بیاد و مقدار 5- بهش بده، ازنظر دستور زبان درسته ولی ازنظر کد شما این مقدار منطقی نیست چون نقطه ای با مختصات x=-5 نداریم! بنابراین، راه منطقیش اینه که اون رو private کنیم و یک تابع public بسازیم که کار مقداردهی اون رو به شکل درست و بعد از چک کردن اعتبار مقدار موردنظر، انجام بده. اینطوری نیاز نیست هربار میخواین مقداردهی کنید، اعتبارسنجی هم انجام بدین. کافیه مقدارتون رو به اون تابع بفرستین و اون خودش بعد از اعتبارسنجی، مقداردهی رو انجام خواهد داد. مزیت اصلی این روش در کارهای تیمی هست که در اون، شما یک کلاس برای انجام کاری مینویسید و بقیه اعضای تیم از اون کلاس استفاده میکنن. طبیعتاً چون اونها خودشون کلاس رو ننوشتن، زیاد جالب نیست که ازشون بخوایم اعتبارسنجی رو خودشون انجام بدن چون کلی باید توضیح بدیم تا تازه بفهمن چه مقادیری برای کلاس مجازه و چه مقادیری غیرمجاز و بعد هم هربار بخوان مقداردهی کنن این اعتبارسنجی هم باید انجام بشه. باید عادت کنیم کلاسهایی بنویسیم که کامل باشن و خودشون حتی الأمکان جلوی خطاهای منطقی رو بگیرن نه اینکه از بیرون یک منطق کنترلی براش بگذاریم.
تازه این فقط بخشی از ماجراست. فرض کنید شما یک کلاس برای استخراج اسامی برندگان قرعه کشی بانک از دیتابیس نوشتین. خوب آرایه حاوی اسامی برندگان رو اگه public کنیم، هرکسی از اعضای تیم به راحتی میتونه اسم خودش رو هم جزو برندگان اضافه کنه برای رفع این مشکل، اون آرایه رو private میکنیم و فقط تابع استخراج از دیتابیس رو بصورت public مینویسیم و اصلاً تابعی برای نوشتن توی اون آرایه نمیگذاریم. از اونجا که آرایه private هست و تنها راه public هم برای دسترسی به آرایه، اون رو بصورت فقط خواندنی در اختیارمون میگذاره، خیالمون راحته که الکی کسی جزو برندگان قرار نگیره. عکس این قضیه هم صادقه یعنی ممکنه بعضی جاها بخوایم یک مقدار فقط نوشتنی داشته باشیم یا اصلاً یک مقداری داشته باشیم که داخل کلاس بهش نیاز داریم و بیرون اصلاً باهاش کاری نداریم. مثلاً یک تابع که کار اتصال به دیتابیس رو انجام میده. میتونیم بصورت private اون رو تعریف کنیم و داخل کلاس هرجا میخوایم ازش استفاده کنیم ولی از بیرون، دیده نمیشه.
موفق باشید.