PDA

View Full Version : نوع خاصی از ارث بری در کلاس و عدم توانایی ست کردن مقدار در آن



leaping
چهارشنبه 23 دی 1394, 10:51 صبح
سلام میخواستم بدونم توالی ارث بری در کلاس های زیر چرا امکان پذیر نیست برای ست کردن مقدار
میشه فقط متدها و پراپرتی ها رو برای اجرا صدا کرد نمیشه به پراپرتی ها مقدار داد؟
دلیلش رو کسی میتونه توضیح بده و امکانی برای انجام این کار وجود داره؟

این یه نمونش:


class class1{ public $value = 'value1'; public function SetValue($value) { $this->value = $value; }}

class class2{ public function DoIt() { return new class1(); }}
$class2 = new class2();$class2->DoIt()->SetValue('value2');echo $class2->DoIt()->value;

اینم نمونه دیگش:



class class1{ public $value = 'value1';}

class class2{ public function DoIt() { return new class1(); }}
$class2 = new class2();$class2->DoIt()->value = 'value2';echo $class2->DoIt()->value;

charcharkh
چهارشنبه 23 دی 1394, 11:11 صبح
فکر کنم برای این کار از clone باید استفاده میکردی اینو ببین


$sample1 = new stdClass();
$sample1->name = "Hasin";
$sample2 =clone $sample1;
$sample2->name = "Afif";
echo $sample1->name;

The output now would be Hasin.

بعدش شما داری خودتون میگی ارث ولی هیچ نشانی از extend بنده توی کدهای شما ندیدم.

پیشنهاد میدم کتاب OO Programming with PHP5 رو اگر نخوده اید مطالعه بفرمایید. خیلی خوبه البته بعضی چیزاش خیلی شاید بدرد همه کس نخوره ولی مطالب فوق العاده ای داره :چشمک:

نمیدونم تونستم کمکی کنم یا نه.

0xEHSAN
چهارشنبه 23 دی 1394, 11:21 صبح
درود دوست عزیز مشکل کد شما اینجاست که هر دفعه DoIt رو صدا میکنید یک کلاس جدید ایجاد میشه و در اینجا
$class2->DoIt()->SetValue('value2');شما کلاس برای نمونه $class1step1 رو ساختید و در کد
echo $class2->DoIt()->value;شما کلاس نمونه $class1step2 رو فراخوانی کردید اسم کلاس ها الکی برای مثال گفتمشون من فکر کردم تنها من کم حواسم :)

leaping
چهارشنبه 23 دی 1394, 11:56 صبح
فکر کنم برای این کار از clone باید استفاده میکردی اینو ببین


$sample1 = new stdClass();
$sample1->name = "Hasin";
$sample2 =clone $sample1;
$sample2->name = "Afif";
echo $sample1->name;

The output now would be Hasin.

بعدش شما داری خودتون میگی ارث ولی هیچ نشانی از extend بنده توی کدهای شما ندیدم.

پیشنهاد میدم کتاب OO Programming with PHP5 رو اگر نخوده اید مطالعه بفرمایید. خیلی خوبه البته بعضی چیزاش خیلی شاید بدرد همه کس نخوره ولی مطالب فوق العاده ای داره :چشمک:

نمیدونم تونستم کمکی کنم یا نه.

دوست عزیز ارث بری همیشه به معنای extend شدن نیست.

leaping
چهارشنبه 23 دی 1394, 11:59 صبح
درود دوست عزیز مشکل کد شما اینجاست که هر دفعه DoIt رو صدا میکنید یک کلاس جدید ایجاد میشه و در اینجا
$class2->DoIt()->SetValue('value2');شما کلاس برای نمونه $class1step1 رو ساختید و در کد
echo $class2->DoIt()->value;شما کلاس نمونه $class1step2 رو فراخوانی کردید اسم کلاس ها الکی برای مثال گفتمشون من فکر کردم تنها من کم حواسم :)
خب معلومه با هر بار فراخوانی DoIt میخوام یه کلاس ساخته بشه
مشکل من اینجاست که میخوام بهش مقدار بدم.
ممنون از پیگیریتون دوستان

0xEHSAN
چهارشنبه 23 دی 1394, 12:25 عصر
عذر خواهی میکنم کامل نخوندم
برای ست کردن مقدارمیشه فقط متدها و پراپرتی ها رو برای اجرا صدا کرد نمیشه به پراپرتی ها مقدار داد؟دلیلش رو کسی میتونه توضیح بده و امکانی برای انجام این کار وجود داره؟چونکه اینا فقط قابلیت برگرداند دارند و یکطرفه هستند ساز و کار پی اچ پی رو نمیدونم ولی تو برنامه های ویندوزی و یا اسمبلی متدها آدرس های هستن از یک قطعه, که ادامه اجرای برنامه رو به اون قسمت از کد میبرن و عملیات ها یا کدهای اون قسمت اجرا میشه یا بدون نتیجه و یا اینکه نتیجه تو رو ثبات ها بر میگردونن و واسه همین نمیشه بهشون مقدار داد البته این خودش یک مزیت هست

leaping
چهارشنبه 23 دی 1394, 12:37 عصر
عذر خواهی میکنم کامل نخوندمچونکه اینا فقط قابلیت برگرداند دارند و یکطرفه هستند ساز و کار پی اچ پی رو نمیدونم ولی تو برنامه های ویندوزی و یا اسمبلی متدها آدرس های هستن از یک قطعه, که ادامه اجرای برنامه رو به اون قسمت از کد میبرن و عملیات ها یا کدهای اون قسمت اجرا میشه یا بدون نتیجه و یا اینکه نتیجه تو رو ثبات ها بر میگردونن و واسه همین نمیشه بهشون مقدار داد البته این خودش یک مزیت هست
دوست عزیز این کلاسها اگه به صورت مستقیم فراخوانی بشن میشه مقدار دهی داد و این یک چیز معمول هست توی برنامه نویسی شی گرا وگرنه دیگه خاصیتشو از دست میده این موضوع

0xEHSAN
چهارشنبه 23 دی 1394, 15:52 عصر
درود پس هنوز من قضیه رو نگرفتم

H:Shojaei
چهارشنبه 23 دی 1394, 19:09 عصر
اینطوری جواب میده:
دلیل این هم که اونطوری جواب نمیداد فک کنم اینه که شما وقتی یه کلاس تو یه تابع از کلاس دیگه میسازید خوب تو کلاس دوم تعریف نکردید که نوع کلاسی که صدا میزنید چیه public or private شما فقط ساختید و ببرگردوندینش! واسه همین هم نوع پیشفرض میگیره یعنی private... (البته اینو از چیزی که خودم حدس میزنم و با عقلم جور در میاد میگم جایی نخوندم!)



class class1{ public $value = 'value1'; public function SetValue($value) { $this->value = $value; }} class class2{ public $a; function class2() { $this->a=new class1(); } public function DoIt() { return $this->a;}}$class2 = new class2();$class2->DoIt()->SetValue('value2');echo $class2->DoIt()->value;

leaping
چهارشنبه 23 دی 1394, 19:24 عصر
اینطوری جواب میده:
دلیل این هم که اونطوری جواب نمیداد فک کنم اینه که شما وقتی یه کلاس تو یه تابع از کلاس دیگه میسازید خوب تو کلاس دوم تعریف نکردید که نوع کلاسی که صدا میزنید چیه public or private شما فقط ساختید و ببرگردوندینش! واسه همین هم نوع پیشفرض میگیره یعنی private... (البته اینو از چیزی که خودم حدس میزنم و با عقلم جور در میاد میگم جایی نخوندم!)



class class1{ public $value = 'value1'; public function SetValue($value) { $this->value = $value; }} class class2{ public $a; function class2() { $this->a=new class1(); } public function DoIt() { return $this->a;}}$class2 = new class2();$class2->DoIt()->SetValue('value2');echo $class2->DoIt()->value;

ممنون از جوابتون
بعید میدونم از اون باشه
چون پراپرتی $a که تو class2 تعریف شده اگه private هم باشه باز عمل میکنه
به هر ترتیب ممنون از جوابتون
باید بفهمم قضیه چی به چیه

0xEHSAN
چهارشنبه 23 دی 1394, 22:36 عصر
من دیگه حرفی ندارم :)http://upload7.ir/u/action?q=download&filename=67Dwtkbh.PNG

H:Shojaei
پنج شنبه 24 دی 1394, 12:26 عصر
سلام میخواستم بدونم توالی ارث بری در کلاس های زیر چرا امکان پذیر نیست برای ست کردن مقدار
میشه فقط متدها و پراپرتی ها رو برای اجرا صدا کرد نمیشه به پراپرتی ها مقدار داد؟
دلیلش رو کسی میتونه توضیح بده و امکانی برای انجام این کار وجود داره؟

این یه نمونش:


class class1{ public $value = 'value1'; public function SetValue($value) { $this->value = $value; }}

class class2{ public function DoIt() { return new class1(); }}
$class2 = new class2();$class2->DoIt()->SetValue('value2');echo $class2->DoIt()->value;

اینم نمونه دیگش:



class class1{ public $value = 'value1';}

class class2{ public function DoIt() { return new class1(); }}
$class2 = new class2();$class2->DoIt()->value = 'value2';echo $class2->DoIt()->value;
دلیلش فکر میکنم این باشه که کلا روش شما اشتباست شما وقتی اینو صدا میزنید:
class2->DoIt()->value = 'value2';
معادل سازیش که بکنیم اگر تابع new class1() برگردونه برابر میشه با این:
class2->class1()->value = 'value2';
که این مورد کلا اشتباست شما میاید کلاس ۱ رو متدی یا پراپرتی از کلاس ۲ در نظر میگیرید که کاملا اشتباست!
ولی وقتی متغیر از خود کلاس برگردونه a که این متغیر برابر یه کلاس دیگست میشه:
class2->a->value = 'value2';
بنابراین احتمالا میشه گفت مورد اولی که تعریف کردین اصلا نباید هم درست باشه شما نمیتونید بگید class2->class1 !

leaping
پنج شنبه 24 دی 1394, 13:54 عصر
ممنون اما روش اشتباه نیست و روشی است که در بسیاری از فریمورکهای بزرگ مانند phalcon استفاده میشه

0xEHSAN
پنج شنبه 24 دی 1394, 14:38 عصر
یک سوال چرا متد رو اورریت نمیکنید؟