PDA

View Full Version : چند نکته ی در مرود شی گرایی



masiha68
جمعه 02 اسفند 1392, 09:56 صبح
خودم دنبال جواب این سوالا بودم و جایی پیداشون نکردم . اومدم با ازمون خطا این جواب را بدست اورم . (ظاهرا که جوابام درستن :)) )
اگه اشکالی هست دوستان راهنمایی کنن :)

من سه تا کلاس به وجود اوردم

class a1 {
function __construct()
{
echo"con a1";
}
function a1()
{
print "a1";
}
}
class a2 extends a1
{
function __construct()
{
echo "con a2";
}
function a2()
{
print "a2";
}

}
class a3 extends a2
{
function __construct()
{
echo "con a3";
}
function a3()
{
print "a3";
}
}
در صورتی که شما کلاس سوم رو به دومی extends و دومی رو به اولی extends کرده باشید می تونید با ایجاد یک new از کلاس سومی به متدها و پروپرتی های کلاس اول هم دسترسی داشته باشید .
2 -شما نمی تونید کلاس ها رو به صورت حلقه ای بهم extends کنید . یعنی در مثال بالا شما حق ندارید کلاس یک رو هم extends کلاس سه کنید .
3-وقتی از یک کلاس یک شی ایجاد می کنید با new تابع __construct()(که به صورت خودکار اجرا میشود ) فقط در مورد کلاسی اجرا میشه که شما ازش شی ساختین نه در مورد کلاس هایی که extends اون هستن
4-در صورتی که در کلاس پدر و پسر یک پروپرتی با اسم یکسان باشه و شما به اون اشاره کنید (با ->) پروپرتیی فراخوانی میشه که در کلاس پسر جای داره (به شرطی که شما از کلاس پسر یک شی ایجاد کرده باشید نه از کلاس پدر (اشاره به کلاس جاری ) )

این نتایج کار امروز صبح ::چشمک:

sadegh1362
جمعه 02 اسفند 1392, 10:11 صبح
سلام
اگر می خواید تابع ()construct __ توابع extend شده هم در کلاس پسر اجرا بشه می تونید داخل ()construct __ پسر این عبارت رو بزنید :
function __construct() {
parent::__construct();
} اونوقت ()construct __ پدر هم هم زمان اجرا می شه.

masiha68
جمعه 02 اسفند 1392, 10:17 صبح
سلام
اگر می خواید تابع ()construct __ توابع extend شده هم در کلاس پسر اجرا بشه می تونید داخل ()construct __ پسر این عبارت رو بزنید :
function __construct() {
parent::__construct();
} اونوقت ()construct __ پدر هم هم زمان اجرا می شه.
درسته و بهتره از

$this->__construct();
استفاده نکنید ... چون توی یه حلقه قرار می گیرین
ممنون

foreach
جمعه 02 اسفند 1392, 11:36 صبح
و البته در صورتی که کلاس فرزند متد سازنده نداشته باشه و شما از کلاس فرزند یک شی بسازید متد سازنده کلاس پدر اجرا میشه



<?php
class a
{
public function __construct()
{
echo 'a Constructor';
}
}

class b extends a
{
public function index()
{
echo 'b index';
}
}

$b = new b();

echo '<BR>';

$b->index();



در صورتی که شما کلاس سوم رو به دومی extends و دومی رو به اولی extends کرده باشید می تونید با ایجاد یک new از کلاس سومی به متدها و پروپرتی های کلاس اول هم دسترسی داشته باشید .
در صورتی که متد ها و پروپرتی ها private باشند این امکانپذیر نیست

masiha68
جمعه 02 اسفند 1392, 11:40 صبح
[QUOTE=foreach;1979178]و البته در صورتی که کلاس فرزند متد سازنده نداشته باشه و شما از کلاس فرزند یک شی بسازید متد سازنده کلاس پدر اجرا میشه
البته فک کنم باید توی کلاس پدر متد سازنده به صورت پابلیک تعریف شده باشه ... درسته ؟

foreach
جمعه 02 اسفند 1392, 12:06 عصر
[QUOTE=foreach;1979178]و البته در صورتی که کلاس فرزند متد سازنده نداشته باشه و شما از کلاس فرزند یک شی بسازید متد سازنده کلاس پدر اجرا میشه
البته فک کنم باید توی کلاس پدر متد سازنده به صورت پابلیک تعریف شده باشه ... درسته ؟

تا اونجایی که بنده میدونم بله درسته