الأربعاء، 10 أبريل 2013

Class overloadable to make ability for overloading in php كلاس لتمكين التحميل الزائد في php

بعد طول انقطاع أعود للتدوين.. مرحبا بكم :) أبدأ على بركة الله تدوينة جديدة: تحدثت في مقالة سابقة Overloading in php just like C Sharp عن كيفية عمل overload للغة php تشبه الى حد ما خاصية overload في c// الآن اقدم طريقة أحدث، وكود الكلاس كما يلي:

class overloadable 
{ 
 protected $args = array();
 private $argType = array();
 private $argArry = array();
 private $constructArgsAry = array();
 private $method;
 private $className ='';
 
 function setConstructArgs($args) {
  $this->constructArgsAry = $args;
 }
 //--------------------------------------------------//
 function getMethod($className, $method, $args) {
  $this->className = $className;
  
  $this->args = $args;
  $type = $this->getTypes($args);
  
  $method = $method.'_'.$type;
  $this->method = $method; 
  
  return $this->callFunc();
 }
 //--------------------------------------------------//
 function getTypes($args) {
  foreach($args as $i=>$val) {
   $this->argType[$i] = $this->getType($val) ;
  }
  return implode('', $this->argType);
 }
 //--------------------------------------------------//
 function getType($byValarg) {
   if( is_numeric($byValarg) ) {
    $type = 'N'; //'numeric';
   } elseif( is_array($byValarg) ) {
    $type = 'A'; //'array';
   } elseif( is_object($byValarg) ) {
    $type = 'O'; //'object';
   } elseif( is_resource($byValarg) ) {
    $type = 'R'; //'resource';
   } else {
    $type = 'S'; //'string';
   } 
   return $type;
 }
 //--------------------------------------------------//
 function callFunc() {
  $className = $this->className;
  $method = $this->method;
  
  $constr_argsStringKeys='';

  $num_args = count($this->args);
  $argsAry = array();
  if($num_args>0){
   
   for($i=0; $i<$num_args; $i++) {
    $argsAry['$arg_'.$i] = $this->args[$i];
    eval("\$arg_$i = \$this->args[$i];");
   }
   $argsStringKeys = implode(', ', array_keys($argsAry));

   $func = create_function($argsStringKeys, 
      '$d = new '.$className.'('
      . $constr_argsStringKeys .'); return $d->'
      . $method.'('.$argsStringKeys.');');
   
   eval("\$f = \$func($argsStringKeys);"); 
   return $f;
  } 
 }
}

طريقة الاستخدام : يجب أن تقوم بعمل وراثة من الكلاس overloadable يجب اضافة كود معين للدالة التي لا تحتوي على أي براميتر. ثم اضافة دوال أخرى بنفس الاسم ولكن يضاف في نهاية اسم الدالة شرطة مائلة _ ثم أول حرف من نوع المتغير فمثلا: الدالة hi_s تعني أن هذه الدالة لها براميتر واحد نصي الدالة hi_sa تعني ان هذه الدالة لها براميترين واحد نصي والثاني مصفوفة. مثلاً يتم بناء كلاس وليكن اسمه myClass:

class myClass extends overloadable 
{
 function hi() {
  // important to work other methods
  $r = parent::getMethod(__CLASS__, __FUNCTION__, func_get_args());
  if($r){ return $r; }
  // code for method hi();
  return 'hi!';
 }
 function hi_s($name){
  return "Hi $name";
 }
 function hi_ss($var1, $var2){
  return "Hi $var1 $var2";
 }
 function hi_sa($name, $ary){
  $r = $name.' have ';
  foreach($ary as $thing){
   $r .= "$thing and ";
  }
  return rtrim($r, 'and ') .'.';
 }
 
 function hi_aa($ary1, $ary2){
  return 'Ary1: '. print_r($ary1, 1).' < br />ARY2:'. print_r($ary2, 1);
 }
 
 function wins(){
  $r = parent::getMethod(__CLASS__, __FUNCTION__, func_get_args());
  if($r){ return $r; }
  return 'You are the winner!';
 }
 
 function wins_sn($wining, $cash){
  return $wining.' wins '. $cash .'$';
 }
}

مثال على استخدام الكلاس myClass:

$o = new myClass();

echo '<pre>';
print_r( $o->hi() );
echo '< br />';
print_r( $o->hi('saleem', array('a job', 'a car', 'a house') ) );
echo '< br />';
print_r( $o->hi('Hishahm', 'Dalal') );
echo '< br />';
print_r( $o->hi(array(1,2), array('a','b') ) );
echo '< br />';
print_r( $o->wins('Hisahm', 1000) );
echo '< br />';
print_r( $o->wins() );

لتحميل المثال كاملا انقر هنا

0 تعليقات:

إرسال تعليق

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