• 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
ساختار overloading
#1
Star 
سلام .
من یک سالی هست که روی این 3 قضیه کار نکردم و متاسفانه دنبالش نرفتم. و الان احتیاج دارم بدونم و وقت هم کم دارم
کسی می تونه این سه تا موضوع را توضیح با مثال بده :
1- طریقه method overloading در php ( ای کاش مثل جاوا بود که نیست )
2- مفهوم static برای اشیائ و خصوصیت ها و متد ها
3- مفهوم override کردن متد ها در کلاس های فرزند

اولی خیلی مهمه Huh
  پاسخ
تشکر شده توسط :
#2
دوست عزیز همیشه سریع ترین راه برای پاسخ شما می تونه جستجو باشه!

برای سوال 1
لینک:
http://php.net/manual/en/language.oop5.overloading.php

کد:
کد پی‌اچ‌پی:
<?PHP

class a
{
    public function 
__call($name$arg)
    {
        echo 
'you call "'.$name.'" method and arg:'.print_r($arg1);
    }
}

$obj = new a();
$obj->test('iranphp.org''php.net');
?>

خروجی:
کد:
you call "test" method and arg:Array ( [0] => iranphp.org [1] => php.net )

برای سوال 2
static وقتی به یک property یا Mehtod برچسپ می شه یعنی ما باید این رو متعلق به کلاس بدونیم نه اشیاء
مثلا یه property که static شده برای تمام اشیاء مشتق شده از کلاس و غیر مشتق شده به یک صورت قابل دسترسی ( البته به شرط اینکه public باشه در غیر این صورت فقط برای اشیاء مشتق شده از کلاس قابل دسترسیه )

لینک: http://php.net/manual/en/language.oop5.static.php


کد:
کد پی‌اچ‌پی:
<?PHP

class test
{
    public static 
$name;
    
    public function 
__construct($name)
    {
        
self::$name $name;
    }
    
    public function 
GetName()
    {
        return 
self::$name;
    } 
}

$a = new test('amin');
echo 
'value of $name for $a object : "'.$a->GetName().'"';

$b = new test('mohammad');
echo 
'value of $name for $b object :'.$b->GetName().'"';

echo 
'value of $name for $a object :'.$a->GetName().'"';
?>

خروجی :
کد:
value of $name for $a object : "amin"
value of $name for $b object :mohammad"
value of $name for $a object :mohammad"

برای سوال 3
وقتی که یک کلاس از یک کلاس ارث می بره به این معنی که تمام خصوصیات و متد های کلاس پدر رو در خودش داره به شرط اینکه کلاس پدر این اجازه رو داده باشه! کلاس فرزند هم اجازه داره تا متدهای پدر رو گسترش بده. در واقع override یعنی شما می تونید متد هایی که به واسته ارثبری برای کلاس ایجاد شدند رو دوباره بنویسید.

لینک: البته این لینک مربوط می شه به کلمه کلیدی parent که واسط هست بین متد در کلاس فرزند به متد در کلاس والد http://php.net/manual/en/keyword.parent.php

کد:
کد پی‌اچ‌پی:
<?PHP

class a
{
    public function 
newPrint($text)
    {
        echo 
'<B>'.$text.'</B>';
    }
}

class 
extends a
{
    public function 
newPrint($text)
    {
        
parent::newPrint('<i>'.$text.'</i>');    
    } 
}

$a = new a();
$a->newPrint('amin');

$b = new b();
$b->newPrint('amin');
?>

خروجی: به صورت کد HTML!!!
کد:
<B>amin</B>
<B><i>amin</i></B>
  پاسخ
تشکر شده توسط : hosseintdk775 zoghal parvane alri paull
#3
امین مرسی نوع توضیحاتت عالی بود
  پاسخ
تشکر شده توسط : oia
#4
چوب کاری می فرمایید جیگر!!! Angel
[عکس: icon_thank%20you.gif]
  پاسخ
تشکر شده توسط : zoghal
#5
تشکر از پاسخ
می شه over loading را با دو مثال نشون بدی . یعنی دو تا شیئ . من چیزی متوجه نشدم ؟Huh
  پاسخ
تشکر شده توسط :
#6
Method Overloading یعنی اینکه شما می تونید از متد های مجازی ( بطور واقعی وجود ندارند ) در کلاس استفاده کنید. فرض کنید که شما یک کلاس ( یا یک شی ) دارید که به کمک اون کی تون به کتابخونه ی توابع ( functions ) پی اچ پی دسترسی پیدا کنید به صورت شی گرایی!

دموی کلاس به این صورته دیگه:
کد پی‌اچ‌پی:
<?PHP

// کلاس توابع پی اچ پی
$funcs = new PHPFunctions();

// درخواست تابع پرینت از شی که ساختیم
$funcs->print('Hello World');
?>

چطور می شه کد همچین کلاسی رو پیاده کرد؟
خیلی ساده یا Method Overloadin...
هر متد ( و هر function ) خصوصیاتی دارند که با اون شناخته می شن مثه: اسم متد و ورودی های متد!
با استفاده از متد call__ این دو ویژگی رو می گیریم و عکس العمل نشون می دیم!

کد کلاس:
کد پی‌اچ‌پی:
<?PHP

// کلاس توابع پی اچ پی
class PHPFunctions
{
    public function 
__call($func_name$func_args)
    {
        return 
call_user_func_array($func_name$func_args);
    }
}
?>

هشدار: این کلاس به همین شکل بگومنم نشه پیادش کرد! و اخطار بده. البته من منظورم از طرح این مثال فقط درک موضوع بود!

یه مثال دیگه:
کد پی‌اچ‌پی:
<?PHP


class TestOverLoading
{
    public function 
__call($func_name$func_args)
    {
        echo 
'Method Name: "'.$func_name.'"<BR>'.'Method Args: ';
        foreach(
$func_args as $value){
            echo 
'"'$value.'", ';
        }
        echo 
'<BR>';
    }
}
?>

این کلاس متد هایی رو که به صورت مجازی در خواست بشن رو به صورت رشته ایی در میاره که جزییات تابع رو در خروجی نمایش بده!

مثلا برای :
کد پی‌اچ‌پی:
<?PHP

$obj 
= new TestOverLoading();
$obj->Test('arg1''arg2''arg3''arg4');
?>

که خروجیش می شه:
کد:
Method Name: "Test"
Method Args: "arg1", "arg2", "arg3", "arg4",

البته که هنوز خودم به موردی بر نخوردم که بخواد از Method Overloadin استفاده کنه! در حالی که راه حل بهتری براش وجود نداشته باشه!
  پاسخ
تشکر شده توسط : alri paull
#7
بازم عالی بود. حیفم اومد جواب امین رو با یک مثال کامل نکنم

کد پی‌اچ‌پی:
class Book
{
    
    
    public function 
insert($name,...){}
    public function 
edit($name,...){}
    
    
    public function 
find(varilabel....){}
    
    
    public function 
__call($name,$arguments)
    {
        
      
$out strtolowerstr_replace('findBy','',$name) );
      
      switch (
$out)
      {
        case 
'id':
            
$query "select * from book where $out = $arguments";
            .
            .
            .
            .
            .
            
      }
        
    }
    


شما در کلاس بوک علاوه بر توابه CURD توابع جستجو هم دارید. و نیاز دارید انواع جستجو ها ر و بر اساس فیلد های مختلف انجام بدید. خوب برای هرکدوم نوشتن کد کلاس رو بزرگ میکنه اینجا میام از overloading مثال مثال بالا استفاده میکنیدو که من findById(2) پیاده سازی کزدم
  پاسخ
تشکر شده توسط : oia hosseintdk775 parvane alri paull
#8
برای این مثال کامل باید گفت: عالیه!

---
نقل قول:البته که هنوز خودم به موردی بر نخوردم که بخواد از Method Overloadin استفاده کنه! در حالی که راه حل بهتری براش وجود نداشته باشه!
با این مثال صالح حرفم رو پس می گیرم!!!
  پاسخ
تشکر شده توسط : zoghal
#9
باز هم تشکر
تا اونجایی که یادم هست overloading در جاوا به این صورت بود که ما دو تا تابع هم اسم داشتیم با ورودی های مختلف . اما انگار تو php این قضیه وجود نداره و overloading کار دیگه ای می کنه Smile
  پاسخ
تشکر شده توسط :
#10
بله! متاسفانه یا خوشبختانه !!!
توی #C و ++C هم به شکل Java هستند.
این زبان ها میان متد رو به با ورودی هاش تو حافظه می ذارن. اینطوری می شه که می شه چند تابع با ورودی های مختلف داشت!
  پاسخ
تشکر شده توسط : paull


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان