প্যারাম হিসাবে বেনামে ফাংশন ব্যবহার করে বাইরে পরিবর্তনশীল অ্যাক্সেস করা


94

মূলত আমি ডিবি সারিগুলি প্রক্রিয়া করার জন্য এই হ্যান্ডি ফাংশনটি ব্যবহার করি (পিডিও এবং / বা অন্যান্য জিনিসগুলির দিকে নজর দিন)

function fetch($query,$func) {
    $query = mysql_query($query);   
    while($r = mysql_fetch_assoc($query)) {
        $func($r);
    }
}

এই ফাংশনটি দিয়ে আমি সহজভাবে করতে পারি:

fetch("SELECT title FROM tbl", function($r){
   //> $r['title'] contains the title
});

আসুন এখনই বলুন যে আমার সবগুলি ভারে সংঘবদ্ধ করা দরকার $r['title'](এটি কেবল একটি উদাহরণ)।

আমি এটা কিভাবে করতে পারি? আমি এই জাতীয় কিছু ভাবছিলাম, তবে এটি খুব মার্জিত নয়:

$result = '';
fetch("SELECT title FROM tbl", function($r){
   global $result;
   $result .= $r['title'];
});

echo $result;

উত্তর:


190

ডক্সে বর্ণিতuse হিসাবে আপনাকে ব্যবহার করতে হবে :

বন্ধগুলি প্যারেন্ট স্কোপ থেকে ভেরিয়েবলের উত্তরাধিকারীও হতে পারে। ফাংশন শিরোনামে এই জাতীয় কোনও পরিবর্তনশীল অবশ্যই ঘোষণা করতে হবে। প্যারেন্ট স্কোপ থেকে ভেরিয়েবলগুলি ইনহেরিট করা বৈশ্বিক ভেরিয়েবলগুলি ব্যবহারের মতো নয়। গ্লোবাল স্কোয়ারে গ্লোবাল ভেরিয়েবলের অস্তিত্ব রয়েছে, যা কোনও ফাংশন কার্যকর করছে তা বিবেচ্য নয়।

কোড:

$result = '';
fetch("SELECT title FROM tbl", function($r) use (&$result) {
   $result .= $r['title'];
});

তবে সাবধান (পূর্ববর্তী লিঙ্কের একটি মন্তব্য থেকে নেওয়া):

ব্যবহার () প্যারামিটারগুলি প্রাথমিক বাঁধাই হয় - ল্যাম্বডা ফাংশনটি (দেরীতে বাইন্ডিং) বলা হয় এমন বিন্দুটির পরিবর্তে ল্যাম্বডা ফাংশনটি ঘোষিত বিন্দুতে তারা ভেরিয়েবলের মান ব্যবহার করে।


4
সেই বিশ্বব্যাপী হতাশা কি অপসারণ করা উচিত নয়?
আজিজ পুঞ্জানী

19
জোর দেওয়ার জন্য +1 early binding। তবে আমি উপরের উদাহরণটিতে অনুমান করি যখন use (&$result)রেফারেন্স দিয়ে পাস করা যায় তখন তা আসলে কোনও ব্যাপার নয়?
দিমিত্রি কে

4
@ ডিমিট্রিকে হ্যাঁ, এখানে ডিফল্ট আচরণকে (তাড়াতাড়ি বাঁধাই করা) বাইপাস করতে এখানে রেফারেন্স ব্যবহার করা হয়।
Xaerxess

4
@machineaddict মৌলিক use হয় গোড়ার দিকে বাঁধাই - আপনি গড় কার্যসংক্রান্ত প্রয়াত বাঁধাই জন্য - আপনি মাধ্যমে পরিবর্তনশীল পাস হবে useরেফারেন্স দ্বারা - ব্যবহার &=> use (&$result)এবং Alter $resultপরিবর্তনশীল আগে আপনি বেনামী ফাংশনটি (বা কিছু, এটি কল) কল
jave.web

4
যেহেতু ক্লাসের দৃষ্টান্তগুলি সর্বদা রেফারেন্স দিয়ে চলে যায় আপনার তাদের ব্যবহারের প্রয়োজন হবে না। (আপনি যদি পুরোপুরি উদাহরণটি ওভাররাইট না করেন)
জোয়েল হার্কস

0

Fet ফানক একবার কল করতে পুনরায় লেখার বিষয়ে কী?

function fetch($query,$func) {
    $query = mysql_query($query);   
    $retVal = array();
    while($r = mysql_fetch_assoc($query)) {
        $retVal[] = $r;
    }
    $func($retVal);
}

এইভাবে আপনি একবার $ ফানক কল করবেন এবং একবার অ্যারে একবার নিয়ে এসে পুনরায় প্রক্রিয়া করবেন? এমনকি কার্যকারিতা সম্পর্কে নিশ্চিত নয় যে কোনও ফাংশন 200 বার কল করা ভাল ধারণা মত শোনাচ্ছে না।


হ্যাঁ তুমিই ঠিক. তবে, আপনি যদি এখানে এবং সেখানে কয়েক এমএস অর্জন করতে আগ্রহী হন ... তবে আপনার কলামগুলির অবস্থানটি জানতে হবে বলেই সমস্যাটি মোকাবেলা করা খুব ভয়ঙ্কর hard এটি করার মাধ্যমে, আপনি প্রতি 30 টি সারির 2000 টি অনুরোধে 0.205 থেকে 0.180 পেরিয়ে যান।
ব্যবহারকারী 103307
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.