পিএইচপি ভেরিয়েবলগুলি মান বা রেফারেন্স দ্বারা পাস করেছে?
পিএইচপি ভেরিয়েবলগুলি মান বা রেফারেন্স দ্বারা পাস করেছে?
উত্তর:
এটি পিএইচপি ডকুমেন্টেশন অনুযায়ী মান অনুসারে ।
ডিফল্টরূপে, ফাংশন আর্গুমেন্টগুলি মান দ্বারা পাস হয় (যাতে যদি ফাংশনটির মধ্যে আর্গুমেন্টের মান পরিবর্তন করা হয় তবে এটি ফাংশনের বাইরে পরিবর্তন হয় না)। কোনও ক্রিয়াকে তার তর্কগুলি সংশোধন করার অনুমতি দেওয়ার জন্য, তাদের অবশ্যই রেফারেন্স দিয়ে পাস করতে হবে।
সর্বদা রেফারেন্স দিয়ে কোনও ফাংশনে আর্গুমেন্ট রাখার জন্য , ফাংশন সংজ্ঞাতে আর্গুমেন্টের নামে একটি এম্পারস্যান্ড ( & ) প্রিপেন্ড করুন ।
<?php
function add_some_extra(&$string)
{
$string .= 'and something extra.';
}
$str = 'This is a string, ';
add_some_extra($str);
echo $str; // outputs 'This is a string, and something extra.'
?>
$str = add_some_extra($str);
করে বলার জন্য, এটি একই হবে যদি আমি রেফারেন্সটি ব্যবহার করছিলাম না, তাই না? তাহলে এর আসল যুক্ত মূল্য কী?
$str
আপনার ক্ষেত্রে এটি বাতিল হয়ে যাবে।
পিএইচপি-তে, ডিফল্টরূপে অবজেক্টগুলি একটি নতুন অবজেক্টের রেফারেন্স অনুলিপি হিসাবে পাস হয়।
এই উদাহরণটি দেখুন .............
class X {
var $abc = 10;
}
class Y {
var $abc = 20;
function changeValue($obj)
{
$obj->abc = 30;
}
}
$x = new X();
$y = new Y();
echo $x->abc; //outputs 10
$y->changeValue($x);
echo $x->abc; //outputs 30
এবার দেখুন ..............
class X {
var $abc = 10;
}
class Y {
var $abc = 20;
function changeValue($obj)
{
$obj = new Y();
}
}
$x = new X();
$y = new Y();
echo $x->abc; //outputs 10
$y->changeValue($x);
echo $x->abc; //outputs 10 not 20 same as java does.
এবার দেখুন ..............
class X {
var $abc = 10;
}
class Y {
var $abc = 20;
function changeValue(&$obj)
{
$obj = new Y();
}
}
$x = new X();
$y = new Y();
echo $x->abc; //outputs 10
$y->changeValue($x);
echo $x->abc; //outputs 20 not possible in java.
আমি আশা করি আপনি এটি বুঝতে পারবেন।
$y
প্রয়োজন নেই - এর অভ্যন্তরে থাকা কোনও function changeValue
প্রয়োজন নেই class Y
, যাতে দুটি সম্পর্কযুক্ত ধারণা একসাথে জড়িয়ে যায়। আমি function changeValue
ঠিক উপরের দিকে বাইরের স্কোপে চলে যাব $x = new X();
। সমস্ত উল্লেখ মুছে ফেলুন $y
। এখন এটি দেখতে আরও সহজ যে প্রথম দুটি উদাহরণ একা x alone রেখে যায় এবং তৃতীয়টি এর বিষয়বস্তুতে এতে পরিবর্তন করে new Y()
। কোনটি আপনি ডাম্প দেখতে সহজ হবে type
এর $x
- যে উভয় X
এবং Y
একটি অন্তর্ভুক্ত ঘটতে $abc
ক্ষেত্র এছাড়াও প্রদর্শিত হয় কি অবান্তর নয়
দেখে মনে হচ্ছে অনেক লোক বিভ্রান্ত হয়ে পড়েছে যেভাবে অবজেক্টগুলিকে ফাংশনগুলিতে পাঠানো হয় এবং রেফারেন্সের মাধ্যমে কী পাস হয়। অবজেক্ট ভেরিয়েবলগুলি এখনও মান দ্বারা পাস করা হয়, এর কেবলমাত্র মান যা পিএইচপি 5 এ পাস হয় এটি একটি রেফারেন্স হ্যান্ডেল। প্রমাণ হিসেবে:
<?php
class Holder {
private $value;
public function __construct($value) {
$this->value = $value;
}
public function getValue() {
return $this->value;
}
}
function swap($x, $y) {
$tmp = $x;
$x = $y;
$y = $tmp;
}
$a = new Holder('a');
$b = new Holder('b');
swap($a, $b);
echo $a->getValue() . ", " . $b->getValue() . "\n";
আউটপুট:
a, b
রেফারেন্স দিয়ে পাস করার অর্থ আমরা কলকারী দ্বারা দেখা ভেরিয়েবলগুলি সংশোধন করতে পারি। যা পরিষ্কারভাবে উপরের কোডটি করে না। আমাদের অদলবদলের ফাংশনটি এতে পরিবর্তন করতে হবে:
<?php
function swap(&$x, &$y) {
$tmp = $x;
$x = $y;
$y = $tmp;
}
$a = new Holder('a');
$b = new Holder('b');
swap($a, $b);
echo $a->getValue() . ", " . $b->getValue() . "\n";
আউটপুট:
b, a
রেফারেন্স দ্বারা পাস করার জন্য।
swap
ফাংশনে প্রেরণ করা হয় ; অন্য কথায়, যদি বস্তুগুলি "মান দ্বারা পাস করা হয়"। অন্যদিকে, কোনও বস্তুর হ্যান্ডেলটি যদি ফাংশনে প্রেরণ করা হয় তবে আপনি যা আশা করেন ঠিক এটিই ঘটে যা আসলে ঘটে actually আপনার কোড এই দুটি ক্ষেত্রে পার্থক্য করে না।
http://www.php.net/manual/en/migration5.oop.php
পিএইচপি 5 এ একটি নতুন অবজেক্ট মডেল রয়েছে। পিএইচপি'র হ্যান্ডলিং অবজেক্টগুলি পুরোপুরি নতুন করে লেখা হয়েছে, আরও ভাল পারফরম্যান্স এবং আরও বৈশিষ্ট্যগুলির জন্য অনুমতি দেয়। পিএইচপি এর পূর্ববর্তী সংস্করণগুলিতে, বস্তুগুলি আদিম ধরণের (উদাহরণস্বরূপ পূর্ণসংখ্যার এবং স্ট্রিংগুলির মতো) হিসাবে পরিচালিত হয়েছিল। এই পদ্ধতির অপূর্ণতাটি ছিল যে ভেরিয়েবল নির্ধারিত হওয়ার পরে, বা কোনও পদ্ধতিতে প্যারামিটার হিসাবে পাস করার পরে শব্দার্থগতভাবে পুরো বস্তুটি অনুলিপি করা হয়েছিল। নতুন পদ্ধতির মধ্যে, অবজেক্টগুলি হ্যান্ডেল দ্বারা রেফারেন্স করা হয়, এবং মান দ্বারা নয় (কেউ হ্যান্ডেলটিকে কোনও বস্তুর সনাক্তকারী হিসাবে ভাবতে পারে)।
পিএইচপি ভেরিয়েবলগুলি মান দ্বারা নির্ধারিত হয়, মান অনুসারে ফাংশনগুলিতে প্রেরণ করা হয় এবং যখন অবজেক্ট / প্রতিনিধিত্ব করে থাকে / রেফারেন্স দ্বারা পাস করা হয়। আপনি একটি & এর সাহায্যে ভেরিয়েবলকে রেফারেন্স দিয়ে যেতে বাধ্য করতে পারেন
মান / রেফারেন্স উদাহরণ দ্বারা নির্ধারিত:
$var1 = "test";
$var2 = $var1;
$var2 = "new test";
$var3 = &$var2;
$var3 = "final test";
print ("var1: $var1, var2: $var2, var3: $var3);
আউটপুট হবে
var1: পরীক্ষা, var2: চূড়ান্ত পরীক্ষা, var3: চূড়ান্ত পরীক্ষা
মান / রেফারেন্স দ্বারা পাস করা:
$var1 = "foo";
$var2 = "bar";
changeThem($var1, $var2);
print "var1: $var1, var2: $var2";
function changeThem($var1, &$var2){
$var1 = "FOO";
$var2 = "BAR";
}
আউটপুট হবে:
var1: foo, var2 বার
রেফারেন্স পেশী দ্বারা অবজেক্ট ভেরিয়েবলগুলি পাস হয়েছে:
class Foo{
public $var1;
function __construct(){
$this->var1 = "foo";
}
public function printFoo(){
print $this->var1;
}
}
$foo = new Foo();
changeFoo($foo);
$foo->printFoo();
function changeFoo($foo){
$foo->var1 = "FOO";
}
আউটপুট হবে:
যদি foo
(এটি শেষ উদাহরণ সম্ভবত আরও ভাল হতে পারে ...)
$foo
একটি হল একটা অবজেক্ট পয়েন্টার । $foo
হয় মান দ্বারা গৃহীত ফাংশন changeFoo()
, যেমন changeFoo()
একটি সঙ্গে তার পরামিতি ঘোষণা করা হয়নি &
।
আপনি রেফারেন্স দ্বারা একটি ফাংশন একটি পরিবর্তনশীল পাস করতে পারেন। এই ফাংশনটি আসল ভেরিয়েবলটি সংশোধন করতে সক্ষম হবে।
আপনি ফাংশন সংজ্ঞা রেফারেন্স দ্বারা উত্তরণ সংজ্ঞায়িত করতে পারেন:
<?php
function changeValue(&$var)
{
$var++;
}
$result=5;
changeValue($result);
echo $result; // $result is 6 here
?>
আপনি এটি যেভাবেই করতে পারেন।
সামনে একটি '&' চিহ্ন রাখুন এবং আপনি যে ভেরিয়েবলটি পার করছেন সেটি তার উত্সের মতো হয়ে যায়। যেমন: আপনি এর অনুলিপি তৈরির পরিবর্তে রেফারেন্স দিয়ে পাস করতে পারেন।
সুতরাং
$fred = 5;
$larry = & $fred;
$larry = 8;
echo $fred;//this will output 8, as larry and fred are now the same reference.
আদিম প্রকারযুক্ত ভেরিয়েবলগুলি পিএইচপি 5 এর মান দ্বারা পাস হয়। অবজেক্টযুক্ত ভেরিয়েবলগুলি রেফারেন্স দ্বারা পাস হয়। ২০০ Linux সাল থেকে লিনাক্স জার্নালের একটি আকর্ষণীয় নিবন্ধ রয়েছে যা এতে 4 এবং 5 এর মধ্যে অন্যান্য ওও পার্থক্য উল্লেখ করে।
&
।
অবজেক্টগুলি পিএইচপি 5 এ রেফারেন্স দ্বারা এবং পিএইচপি 4 এর মান দ্বারা পাস করা হয়! ভেরিয়েবলগুলি ডিফল্টরূপে মান দ্বারা পাস হয়!
এখানে পড়ুন: http://www.webeks.net/programming/php/ampersand-operator-used-for-assigning-references.html
&
।
&
প্যারামিটারের সামনে সংজ্ঞায়িত না হলেও এমনকি ফাংশনগুলির দ্বারা সংশোধন করা যেতে পারে - যদি সেগুলি যদি পরামিতি হিসাবে ফাংশনটিকে ডেকে আনে এমন ক্ষেত্রটিতে থাকা অবজেক্টটি মান দ্বারা পাস করা হয় তবে ক্ষতিগ্রস্থ হবে না।
class Holder
{
private $value;
public function __construct( $value )
{
$this->value = $value;
}
public function getValue()
{
return $this->value;
}
public function setValue( $value )
{
return $this->value = $value;
}
}
class Swap
{
public function SwapObjects( Holder $x, Holder $y )
{
$tmp = $x;
$x = $y;
$y = $tmp;
}
public function SwapValues( Holder $x, Holder $y )
{
$tmp = $x->getValue();
$x->setValue($y->getValue());
$y->setValue($tmp);
}
}
$a1 = new Holder('a');
$b1 = new Holder('b');
$a2 = new Holder('a');
$b2 = new Holder('b');
Swap::SwapValues($a1, $b1);
Swap::SwapObjects($a2, $b2);
echo 'SwapValues: ' . $a2->getValue() . ", " . $b2->getValue() . "<br>";
echo 'SwapObjects: ' . $a1->getValue() . ", " . $b1->getValue() . "<br>";
রেফারেন্সের মাধ্যমে পাস না হলে বৈশিষ্ট্যগুলি এখনও সংশোধনযোগ্য তাই সাবধান হন।
আউটপুট:
স্বাপবজেক্টস: বি, একটি অদলবদল: ক, খ
ভবিষ্যতে যে কারও কাছে এটি আসার জন্য, আমি একজন অনামী ব্যবহারকারী পোস্ট করা পিএইচপি ডক্স থেকে এই রত্নটি ভাগ করতে চাই :
এখানে কিছুটা বিভ্রান্তি মনে হচ্ছে। পয়েন্টার এবং রেফারেন্সের মধ্যে পার্থক্যটি বিশেষভাবে সহায়ক নয়। ইতোমধ্যে পোস্ট করা কিছু "বিস্তৃত" উদাহরণগুলির আচরণটি সহজতর একত্রিত শর্তে ব্যাখ্যা করা যেতে পারে। উদাহরণস্বরূপ, হেইলির কোডটি আপনার যা প্রত্যাশা করা উচিত তা হুবহু করছেন। (ব্যবহার করে> = 5.3)
প্রথম নীতি: একটি পয়েন্টার কোনও বস্তু অ্যাক্সেস করার জন্য একটি মেমরি ঠিকানা সঞ্চয় করে। যে কোনও সময় কোনও বস্তু নির্ধারিত হওয়ার পরে, একটি পয়েন্টার উত্পন্ন হয়। (আমি এখনও জেন্ড ইঞ্জিনের গভীরে খুব বেশি কিছু আবিষ্কার করি নি, তবে যতদূর আমি দেখতে পাচ্ছি, এটি প্রযোজ্য)
২ য় নীতি, এবং সর্বাধিক বিভ্রান্তির উত্স: কোনও ফাংশনে একটি ভেরিয়েবল পাস করা ডিফল্টরূপে একটি মান পাস হিসাবে সম্পন্ন হয়, আপনি অনুলিপি সহ কাজ করছেন। "তবে বস্তুগুলি রেফারেন্স দিয়ে পাস হয়!" এখানে এবং জাভা উভয় ক্ষেত্রেই একটি সাধারণ ভুল ধারণা। আমি কখনই WHAT এর একটি অনুলিপি বলিনি। ডিফল্ট পাসিংটি মান দ্বারা সম্পন্ন হয়। সর্বদা. যা অনুলিপি করা হচ্ছে এবং পাস হচ্ছে তা হচ্ছে পয়েন্টার। "->" ব্যবহার করার সময়, আপনি অবশ্যই কলার ফাংশনে মূল পরিবর্তনশীল হিসাবে একই ইন্টার্নালগুলি অ্যাক্সেস করতে পারবেন। কেবল "=" ব্যবহার করা কেবল অনুলিপিগুলির সাথে খেলবে।
তৃতীয় নীতি: "&" স্বয়ংক্রিয়ভাবে এবং স্থায়ীভাবে অন্য পরিবর্তনশীল নাম / পয়েন্টারটিকে একই মেমরি ঠিকানায় অন্য কিছু হিসাবে স্থির করে দেয় যতক্ষণ না আপনি সেগুলি ডিকুয়াল করেন। এখানে "عرف" শব্দটি ব্যবহার করা সঠিক correct "আনসেট ()" দিয়ে জোর করে আলাদা না করা পর্যন্ত এটিকে নিতম্বের দুটি পয়েন্টারে যোগ দেওয়া হিসাবে ভাবেন। এই কার্যকারিতা উভয় একই সুযোগে এবং যখন কোনও কার্যক্রমে একটি যুক্তি পাস করা হয় তখনই বিদ্যমান exists প্রায়শই পাস হওয়া যুক্তিটিকে "রেফারেন্স" বলা হয়, "মান দ্বারা উত্তরণ" এবং "রেফারেন্স দ্বারা পাস করা" এর মধ্যে নির্দিষ্ট পার্থক্যের কারণে যা সি এবং সি ++ তে পরিষ্কার ছিল।
কেবল মনে রাখবেন: অবজেক্টগুলিতে পয়েন্টার, নিজেরাই বস্তু নয়, ফাংশনে প্রেরণ করা হয়। আপনি যদি প্যারামিটার তালিকায় "&" ব্যবহার না করেন তবে এই আসলটি মূলটির কপি হয় না তবে প্রকৃতপক্ষে অরিজিনালগুলি পাস করতে পারে। কেবলমাত্র যখন আপনি কোনও বস্তুর অভ্যন্তরীণ অংশটি খনন করবেন তখনই মূলগুলি পরিবর্তিত হবে।
এবং তারা যে উদাহরণ দেয় তা এখানে:
<?php
//The two are meant to be the same
$a = "Clark Kent"; //a==Clark Kent
$b = &$a; //The two will now share the same fate.
$b="Superman"; // $a=="Superman" too.
echo $a;
echo $a="Clark Kent"; // $b=="Clark Kent" too.
unset($b); // $b divorced from $a
$b="Bizarro";
echo $a; // $a=="Clark Kent" still, since $b is a free agent pointer now.
//The two are NOT meant to be the same.
$c="King";
$d="Pretender to the Throne";
echo $c."\n"; // $c=="King"
echo $d."\n"; // $d=="Pretender to the Throne"
swapByValue($c, $d);
echo $c."\n"; // $c=="King"
echo $d."\n"; // $d=="Pretender to the Throne"
swapByRef($c, $d);
echo $c."\n"; // $c=="Pretender to the Throne"
echo $d."\n"; // $d=="King"
function swapByValue($x, $y){
$temp=$x;
$x=$y;
$y=$temp;
//All this beautiful work will disappear
//because it was done on COPIES of pointers.
//The originals pointers still point as they did.
}
function swapByRef(&$x, &$y){
$temp=$x;
$x=$y;
$y=$temp;
//Note the parameter list: now we switched 'em REAL good.
}
?>
আমি জাভাস্ক্রিপ্টের জন্য এই বিষয়ে একটি বিস্তৃত, বিস্তারিত ব্লগ পোস্ট লিখেছি , তবে আমি বিশ্বাস করি যে এটি পিএইচপি, সি ++ এবং অন্য যে কোনও ভাষার ক্ষেত্রে একইভাবে প্রযোজ্য যেখানে লোকেরা মান দ্বারা পাসের বিষয়ে বিভ্রান্ত বলে মনে হয় রেফারেন্সের মাধ্যমে পাস pass
স্পষ্টতই, সি ++ এর মতো পিএইচপি, এমন একটি ভাষা যা রেফারেন্স দ্বারা পাস সমর্থন করে। ডিফল্টরূপে, অবজেক্টগুলি মান দ্বারা পাস হয়। ভেরিয়েবলগুলির সাথে কাজ করার সময় যা বস্তুগুলি সংরক্ষণ করে, এটি সেই পরিবর্তনশীলগুলিকে পয়েন্টার হিসাবে দেখতে সহায়তা করে (কারণ এটি সমাবেশ স্তরের মূলত যা তারা হয়)। যদি আপনি মান দ্বারা কোনও পয়েন্টারটি পাস করেন তবে আপনি এখনও পয়েন্টারটিকে "ট্রেস" করতে পারেন এবং অবজেক্টটির বৈশিষ্ট্যগুলিকে নির্দেশিত হতে পারেন mod আপনি যা করতে পারবেন না তা হ'ল এটি কোনও ভিন্ন অবজেক্টের দিকে নির্দেশ করে। আপনি যদি স্পষ্টভাবে কোনও পরামিতিটিকে রেফারেন্স দ্বারা পাস হিসাবে ঘোষণা করেন তবেই আপনি এটি করতে সক্ষম হবেন।
প্রকৃতপক্ষে উভয় পদ্ধতিই বৈধ তবে এটি আপনার প্রয়োজনের উপর নির্ভর করে referenceপরিচয় অনুসারে পাস মানগুলি আপনার স্ক্রিপ্টকে ধীর করে দেয়। সুতরাং কার্যকর করার সময় বিবেচনা করে মান দ্বারা ভেরিয়েবলগুলি পাস করা ভাল। এছাড়াও আপনি যখন মান দ্বারা ভেরিয়েবলগুলি পাস করেন তখন কোড প্রবাহ আরও সুসংগত হয়।
আপনি যখন মূল ভেরিয়েবলটি সহজেই পরিবর্তন করতে চান এবং আবার নতুন ভেরিয়েবলের সাথে তার নতুন মান নির্ধারিত করে ফিরিয়ে দিতে চান তবে এটি ফাংশনগুলির জন্য ব্যবহার করুন।
function add(&$var){ // The & is before the argument $var
$var++;
}
$a = 1;
$b = 10;
add($a);
echo "a is $a,";
add($b);
echo " a is $a, and b is $b"; // Note: $a and $b are NOT referenced
সংস্করণ উপর নির্ভর করে, 4 মান দ্বারা হয়, 5 রেফারেন্স দ্বারা হয়।