PHচ্ছিক পরামিতিগুলির সাথে পিএইচপি ফাংশন


107

আমি একটি পিএইচপি ফাংশন লিখেছি যা 10 টি পরামিতি গ্রহণ করতে পারে তবে কেবল 2 টি প্রয়োজনীয় are কখনও কখনও, আমি অষ্টম প্যারামিটারটি সংজ্ঞায়িত করতে চাই, তবে আমি অষ্টম পৌঁছানো পর্যন্ত প্রতিটি প্যারামিটারের জন্য খালি স্ট্রিং টাইপ করতে চাই না।

একটি ধারণা আমার ছিল হ'ল প্যারামিটারগুলির একটি অ্যারে সহ একটি বিমূর্ত ফাংশনটি পাস করা যা এটি আসল ফাংশনটির সাথে পাশ করে।

ফাংশনটি সেট আপ করার আরও ভাল উপায় আছে যাতে আমি কেবলমাত্র যে পরামিতিগুলিই চাই তা পাস করতে পারি?



এটা অদ্ভুত. পিএইচপি-তে অন্তর্নির্মিত ফাংশনগুলির optionচ্ছিক পরামিতি থাকতে পারে। তাহলে আমরা কেন এর মতো ফাংশন তৈরি করতে পারি না?
রডরিগো

2
নোট করুন যে এই উত্তরগুলির অনেকগুলিই আউটডেটেড ... পিএইচপি এখন পরিবর্তনশীল-দৈর্ঘ্যের আর্গুমেন্ট তালিকার সাথে ফাংশন সমর্থন করে
ashleedawg

উত্তর:


62

ফাংশনটি একটি প্যারামিটার নিন: একটি অ্যারে। অ্যারের মান হিসাবে প্রকৃত পরামিতিগুলিতে পাস করুন।


সম্পাদনা করুন: পেক্কার মন্তব্যে লিঙ্কটি প্রায় এটির সমষ্টি।


1
এটা অদ্ভুত. পিএইচপি-তে অন্তর্নির্মিত ফাংশনগুলির optionচ্ছিক পরামিতি থাকতে পারে। তাহলে আমরা কেন এর মতো ফাংশন তৈরি করতে পারি না?
রডরিগো

1
@ রডরিগো তাদের মতো ফাংশনগুলি সংজ্ঞায়িত করতে একেবারে সক্ষম। এগুলি যদিও অবস্থানগত optionচ্ছিক, এটি একক optionচ্ছিক প্যারামিটারের বাইরে যে কোনও কিছুর জন্য বেশ লম্পট।
ম্যাট বল

1
ঠিক আছে, আমি চেষ্টা করেছিলাম [], এখন আমি এখানে এটি কীভাবে করব তা দেখতে: stackoverflow.com/a/34869/1086511
রডরিগো

আরও অনেক কিছু করা যায় যে কেবল "অ্যারে ব্যবহার করুন" পরামর্শ - একই ধরণের প্রশ্নের ওয়ালফের উত্তরটি দেখুন এবং একই থ্রেডে আরও গভীরতার উদাহরণ দেখুন
ডিজেডেভ

63

আমি এই ক্ষেত্রে যা করেছি তা হ'ল একটি অ্যারে পাস করা, যেখানে কীটি হল প্যারামিটারের নাম এবং মানটি মান।

$optional = array(
  "param" => $param1,
  "param2" => $param2
);

function func($required, $requiredTwo, $optional) {
  if(isset($optional["param2"])) {
    doWork();
  }
}

আপনার উদাহরণস্বরূপ, $ alচ্ছিকটি ফাংশনের মধ্যে বিশ্বব্যাপী সেট করার দরকার নেই?
ব্যবহারকারীর 481826

1
বিশ্বব্যাপী? কোন ..? ফাংশনটি কল করার আগে আপনি সেই অ্যারেটি তৈরি করেন এবং আপনি এটি পাস করেন। আমার কোডটি কী করা উচিত তার ম্যাট বলগুলির বিবরণের একটি উদাহরণ।
রাব্বট

আরও অনেক কিছু করা যায় যে কেবল "অ্যারে ব্যবহার করুন" পরামর্শগুলি - একই ধরণের প্রশ্নের ওয়ালফের উত্তরটি দেখুন এবং একই থ্রেডে আরও গভীরতার উদাহরণ দেখুন
ডিজেডেভ

45

আপনি যা করতে চান তা করতে, রাব্বোট যেমন বলেছিলেন তেমন একটি অ্যারের ব্যবহার করুন (যদিও এটি অতিরিক্ত ব্যবহার করা হয় তবে এটি ডকুমেন্ট / রক্ষণাবেক্ষণের জন্য ব্যথা হতে পারে)। অথবা কেবল theতিহ্যগত alচ্ছিক আরোগুলি ব্যবহার করুন।

//My function with tons of optional params
function my_func($req_a, $req_b, $opt_a = NULL, $opt_b = NULL, $opt_c = NULL)
{
  //Do stuff
}
my_func('Hi', 'World', null, null, 'Red');

যাইহোক, আমি সাধারণত দেখতে পাই যে আমি যখন অনেকগুলি তর্ক দিয়ে কোনও ফাংশন / পদ্ধতি লিখতে শুরু করি - তবে প্রায়শই এটি কোডের গন্ধ নয়, এবং পুনরায় ফ্যাক্টর / বিমূর্তভাবে কিছু পরিষ্কার কিছুতে পরিণত করা যেতে পারে।

//Specialization of my_func - assuming my_func itself cannot be refactored
function my_color_func($reg_a, $reg_b, $opt = 'Red')
{
  return my_func($reg_a, $reg_b, null, null, $opt);
}
my_color_func('Hi', 'World');
my_color_func('Hello', 'Universe', 'Green');

২০১০-তে, 'কোড গন্ধ', 'রিফ্যাক্টরিং' বা 'কোড রক্ষণাবেক্ষণ' এর মতো ধারণাগুলি আমাদের সম্প্রদায়ের মধ্যে জনপ্রিয় ছিল না। আমাদের বেশিরভাগের আগেই আপনার একটি পদক্ষেপ ছিল :)
বিল্লাল বিগ্রেডজ

15

পিএইচপি 5.6 এবং তারপরে, যুক্তি তালিকাগুলিতে ... টোকেনটি অন্তর্ভুক্ত হতে পারে যাতে বোঝাতে ফাংশনটি একটি চলক সংখ্যক আর্গুমেন্ট গ্রহণ করে। আর্গুমেন্টগুলি অ্যারে হিসাবে প্রদত্ত ভেরিয়েবলটিতে পাঠানো হবে; উদাহরণ স্বরূপ:

পরিবর্তনশীল আর্গুমেন্ট অ্যাক্সেস করতে ... ব্যবহার করে উদাহরণ

<?php
function sum(...$numbers) {
    $acc = 0;
    foreach ($numbers as $n) {
        $acc += $n;
    }
    return $acc;
}

echo sum(1, 2, 3, 4);
?>

উপরের উদাহরণটি আউটপুট দেবে:

10

পরিবর্তনশীল-দৈর্ঘ্যের আর্গুমেন্ট পিএইচপি ডকুমেন্টেশন তালিকাভুক্ত করে


এই প্রতিক্রিয়া আরও পয়েন্ট প্রাপ্য। আমার নির্দিষ্ট কেস দৃশ্যের জন্য উপযুক্ত নয় তবে ভাল তথ্য এবং বুঝতে সহজ। পিএইচপি 7.3 শীঘ্রই আসছে! 5.6 এবং 7 হ'ল EOL।
AdheneManx

12

আপনি কেবল নਾਲকে ডিফল্ট মান সেট করতে পারেন।

<?php
function functionName($value, $value2 = null) {
// do stuff
}

2
সেরা উত্তর, তবে দয়া nullকরে তারিখের ধরণের বি-বিট দিয়ে প্রতিস্থাপন করুন । array()অ্যারেগুলির জন্য উদাহরণস্বরূপ
মোহাম্মদ হিচাম

আপনাকে ধন্যবাদ ... আমি এটিই খুঁজছিলাম
ডেভিড ডি মায়েস্ত্রি

12

দ্রষ্টব্য: পিএইচপি 5.5 এবং এর নিচে এটি একটি পুরানো উত্তর । পিএইচপি 5.6+ ডিফল্ট যুক্তি সমর্থন করে

পিএইচপি 5.5 এবং নীচে, আপনি এই 2 টি পদ্ধতির একটি ব্যবহার করে এটি অর্জন করতে পারেন:

  • ব্যবহার func_num_args () এবং func_get_arg () ফাংশন;
  • নাল আর্গুমেন্ট ব্যবহার করে;

ব্যবহারবিধি

function method_1()
{
  $arg1 = (func_num_args() >= 1)? func_get_arg(0): "default_value_for_arg1";
  $arg2 = (func_num_args() >= 2)? func_get_arg(1): "default_value_for_arg2";
}

function method_2($arg1 = null, $arg2 = null)
{
  $arg1 = $arg1? $arg1: "default_value_for_arg1";
  $arg2 = $arg2? $arg2: "default_value_for_arg2";
}

আমি দ্বিতীয় পদ্ধতিটি পছন্দ করি কারণ এটি পরিষ্কার এবং সহজেই বোঝা যায় তবে কখনও কখনও আপনার প্রথম পদ্ধতির প্রয়োজন হতে পারে।


1
আপনার এখানে ডাবল "=" দরকার বা সমস্ত এক্সপ্রেশন সত্য হয়ে যাবে। এছাড়াও, দ্বিতীয় উদাহরণে প্রকাশগুলি সর্বদা সত্য ফিরে আসবে কারণ একটি পরিবর্তনশীল সর্বদা নিজের সমান।
চকিডাব

ভাল পয়েন্ট, কিন্তু এটি আসলে কাজ করে। পিএইচপি-তে এই কোডটি $x = null; if ($x) echo "true"; else echo "false";"ভুয়া" মুদ্রণ করবে, এমনকি যদি var x ভের একটি মান (এই কোডটিতে "নাল") থাকে। এছাড়াও, উভয় পদ্ধতিতে আমরা টের্নারি অপারেটর ব্যবহার করছি, সুতরাং এটি সঠিক মাত্র একটি "=" ব্যবহার করুন। আপনি যদি পরীক্ষা করে method(); method(1); method(1, 2);দেখেন, তবে প্রথম কলটি আরগ 1 এবং আরগ 2 কে ডিফল্ট মানগুলির সাথে যুক্ত করবে, দ্বিতীয় কলটি দ্বিতীয় আরগটিকে ডিফল্ট মানের সাথে এবং প্রথম আর্গের জন্য "1" যুক্ত করবে। শেষ কলটি ডিফল্ট মানগুলিকে সংযুক্ত করবে না।
ড্যানিয়েল লোরেইরো

1
ফাংশন পদ্ধতি_2 ($ আরজি 1 = "ডিফল্ট_মূল্য_ফট_আরজি 1", $ আরজি 2 = "ডিফল্ট_মূল্য_ফট_আরজি 2") {সুতরাং পিএইচপি প্যারামিটার স্টাফগুলির সাথে ডিল করে এবং আপনি প্যারামিটার হিসাবে
নালও

1
@নার্কন, আপনি ঠিক বলেছেন, পিএইচপি বর্তমানে ডিফল্ট যুক্তি সমর্থন করে। লল, আমি মনে করি যখন সহজ জিনিসগুলি অর্জন করার জন্য আমাদের প্রচুর পরিমাণে কর্মশালা তৈরি করার প্রয়োজন হয়েছিল। শুভ সময়: পি আপনি এখনও সেই কোডগুলি পুরানো কোডগুলিতে দেখতে পারেন (প্রাক-5.5), যদিও।
ড্যানিয়েল লোরেইরো

4

আমি মনে করি, আপনি প্যারাম-ট্রান্সপোর্টার হিসাবেও অবজেক্টগুলি ব্যবহার করতে পারেন।

$myParam = new stdClass();
$myParam->optParam2 = 'something';
$myParam->optParam8 = 3;
theFunction($myParam);

function theFunction($fparam){      
  return "I got ".$fparam->optParam8." of ".$fparam->optParam2." received!";
}

অবশ্যই, আপনাকে এই ফাংশনে "optParam8" এবং "optParam2" এর জন্য ডিফল্ট মান নির্ধারণ করতে হবে, অন্য ক্ষেত্রে আপনি "নোটিশ: অপরিবর্তিত সম্পত্তি: stdClass :: $ optParam2" পাবেন

যদি অ্যারেগুলি ফাংশন প্যারামিটার হিসাবে ব্যবহার করে থাকে তবে আমি ডিফল্ট মানগুলি সেট করতে এই পদ্ধতিটি পছন্দ করি:

function theFunction($fparam){
   $default = array(
      'opt1' => 'nothing',
      'opt2' => 1
   );
   if(is_array($fparam)){
      $fparam = array_merge($default, $fparam);
   }else{
      $fparam = $default;
   }
   //now, the default values are overwritten by these passed by $fparam
   return "I received ".$fparam['opt1']." and ".$fparam['opt2']."!";
}

2

বৈধ রাষ্ট্রের সাথে অবজেক্টটি তৈরি করতে যদি কেবল দুটি মান প্রয়োজন হয় তবে আপনি কেবলমাত্র অন্যান্য সমস্ত alচ্ছিক আর্গুমেন্টগুলি মুছে ফেলতে এবং সেটারগুলি সরবরাহ করতে পারেন (যদি না আপনি রানটাইমে এগুলি পরিবর্তন না চান)। তারপরে কেবল দুটি প্রয়োজনীয় আর্গুমেন্টের সাহায্যে অবজেক্টটি ইনস্ট্যান্ট করুন এবং সেটারের মাধ্যমে অন্যকে প্রয়োজনীয় হিসাবে সেট করুন।

আরও পড়া


2

আমি জানি এটি একটি পুরানো পোস্ট, তবে আমি ওপি-র মতো সমস্যা ছিল এবং এটিই আমি সামনে এসেছি।

অ্যারে উদাহরণ আপনি পাস করতে পারে। কোনও নির্দিষ্ট আদেশের প্রয়োজন হলে আপনি এটি পুনরায় অর্ডার করতে পারেন, তবে এই প্রশ্নের জন্য এটি যা চাওয়া হবে তা করবে।

$argument_set = array (8 => 'lots', 5 => 'of', 1 => 'data', 2 => 'here');

এটি পরিচালনাযোগ্য, পড়তে সহজ এবং ডেটা এক্সট্রাকশন পয়েন্টগুলি কোডিংয়ের যে কোনও জায়গায় নোটিশের সময় যোগ করা এবং মুছে ফেলা যায় এবং এখনও একটি বিশাল পুনর্লিখন এড়ানো যায়। আমি ওপি মূল প্রশ্নের সাথে তাল মিলাতে পূর্ণসংখ্য কীগুলি ব্যবহার করেছি তবে স্ট্রিং কীগুলি সহজেই ব্যবহার করা যেতে পারে। পাঠযোগ্যতার জন্য আসলে আমি এটি পরামর্শ করব।

স্বাচ্ছন্দ্যের জন্য এটিকে একটি বাহ্যিক ফাইলে আটকে দিন

function unknown_number_arguments($argument_set) {

    foreach ($argument_set as $key => $value) {

        # create a switch with all the cases you need. as you loop the array 
        # keys only your submitted $keys values will be found with the switch. 
        switch ($key) {
            case 1:
                # do stuff with $value
                break;
            case 2:
                # do stuff with $value;
                break;
            case 3:
                # key 3 omitted, this wont execute 
                break;
            case 5:
                # do stuff with $value;
                break;
            case 8:
                # do stuff with $value;
                break;
            default:
                # no match from the array, do error logging?
                break;
        }
    }
return;
}

ফাইলটি শুরুতে রাখুন।

$argument_set = array(); 

পরবর্তী কোথাও ডেটা ব্যবহারের নম্বর অনুযায়ী নামকরণ / নামকরণ কোথা থেকে ডেটা আসছে তা নির্ধারণ করতে এগুলি ব্যবহার করুন।

$argument_set[1][] = $some_variable; 

এবং শেষ পর্যন্ত অ্যারে পাস

unknown_number_arguments($argument_set);

1
function yourFunction($var1, $var2, $optional = Null){
   ... code
}

আপনি একটি নিয়মিত ফাংশন করতে পারেন এবং তারপরে একটি ডিফল্ট নাল মান দিয়ে আপনার aচ্ছিক ভেরিয়েবলগুলি যুক্ত করতে পারেন।

একটি নাল এখনও একটি মান, আপনি যদি এই ভেরিয়েবলের মান সহ ফাংশনটি কল না করেন তবে এটি খালি হবে না সুতরাং কোনও ত্রুটি নেই।


2
আপনি কি আরও সব ব্যাখ্যা করতে পারেন? প্রদত্ত কোডটি সিনথেটিকভাবে অবৈধ, কারণ পরিবর্তনশীল নামগুলি একটি সংখ্যার সাথে শুরু করতে পারে না
নিকো হাজে

0

আপনি যদি কেবলমাত্র 8 তম মানটিতে যাচ্ছেন তবে আপনি নিজের প্যারামিটারগুলি পুনরায় অর্ডার করতে পারেন যাতে এটি প্রথম first আপনি কেবলমাত্র শেষ করতে চান তা পরামিতিগুলি নির্দিষ্ট করতে হবে specify

আপনি যদি বিভিন্ন মান ব্যবহার করেন তবে আপনার কাছে দুটি বিকল্প রয়েছে।

একটি হ'ল র‍্যাপার ফাংশনগুলির একটি সেট তৈরি করা হবে যা বিভিন্ন পরামিতি নেয় এবং অন্যের উপর ডিফল্ট সেট করে। এটি কার্যকর যদি আপনি কেবল কয়েকটি সংমিশ্রণ ব্যবহার করেন তবে দ্রুত খুব অগোছালো হয়ে উঠতে পারেন।

অন্য বিকল্পটি এমন একটি অ্যারে পাস করা হয় যেখানে কীগুলি পরামিতিগুলির নাম। তারপরে আপনি ঠিক করতে পারেন যে কোনও কী সহ অ্যারেতে কোনও মান আছে এবং যদি ডিফল্টটি ব্যবহার না করে। তবে আবার, আপনার কাছে অনেকগুলি পরামিতি থাকলে এটি অগোছালো হয়ে উঠতে পারে এবং অতিরিক্ত কোড যুক্ত করতে পারে।


0

পিএইচপি ডিফল্ট আর্গুমেন্ট ( লিঙ্ক ) মঞ্জুরি দেয় । আপনার ক্ষেত্রে, আপনি 3 থেকে 8 পর্যন্ত সমস্ত পরামিতিগুলি NUL হিসাবে বা আপনার ফাংশন কোডের উপর নির্ভর করে একটি খালি স্ট্রিং হিসাবে সংজ্ঞায়িত করতে পারেন। এইভাবে, আপনি কেবল প্রথম দুটি পরামিতি ব্যবহার করে ফাংশনটি কল করতে পারেন।

উদাহরণ স্বরূপ:

<?php
  function yourFunction($arg1, $arg2, $arg3=NULL, $arg4=NULL, $arg5=NULL, $arg6=NULL, $arg7=NULL, $arg8=NULL){
echo $arg1;
echo $arg2;
if(isset($arg3)){echo $arg3;}
# other similar statements for $arg4, ...., $arg5
if(isset($arg8)){echo $arg8;}
}

আকর্ষণীয় ধারণা ... তবে আপনার প্রস্তাবটি সমস্যার সমাধান করে না। প্রকৃতপক্ষে, আপনি কী যুক্তিটি প্রতিধ্বনিত হচ্ছে (যেমন ব্যবহার করে echo " this is arg3: " . $arg3;, ইত্যাদি ইত্যাদি) আপনি যদি তথ্য যোগ করেন তবে আপনি দেখতে পাবেন যে কলিং উদাহরণটি yourFunction(3, 2, $arg8=5);প্রিন্ট হবে PH 32 this is arg3: 5সমস্যাটি হ'ল পিএইচপিতে alচ্ছিক পরামিতিগুলি পাস করার পরে প্যারামিটারের অবস্থানটি এখনও গুরুত্বপূর্ণ ... প্যারামিটারের নামগুলি যথেষ্ট নয় পরামিতি নামের পরামিতির মান ম্যাপ।
mastropi

0

আপনি যে প্যারামিটারগুলি ব্যবহার করতে চান না তা অগ্রাহ্য করতে কেবল নাল সেট করুন এবং তারপরে অবস্থান অনুযায়ী প্রয়োজনীয় প্যারামিটার সেট করুন।

 function myFunc($p1,$p2,$p3=Null,$p4=Null,$p5=Null,$p6=Null,$p7=Null,$p8=Null){
    for ($i=1; $i<9; $i++){
        $varName = "p$i";
        if (isset($$varName)){
            echo $varName." = ".$$varName."<br>\n";
        }
    }
}   

myFunc( "1", "2", Null, Null, Null, Null, Null, "eight" );

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.