পিএইচপি-তে একটি অ্যারে নয়, অ্যারে হিসাবে অ্যারে পাস করা ing


148

আমি মনে করি মনে হয় যে পিএইচপি-তে একটি ফাংশনটির জন্য আর্গুমেন্টের তালিকা হিসাবে অ্যারে পাস করার একটি উপায় আছে, অ্যারেটিকে স্ট্যান্ডার্ড func($arg1, $arg2)পদ্ধতিতে ডিফার করে দিয়ে । তবে এখন আমি এটি কীভাবে করব তা হারিয়েছি। আমি রেফারেন্স দিয়ে পাস করার পদ্ধতিটি কিভাবে স্মরণ করছি, কীভাবে ইনকামিং পরামিতিগুলি "গ্লোব" করবেন ... তবে কীভাবে আর্গুমেন্টের তালিকায় অ্যারেটিকে ডি-তালিকাভুক্ত করবেন না।

এটি যতটা সহজ হতে পারে func(&$myArgs)তবে আমি নিশ্চিত যে এটি তা নয়। তবে, দুঃখের বিষয়, php.net ম্যানুয়াল এখনও পর্যন্ত কিছু প্রকাশ করেনি। এমনটি নয় যে আমাকে এই বিশেষ বৈশিষ্ট্যটি গত বছর বা তার জন্য ব্যবহার করতে হয়েছিল।

উত্তর:


178

1
আমি শপথ করে বলতে পারি যে এটি একটি পূর্ব-চরিত্র বা অন্য কিছুর মতো একটি অ-ফাংশনও ছিল। ধন্যবাদ।
রবার্ট কে

8
কিন্তু আমি পাইথনকে জানি না! আমার অবশ্যই দুর্ঘটনাক্রমে মানসিক হওয়া উচিত ...: ডি
রবার্ট কে

45
আর্গুমেন্ট আনপ্যাকিং, যেমন এটি বলা হয়, পিএইচপি 5.6 ( উইকি.পিএফপিএন / আরএফসি / অর্গমেন্ট_অনপ্যাকিং ) এ যুক্ত করা হবে। এটি 'স্প্ল্যাট অপারেটর': '...' ব্যবহার করবে। এর বাক্য গঠন: $args = [1,2,3]; function(...$args){}
arothuis

4
তবে যদি আপনি যে ফাংশনটিতে কল করতে চান তা কোনও অবজেক্টের উদাহরণ পদ্ধতি হয়, তবে বিশ্বব্যাপী কোনও ফাংশনের নাম নয়?
আহনিবিজ্যাকড

6
@ অ্যানবিজক্যাড এর পরে আপনার এমন একটি ব্যবহার করা উচিত callableযা call_user_func_arrayকেবল একই অ্যারে ব্যবহার করে যেখানে প্রথম উপাদানটি বস্তু এবং দ্বিতীয়টি পদ্ধতিটি। উদাহরণস্বরূপcall_user_func_array([$object, 'method'], $myArgs);
স্টিভ

149

যেমনটি উল্লেখ করা হয়েছে , পিএইচপি 5.6+ হিসাবে আপনি আর্গুমেন্টের অ্যারে সহ কোনও ফাংশন সহজেই কল করতে ...টোকেন (ওরফে "স্প্ল্যাট অপারেটর", বৈকল্পিক ফাংশন কার্যকারিতার অংশ ) ব্যবহার করতে পারেন:

<?php
function variadic($arg1, $arg2)
{
    // Do stuff
    echo $arg1.' '.$arg2;
}

$array = ['Hello', 'World'];

// 'Splat' the $array in the function call
variadic(...$array);

// 'Hello World'

দ্রষ্টব্য: অ্যারে আইটেমগুলি তাদের কীগুলি নয়, অ্যারেতে অবস্থান অনুসারে আর্গুমেন্টগুলিতে ম্যাপ করা হয়

অনুযায়ী CarlosCarucce এর মন্তব্য , যুক্তি আন-প্যাক এই ধরনের পর্যন্ত দ্রুততম পদ্ধতি সব ক্ষেত্রে। কিছু তুলনায় এটি 5x এরও বেশি দ্রুত call_user_func_array

সরাইয়া

কারণ আমি মনে করি এটি সত্যই দরকারী (যদিও প্রশ্নের সাথে সরাসরি সম্পর্কিত নয়): পাস করা মানগুলি একটি নির্দিষ্ট ধরণের সাথে মেলে কিনা তা নিশ্চিত করতে আপনি আপনার ফাংশন সংজ্ঞায় স্প্লট অপারেটর প্যারামিটারটি টাইপ-ইঙ্গিত দিতে পারেন।

(কেবল মনে রাখবেন এটি করার ফলে এটি আপনাকে নির্ধারণ করা শেষ প্যারামিটার হতে হবে এবং এটি ফাংশনে পাস হওয়া সমস্ত প্যারামিটারকে অ্যারেতে স্থান করে দেবে))

অ্যারেটিতে একটি নির্দিষ্ট ধরণের আইটেম রয়েছে তা নিশ্চিত করার জন্য এটি দুর্দান্ত:

<?php

// Define the function...

function variadic($var, SomeClass ...$items)
{
    // $items will be an array of objects of type `SomeClass`
}

// Then you can call...

variadic('Hello', new SomeClass, new SomeClass);

// or even splat both ways

$items = [
    new SomeClass,
    new SomeClass,
];

variadic('Hello', ...$items);

7
এটির একটি দুর্দান্ত পারফরম্যান্স উন্নতি হয়েছে call_user_func_array। সুতরাং আপনি যদি পিএইচপি 5.6+ ব্যবহার করেন তবে আমি এটির জন্য সুপারিশ করব। এখানে একটি পরীক্ষা দেওয়া হয়েছে , যা অফিসিয়াল পিএইচপি উইকিতে
কার্লোস কারুকাস

2
এটি সত্যিই দুর্ভাগ্য যে এটি চিহ্নিত উত্তর নয়। অবশ্যই আরও ভাল উপায়
unforgiven1987

81

এছাড়াও মনে রাখবেন যে আপনি যদি অ্যারেতে একটি উদাহরণ পদ্ধতি প্রয়োগ করতে চান তবে আপনাকে ফাংশনটি এইভাবে পাস করতে হবে:

call_user_func_array(array($instance, "MethodName"), $myArgs);

4
@ ভাণ্ডার যুক্ত লিঙ্কযুক্ত পৃষ্ঠার$foo->bar() উদাহরণ থেকে বোঝা যায় যে এটি হওয়া উচিত । array($instance, "MethodName")
পল ক্যালক্রাফট

11
আশ্চর্যজনক, আমি একটি শিশু শ্রেণিতে নির্মাণকারীর যুক্তিগুলি সদৃশ এড়াতে এটি ব্যবহার করেছি :)call_user_func_array(array(parent, "__construct"), func_get_args());
জেসন

10

সম্পূর্ণতার জন্য, পিএইচপি 5.1 হিসাবে এটিও কাজ করে:

<?php
function title($title, $name) {
    return sprintf("%s. %s\r\n", $title, $name);
}
$function = new ReflectionFunction('title');
$myArray = array('Dr', 'Phil');
echo $function->invokeArgs($myArray);  // prints "Dr. Phil"
?>

দেখুন: http://php.net/reflectionfunction.invokeargs

পদ্ধতির জন্য আপনি পরিবর্তে প্রতিবিম্ব মেথড :: ইনভোকআরগস ব্যবহার করেন এবং অবজেক্টটিকে প্রথম প্যারামিটার হিসাবে পাস করুন।


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