টি এল; ডিআর
ক) পদ্ধতি / ফাংশনটি কেবল অ্যারে আর্গুমেন্টটি পড়ায় => অন্তর্নিহিত (অভ্যন্তরীণ) রেফারেন্স
খ) পদ্ধতি / ফাংশন অ্যারে আর্গুমেন্টকে পরিবর্তন করে => মান
গ) পদ্ধতি / ফাংশন অ্যারে আর্গুমেন্টকে স্পষ্টভাবে একটি রেফারেন্স হিসাবে চিহ্নিত করা হয়েছে (একটি এম্পারস্যান্ড সহ) => সুস্পষ্ট (ব্যবহারকারী-ভূমি) রেফারেন্স
বা এটি:
- অ-অ্যাম্পারস্যান্ড অ্যারে পরম : রেফারেন্স দ্বারা পাস করা; লেখার ক্রিয়াগুলি অ্যারের একটি নতুন অনুলিপি পরিবর্তন করে, অনুলিপি যা প্রথম লেখায় তৈরি করা হয়;
- অ্যাম্পারস্যান্ড অ্যারে পরম : রেফারেন্স দ্বারা পাস; লেখার ক্রিয়াকলাপগুলি মূল অ্যারে পরিবর্তন করে।
মনে রাখবেন - নন-অ্যাম্পারস্যান্ড অ্যারে পরমকে আপনি যে মুহুর্তে লিখবেন সেই মুহুর্তে পিএইচপি একটি মান-অনুলিপি করে । এর copy-on-write
অর্থ কি । আমি আপনাকে এই আচরণের সি উত্সটি দেখাতে চাই তবে এটি সেখানে ভয়ঙ্কর। Xdebug_debug_zval () ব্যবহার করা ভাল ।
পাস্কাল মার্টিন সঠিক ছিল। কোস্টা কনটোস তখন আরও বেশি ছিল।
উত্তর
এটা নির্ভর করে.
দীর্ঘ সংস্করণ
আমি মনে করি আমি এটি নিজের জন্য লিখছি। আমার একটি ব্লগ বা কিছু থাকা উচিত ...
যখনই লোকেরা রেফারেন্স (বা পয়েন্টারগুলি, সেই বিষয়ে) কথা বলে, তারা সাধারণত একটি লজযুক্তিতে শেষ হয় (কেবল এই থ্রেডটি দেখুন !)।
পিএইচপি একটি শ্রদ্ধেয় ভাষা হওয়ায় আমি ভেবেছিলাম আমার বিভ্রান্তি বাড়িয়ে দেওয়া উচিত (যদিও এটি উপরের উত্তরগুলির একটি সংক্ষিপ্তসার)। কারণ, যদিও একই সাথে দুজন লোক সঠিক হতে পারে তবে আপনি কেবল একটি উত্তরে তাদের মাথা ফাটিয়ে ফেলা ভাল।
প্রথমত, আপনার জানা উচিত যে আপনি কোনও প্যাডেন্ট নন যদি আপনি কালো-সাদা উপায়ে উত্তর না দেন । "হ্যাঁ / না" চেয়ে বিষয়গুলি আরও জটিল।
আপনি দেখতে পাবেন যে পুরো বাই-ভ্যালু / বাই-রেফারেন্স জিনিসটি আপনার পদ্ধতি / ফাংশন স্কোপটিতে সেই অ্যারেটি দিয়ে ঠিক কী করছেন: এর সাথে পড়া বা এটি সংশোধন করার সাথে সম্পর্কিত?
পিএইচপি কি বলে? (ওরফে "পরিবর্তন অনুসারে")
ম্যানুয়াল এই (জোর খনি) বলেছেন:
ডিফল্টরূপে, ফাংশন আর্গুমেন্টগুলি মান দ্বারা পাস হয় (যাতে যদি ফাংশনটির মধ্যে আর্গুমেন্টের মান পরিবর্তন করা হয় তবে এটি ফাংশনের বাইরে পরিবর্তন হয় না)। কোনও ফাংশনকে তার তর্কগুলি সংশোধন করার অনুমতি দেওয়ার জন্য , তাদের অবশ্যই রেফারেন্স দিয়ে পাস করতে হবে ।
সর্বদা রেফারেন্স দিয়ে কোনও ক্রিয়াকলাপের পক্ষে যুক্তি অর্জনের জন্য, ফাংশন সংজ্ঞাতে আর্গুমেন্টের নামে একটি অ্যাম্পারস্যান্ড (&) প্রিপেন্ড করুন
যতদূর আমি বলতে পারি, যখন বড়, গুরুতর, সৎ-থেকে-গড প্রোগ্রামাররা রেফারেন্স সম্পর্কে কথা বলেন, তারা সাধারণত সেই রেফারেন্সের মান পরিবর্তন করার বিষয়ে কথা বলেন । এবং যে ঠিক কি সম্পর্কে ম্যানুয়াল আলোচনা আছে: hey, if you want to CHANGE the value in a function, consider that PHP's doing "pass-by-value"
।
আরও একটি মামলা রয়েছে যা তারা উল্লেখ করেনি, যদিও: আমি যদি কিছু পরিবর্তন না করি - কেবল পড়ুন?
আপনি যদি এমন পদ্ধতিতে অ্যারে পাস করেন যা স্পষ্টভাবে একটি রেফারেন্স চিহ্নিত করে না, এবং আমরা ফাংশনের সুযোগে সেই অ্যারেটি পরিবর্তন করি না? উদাহরণ:
<?php
function readAndDoStuffWithAnArray($array)
{
return $array[0] + $array[1] + $array[2];
}
$x = array(1, 2, 3);
echo readAndDoStuffWithAnArray($x);
আমার সহযাত্রী পড়ুন।
পিএইচপি আসলে কি করে? (ওরফে "স্মৃতি অনুসারে")
একই বড় এবং গুরুতর প্রোগ্রামাররা যখন তারা আরও গুরুতর হয়ে ওঠে, তখন তারা রেফারেন্সের ক্ষেত্রে "মেমরি অপটিমাইজেশন" সম্পর্কে কথা বলে। পিএইচপি করে। কারণ PHP is a dynamic, loosely typed language, that uses copy-on-write and reference counting
, তাই ।
বিভিন্ন ক্রিয়াকলাপে বিশাল আরেগুলি পাস করা এবং পিএইচপি তাদের অনুলিপি তৈরি করা আদর্শ হবে না (সর্বোপরি "পাস-বাই-মান" এটি করে):
<?php
// filling an array with 10000 elements of int 1
// let's say it grabs 3 mb from your RAM
$x = array_fill(0, 10000, 1);
// pass by value, right? RIGHT?
function readArray($arr) { // <-- a new symbol (variable) gets created here
echo count($arr); // let's just read the array
}
readArray($x);
ঠিক আছে এখন, যদি এটি আসলে পাস-বাই-ভ্যালু হত তবে আমাদের প্রায় 3 এমবি + র্যাম যেতে হত, কারণ সেই অ্যারের দুটি অনুলিপি আছে, তাই না ?
ভুল। যতক্ষণ না আমরা $arr
ভেরিয়েবলটি পরিবর্তন করি না , এটি একটি রেফারেন্স, স্মৃতি ভিত্তিক । আপনি শুধু এটি দেখতে না। এটা কেন পিএইচপি এর উল্লেখ ব্যবহারকারী-জমি রেফারেন্স যখন কথা বলছেন &$someVar
, অভ্যন্তরীণ এবং স্পষ্ট (এম্পারসেন্ড সঙ্গে) বেশী মাঝে পার্থক্যটা উল্লেখ করা।
তথ্য
সুতরাং, when an array is passed as an argument to a method or function is it passed by reference?
আমি তিনটি (হ্যাঁ, তিনটি) কেস নিয়ে এসেছি :
ক) পদ্ধতি / ফাংশনটি কেবল অ্যারে আর্গুমেন্টটি পড়ে
খ) পদ্ধতি / ফাংশন অ্যারে যুক্তিটি সংশোধন করে
গ) পদ্ধতি / ফাংশন অ্যারে যুক্তিটি স্পষ্টভাবে একটি রেফারেন্স হিসাবে চিহ্নিত করা হয়েছে (একটি সহ) এম্পারসেন্ড)
প্রথমত, আসুন দেখুন অ্যারে আসলে কত মেমরি খায় ( এখানে রান করুন ):
<?php
$start_memory = memory_get_usage();
$x = array_fill(0, 10000, 1);
echo memory_get_usage() - $start_memory; // 1331840
যে অনেক বাইট। গ্রেট।
ক) পদ্ধতি / ফাংশন কেবল অ্যারে আর্গুমেন্টটি পড়ে
এখন আসুন একটি ফাংশন তৈরি করুন যা কেবলমাত্র যুক্তিটিকে আর্গুমেন্ট হিসাবে পড়বে এবং আমরা দেখব যে পড়ার যুক্তিটি কতটা স্মৃতি গ্রহণ করে:
<?php
function printUsedMemory($arr)
{
$start_memory = memory_get_usage();
count($arr); // read
$x = $arr[0]; // read (+ minor assignment)
$arr[0] - $arr[1]; // read
echo memory_get_usage() - $start_memory; // let's see the memory used whilst reading
}
$x = array_fill(0, 10000, 1); // this is 1331840 bytes
printUsedMemory($x);
অনুমান করতে চান? আমি 80 পেয়েছি! নিজের জন্য দেখুন । এই অংশটি পিএইচপি ম্যানুয়াল বাদ দেয়। যদি $arr
পরমটি আসলে-দ্বারা-মানটি পাস করত তবে আপনি 1331840
বাইটগুলির মতো কিছু দেখতে পেতেন। মনে হয় $arr
রেফারেন্সের মতো আচরণ করে, তাই না? কারণ এটি এটা হল একটি অভ্যন্তরীণ এক - একটি রেফারেন্স।
খ) পদ্ধতি / ফাংশন অ্যারে যুক্তি সংশোধন করে
এখন, আসুন সেই পরম থেকে এটি পড়ার পরিবর্তে লিখি :
<?php
function printUsedMemory($arr)
{
$start_memory = memory_get_usage();
$arr[0] = 1; // WRITE!
echo memory_get_usage() - $start_memory; // let's see the memory used whilst reading
}
$x = array_fill(0, 10000, 1);
printUsedMemory($x);
আবার, নিজের জন্য দেখুন , আমার জন্য, এই ক্ষেত্রে 1331840. তাই হচ্ছে যে চমত্কার বন্ধ, কিন্তু অ্যারের হয় আসলে কপি করা হচ্ছে $arr
।
গ) পদ্ধতি / ফাংশন অ্যারে আর্গুমেন্টটি স্পষ্টভাবে একটি রেফারেন্স হিসাবে চিহ্নিত করা হয়েছে (একটি এম্পারস্যান্ড সহ)
এখন আসুন দেখা যাক স্পষ্টতাত্ত রেফারেন্সের জন্য রাইটিং অপারেশনটি কত স্মৃতি নেয় ( এখানে রান করুন ) - ফাংশনের স্বাক্ষরে এম্পারস্যান্ডটি নোট করুন:
<?php
function printUsedMemory(&$arr) // <----- explicit, user-land, pass-by-reference
{
$start_memory = memory_get_usage();
$arr[0] = 1; // WRITE!
echo memory_get_usage() - $start_memory; // let's see the memory used whilst reading
}
$x = array_fill(0, 10000, 1);
printUsedMemory($x);
আমার বাজি আপনি 200 সর্বোচ্চ পান! সুতরাং এটি অ-অ্যাম্পারস্যান্ড পরম থেকে পড়ার মতো প্রায় মেমরি খায় ।