الأحد، 27 نوفمبر 2011

Overloading in php just like C Sharp

كيف تحصل على التحميل الزائد بشكل أكثر شبها بلغة c#
ففي لغة C# يمكننا عمل ما يلي:
// author: hishamdalal@gmail.com 2011
class person
{
    private int ID;
    private string Name;

    public void Add(string ID, string Name)
    {
        this.ID = Convert.ToInt32(ID);
        this.Name = Name;
    }
    public person()
    {
        this.Add("0", "no name!");
    }
    public person(string ID, string Name)
    {
        this.Add(ID, Name);
    }
}

students s = new students();
s.person();             // method without args
s.person(1, "hisham");  // overload method with args

فكيف يمكننا فعل ذلك بواسطة php?



دعونا نتعرف على أحد الطرق السحرية "Magic Methods" هي "__call"
وظيفتها:
تقوم باستقبال اسم الدالة كوسيط أول ومتغيرات الدالة كوسيط ثاني على شكل مصفوفة يمكنك من خلالها عمل المعجزات
مثال:
class a {
    function __call($name, $args){
        echo "$name: <pre>";
        print_r($args);
    }
}

$v = 'var';

$a = new a();
$a->writeAnyName(1, 'b', $v);  // no limits for args
كما هو واضح يمكنك استدعاء دالة غير موجودة في الفئة "الكلاس"، وستتكفل الدالة السحرية بالعمل
قم بتجربة الكود السابق في السيرفر المحلي لديك أولا ثم تابع المقالة

سنقوم بعمل كلاس يمكننا من تقليد الدالة mumber_format الخاصة بتنسيق الارقام
string number_format ( float $number , int $decimals , string $dec_point , string $thousands_sep )
الفئة "الكلاس" الأب:
// Author: hishamdalal@gmail.com 2011
class obj {
    function __call($funcName, $args){
        $count = count($args);
        if($count>0){
            foreach($args as $arg){
                $a[] = "'$arg'";
            }
            $args = join(', ',$a);
        }else{
            $args = $args[0];
        }

        $fname = $funcName.'_'.$count;
        if(method_exists($this, $fname)){
            eval("\$r = \$this->$fname($args);");
            return $r;
        }else{ trigger_error('No overload method ['.$funcName.'] have '.$count.' args!', E_USER_ERROR);}
    }
}
هذا هو الكلاس الاب، ويجب استخدام الوراثة لعمل "تجاوز الطرق" الخاص بك
سنقوم بعمل كلاس بإسم "int" الخاص بتنسيق الارقام
// Author: hishamdalal@gmail.com 2011
class int extends obj{
    private $val=0;

    function __construct($val){
       $this-<val=$val;
    }
    function format_0(){
        return number_format($this-<val);
    }
    function format_1($decimals){
        return  number_format($this-<val, $decimals);
    }
    function format_2($decimals, $dec_point){
        return  number_format($this-<val, $decimals, $dec_point, ' ');
    }
    function format_3($decimals, $dec_point, $thousands_sep){
        return  number_format($this-<val, $decimals, $dec_point, $thousands_sep);
    }
}
لاحظ أنه يشترط ترقيم الطرق التي لها نفس الاسم، أعتقد أنه ليس من الصعب ترقيم الطرق
من المهم ترتيب الدوال بحسب عدد الوسائط "args" التي تأخذها الطريقة
فيجب ترقيم الدالة التي ليس لها وسائط بالرقم "0"، والدالة التي تأخذ وسيطين بالرقم "2" وهكذا...

الاستخدام:
// Author: hishamdalal@gmail.com 
$int = new int(1234.56);
echo $int-<format();
echo '\n';
echo $int-<format(2, '.');
echo '\n'
echo $int-<format(2, '.', ',');
echo '\n'
echo $int-<format(3, ',', '.');
echo '\n'
echo $int-<format(3, ',', '.', 100);
أخيراً، قم بتجريب الكود ويسعدني تعليقك على هذه المقالة
أرجو الاشارة الى المصدر عند نقل الشرح، أو استخدام الطريقة في مشاريعك، فهذه أمانة
هذا المثال تم باستخدام اصدارة PHP Version 6.0.0-dev

0 تعليقات:

إرسال تعليق

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Blogger Templates | تعريب وتطوير : قوالب بلوجر معربة