PDA

View Full Version : صدا زدن متدهای کلاس child در کلاس parent



m.esmaeilzadeh
چهارشنبه 05 فروردین 1394, 12:24 عصر
فرض کنید یک کلاس داریم به اسم main و یک کلاس داریم به اسم aaa که این کلاس aaa زیر مجموعه یا extends کلاس main هستش !
از داخل کلاس aaa که زیر مجموعه main است میتونیم با this$ و یا ::parent به متغیرهای و توابع main دسترسی پیدا کنیم ...
ولی از main که parent کلاس aaa است همچین چیزی امکان نداره !!!
چجوری میشه داخل کلاس والد یا parent به توابع و متغیرهای کلاس های زیر مجموعه و child دسترسی پیدا کرد ؟!



class main{

function hello()
{
echo $this->salam();
}

}

class aaa extends main{

public function salam()
{
return 'Salam';
}

}

$main = new main();

$main->hello();

اروری که میده : Fatal error: Call to undefined method main::salam()

.

2undercover
چهارشنبه 05 فروردین 1394, 13:16 عصر
این کار در حالت عادی ممکن نیست؛ چون کلاس والد اطلاعی درباره کلاس های فرزند نداره. شما فرضا با همون ساختاری که خودتون گفتید این حالت رو در نظر بگیرید:


$main = new main();
$firstChild = new aaa();
$secondChild = new aaa();
$main->hello();

خوب الان وقتی متد hello صدا زده شده باید متد salam از کدوم یک از شئ های بالا اجرا بشه؟!

برای جایگزین دو روش وجود داره (البته ممکنه راه های خیلی بیشتری هم باشه مثل Design Pattern های مختلف):
1. استفاده از متد های Static
2. معرفی شئ فرزند به شئ والد:


interface child {
public function salam();
}
class main {
protected $child;
public function __construct(child $child) {
$this->child = $child;
}
public function hello() {
echo $this->child->salam();
}
}
class aaa implements child {
public function salam() {
return 'Salam';
}
}

و موقع استفاده هم کد ها به شکل زیر میشه:


$main = new main(new aaa);
$main->hello();

m.esmaeilzadeh
جمعه 07 فروردین 1394, 11:58 صبح
ممنون , پس یعنی به صورت پیشفرض همه دسترسی ها از پایین به بالاست و بالایی نمیتونه به پایین دسترسی داشته باشه ؟!
نکته جالب اینکه وقتی کلاس ها زیر مجموعه یک کلاس والد قرار میگیرند , یعنی child ها هم نمیتونن به هم ارتباط داشته باشن ...
پس برای یک ساختار MVC چجور باید متدهای model و view رو داخل controller صدا زد ؟
اونها هم از اینترفیس استفاده میکنن ؟

2undercover
جمعه 07 فروردین 1394, 20:14 عصر
اون interface که البته ضروری نیست و بحثش کمی متفاوته.

در مورد ساختار MVC هم پیشنهاد می کنم به اینجا مراجعه کنید: http://barnamenevis.org/showthread.php?406108-MVC-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87

peyman_abdollahy
چهارشنبه 20 خرداد 1394, 16:15 عصر
با استفاده از روش LSB یا late static binding می شه از کلاس پدر به مشخصات کلاس فرزند دسترسی پیدا کرد.
عکس بی ربطه

fatima-php
پنج شنبه 21 خرداد 1394, 08:07 صبح
بهتره راهنمایی اشتباه نکنیم. کلاس والد به کلاسهای فرزند توی هیچ زبان برنامه نویسی شئ گرایی دسترسی نداره. این مثال رو ببینید:

class A
{
public function Test()
{
// we want to call child's display method
}
}

class B extends A
{
public function Display()
{
echo B;
}
}

class C extends A
{
public function Display()
{
echo C;
}
}
الان کلاس A اگه به فرض روشی داشتیم مثل child::Display باید متد رو از کلاس B صدا میزد یا C ؟ والد یک کلاس مشخصه و یکیه ولی فرزندانش مشخص نیستن و درنتیجه تنها راهش اینه که شئ ازشون بسازیم و ازطریق شئ صدا بزنیم. مثلاً توی متد Test توی کلاس A اینطوری بنویسیم:

$b = new B;
$b->Display();
یا به شکل مشابه برای کلاس C

fatima-php
پنج شنبه 21 خرداد 1394, 08:08 صبح
عکس بی ربطه

اگه بی ربطه نگذارینش. اینجا گالری عکس نیست.

peyman_abdollahy
پنج شنبه 21 خرداد 1394, 10:14 صبح
داشتم سیستم آپلود عکسو چک میکردم! متاسفانه گزینه ای برای پاک کردن پیدا نکردم.

peyman_abdollahy
پنج شنبه 21 خرداد 1394, 11:03 صبح
<?php
class Car
{
public static function run()
{
return static::getName();
}
private static function getName()
{
return 'Car';
}
}
class Toyota extends Car
{
public static function getName()
{
return 'Toyota';
}
}
echo Car::run(); // output: Car
echo Toyota::run(); // output: Toyota
?>


این یک مثاله که چه جوری میشه از کلاس پدر به متد کلاس فرزند دسترسی داشت.
منظورتو روشن تر بگو تا اگر شد کمک کنیم ، چرا به همچین ویژگی احتیاج داری ؟

fatima-php
پنج شنبه 21 خرداد 1394, 11:05 صبح
نه الان از کلاس پدربه مشخصات کلاس فرزند دسترسی ندارین. شما الان نمیتونید ازطریق کلاس Car مشخصات کلاس Toyota رو نمایش بدین.

peyman_abdollahy
پنج شنبه 21 خرداد 1394, 11:28 صبح
اونطور ساده که تو میخوای مثل طوری که فرزند به پدر دسترسی داره نمیشه. اما این روشی که من مثال زدم شما باید از خود کلاس فرزند استفاده کنی اما یک سری متد ها تو کلاس پدر داری که میخوای برای هر فرزند با مشخصات اون صدا زده بشه. به این روش میگن Late static Binding.
الان درسته که من از کلاس تویوتا استفاده کردم ولی متدی که صدا زدیم مال پدر بود.
حالا اگر صد تا مدل ماشین هم داشته باشیم می تونیم با کمک کلاس پدر اسم ماشین و یا ویژگی های دیگرو بدست بیاریم

fatima-php
پنج شنبه 21 خرداد 1394, 11:45 صبح
خوب منظور استارتر این نبود. درواقع میخوان توی متدی از کلاس والد، یک متد یا پراپرتی از یکی از فرزندان رو بخونن و صدا بزنن (البته بدون ایجاد شئ از اون).