পিএইচপি ভেরিয়েবলগুলি মান বা রেফারেন্স দ্বারা পাস হয়?


250

পিএইচপি ভেরিয়েবলগুলি মান বা রেফারেন্স দ্বারা পাস করেছে?



উত্তর:


310

এটি পিএইচপি ডকুমেন্টেশন অনুযায়ী মান অনুসারে ।

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

সর্বদা রেফারেন্স দিয়ে কোনও ফাংশনে আর্গুমেন্ট রাখার জন্য , ফাংশন সংজ্ঞাতে আর্গুমেন্টের নামে একটি এম্পারস্যান্ড ( & ) প্রিপেন্ড করুন ।

<?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.'
?>

4
আমারও এই সন্দেহ ছিল (নবাগত) - তাই কেবল পরিষ্কার $str = add_some_extra($str);করে বলার জন্য, এটি একই হবে যদি আমি রেফারেন্সটি ব্যবহার করছিলাম না, তাই না? তাহলে এর আসল যুক্ত মূল্য কী?
ওবমের্ক ক্রোনেন

7
@ ওবর্ম্ক যদি আপনি রেফারেন্স দ্বারা বোঝাতে অ্যাম্পারস্যান্ড ব্যবহার না করে থাকেন তবে এটি সমতুল্য হবে না। খেয়াল করুন কীভাবে ফাংশনটির কোনও রিটার্নের বিবৃতি নেই, তাই $strআপনার ক্ষেত্রে এটি বাতিল হয়ে যাবে।
অজানা দেব

আপনি যদি এইভাবে @ ওবর্মক্রোনেন করে থাকেন তবে আপনাকে মানটি ফিরিয়ে দিতে হবে এবং আপনার কোডের মাধ্যমেও এটি ধরতে হবে। প্রাথমিক পরিবর্তনশীল অন্যথায় একই থাকবে।
নবেল খান

আমি ভাবছি রেফারেন্স দিয়ে পাস করার কিছু পারফরম্যান্স সুবিধা রয়েছে কিনা? আমি একটি বড় অ্যারে পাস করছি এবং ডিফল্টরূপে এটি মান দ্বারা পাস হয়। সুতরাং, আমি যদি তখন রেফারেন্সের মাধ্যমে কল ব্যবহার করি তবে কিছু কার্যকারিতা অনুসারে সুবিধা হবে কি ??? (পুরো প্রক্রিয়া চলাকালীন অ্যারের মানগুলি অপরিবর্তিত রাখা)
Choxx

4
আসল উপকারিতা হ'ল আপনি মুলিপল মানগুলি চালাতে / ফিরিয়ে আনতে পারেন। আপনি রেফারেন্স দ্বারা ভেরিয়েবলগুলি পাস করতে সক্ষম হন এবং তবুও ফাংশনটিকে কিছু ফিরিয়ে দিন।
মার্টিন স্নাইডার

65

পিএইচপি-তে, ডিফল্টরূপে অবজেক্টগুলি একটি নতুন অবজেক্টের রেফারেন্স অনুলিপি হিসাবে পাস হয়।

এই উদাহরণটি দেখুন .............

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.

আমি আশা করি আপনি এটি বুঝতে পারবেন।


1
এটি খুব ভালভাবে চিত্রিত করে যে কীভাবে পিএইচপি অবজেক্ট কাজ করে।
ফ্রেডেরিক ক্রাউটওয়াল্ড

2
1 ম প্রাক্তন, আপত্তিটির রেফারেন্সের মানটি ফাংশনে প্রেরণ করা হয়, নতুন রেফারেন্স ব্যবহার করে আপত্তিটির পরিবর্তনগুলি একই আপত্তিটিকে নির্দেশ করে অন্য সমস্ত রেফারেন্সকে প্রতিফলিত করে। ২ য় প্রাক্তন, আবার আপজের রেফারেন্সের ভ্যালুটি ফাংশনে প্রেরণ করা হয়, ফাংশনটি একটি নতুন আপত্তিতে নির্দেশকের মান পরিবর্তন করে, পুরানো আপত্তি একই থাকে। তৃতীয় প্রাক্তন, অবজেক্টের রেফারেন্সের মানের রেফারেন্সটি ফাংশনে প্রেরণ করা হয়, সুতরাং ফাংশনে পরিবর্তনগুলি একই আপত্তিতে পরিচালিত হয়।
এস-শিকারি

নিখুঁত উদাহরণ এবং ঠিক আমি যা ভেবেছিলাম তা ঘটবে। আমি পিএইচপি-তে একজন নবাগত (জাভাস্ক্রিপ্ট / নোড.জেএস ব্যাকগ্রাউন্ড থেকে) এবং কখনও কখনও কী চলছে তা আঁকানো শক্ত, তবে এটি খুব স্পষ্ট!
TKoL

এই উদাহরণটি অহেতুক জটিল। $yপ্রয়োজন নেই - এর অভ্যন্তরে থাকা কোনও function changeValueপ্রয়োজন নেই class Y, যাতে দুটি সম্পর্কযুক্ত ধারণা একসাথে জড়িয়ে যায়। আমি function changeValueঠিক উপরের দিকে বাইরের স্কোপে চলে যাব $x = new X();। সমস্ত উল্লেখ মুছে ফেলুন $y। এখন এটি দেখতে আরও সহজ যে প্রথম দুটি উদাহরণ একা x alone রেখে যায় এবং তৃতীয়টি এর বিষয়বস্তুতে এতে পরিবর্তন করে new Y()। কোনটি আপনি ডাম্প দেখতে সহজ হবে typeএর $x- যে উভয় Xএবং Yএকটি অন্তর্ভুক্ত ঘটতে $abcক্ষেত্র এছাড়াও প্রদর্শিত হয় কি অবান্তর নয়
ToolmakerSteve

60

দেখে মনে হচ্ছে অনেক লোক বিভ্রান্ত হয়ে পড়েছে যেভাবে অবজেক্টগুলিকে ফাংশনগুলিতে পাঠানো হয় এবং রেফারেন্সের মাধ্যমে কী পাস হয়। অবজেক্ট ভেরিয়েবলগুলি এখনও মান দ্বারা পাস করা হয়, এর কেবলমাত্র মান যা পিএইচপি 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

রেফারেন্স দ্বারা পাস করার জন্য।


18
আমি মনে করি এই প্রমাণটি একটি ভুল ব্যাখ্যা। দেখে মনে হচ্ছে আপনি রেফারেন্স অদলবদল করার চেষ্টা করছেন। কীভাবে অবজেক্টগুলি বরাদ্দ করা হয়েছে তাতে আপনার একটি সমস্যা রয়েছে। আপনি রেফারেন্সটিকে পুনরায় নিয়োগ দিচ্ছেন যা পরিবর্তনযোগ্য। এটি যে মানটিকে এটি নির্দেশ করে তা ভিতরে থেকে পরিবর্তন করা যায়। অদলবদলের পুনঃনির্ধারণ এখন ** এক্স পার করছে যা আপনাকে * x পরিবর্তন করতে দেয়। সমস্যাটি ভাবতে হচ্ছে যে $ x = $ y change x মূলত কী নির্দেশ করে তা পরিবর্তন করবে।
গ্র্যান্টপর্পস

9
এটি একটি প্রমাণ নয় । প্রথম উদাহরণটির আউটপুট হ'ল আপনি যদি প্রত্যাশা করতেন যে পুরো অবজেক্টের বর্তমান মানটি যদি swapফাংশনে প্রেরণ করা হয় ; অন্য কথায়, যদি বস্তুগুলি "মান দ্বারা পাস করা হয়"। অন্যদিকে, কোনও বস্তুর হ্যান্ডেলটি যদি ফাংশনে প্রেরণ করা হয় তবে আপনি যা আশা করেন ঠিক এটিই ঘটে যা আসলে ঘটে actually আপনার কোড এই দুটি ক্ষেত্রে পার্থক্য করে না।
EML

31

http://www.php.net/manual/en/migration5.oop.php

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


25

পিএইচপি ভেরিয়েবলগুলি মান দ্বারা নির্ধারিত হয়, মান অনুসারে ফাংশনগুলিতে প্রেরণ করা হয় এবং যখন অবজেক্ট / প্রতিনিধিত্ব করে থাকে / রেফারেন্স দ্বারা পাস করা হয়। আপনি একটি & এর সাহায্যে ভেরিয়েবলকে রেফারেন্স দিয়ে যেতে বাধ্য করতে পারেন

মান / রেফারেন্স উদাহরণ দ্বারা নির্ধারিত:

$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

(এটি শেষ উদাহরণ সম্ভবত আরও ভাল হতে পারে ...)


2
"অবজেক্টস" পিএইচপি 5 এ মান হয় না এবং "পাস" করা যায় না। এর মান $fooএকটি হল একটা অবজেক্ট পয়েন্টার$fooহয় মান দ্বারা গৃহীত ফাংশন changeFoo(), যেমন changeFoo()একটি সঙ্গে তার পরামিতি ঘোষণা করা হয়নি &
newacct

9

আপনি রেফারেন্স দ্বারা একটি ফাংশন একটি পরিবর্তনশীল পাস করতে পারেন। এই ফাংশনটি আসল ভেরিয়েবলটি সংশোধন করতে সক্ষম হবে।

আপনি ফাংশন সংজ্ঞা রেফারেন্স দ্বারা উত্তরণ সংজ্ঞায়িত করতে পারেন:

<?php
function changeValue(&$var)
{
    $var++;
}

$result=5;
changeValue($result);

echo $result; // $result is 6 here
?>

6

আপনি এটি যেভাবেই করতে পারেন।

সামনে একটি '&' চিহ্ন রাখুন এবং আপনি যে ভেরিয়েবলটি পার করছেন সেটি তার উত্সের মতো হয়ে যায়। যেমন: আপনি এর অনুলিপি তৈরির পরিবর্তে রেফারেন্স দিয়ে পাস করতে পারেন।

সুতরাং

    $fred = 5;
    $larry = & $fred;
    $larry = 8;
    echo $fred;//this will output 8, as larry and fred are now the same reference.


5

আদিম প্রকারযুক্ত ভেরিয়েবলগুলি পিএইচপি 5 এর মান দ্বারা পাস হয়। অবজেক্টযুক্ত ভেরিয়েবলগুলি রেফারেন্স দ্বারা পাস হয়। ২০০ Linux সাল থেকে লিনাক্স জার্নালের একটি আকর্ষণীয় নিবন্ধ রয়েছে যা এতে 4 এবং 5 এর মধ্যে অন্যান্য ওও পার্থক্য উল্লেখ করে।

http://www.linuxjournal.com/article/9170


সমস্ত ভেরিয়েবলগুলি পিএইচপি-তে মান দ্বারা পাস করা হয় যদি ফাংশনের প্যারামিটারটিতে কোনও থাকে না &
newacct

1

অবজেক্টগুলি পিএইচপি 5 এ রেফারেন্স দ্বারা এবং পিএইচপি 4 এর মান দ্বারা পাস করা হয়! ভেরিয়েবলগুলি ডিফল্টরূপে মান দ্বারা পাস হয়!

এখানে পড়ুন: http://www.webeks.net/programming/php/ampersand-operator-used-for-assigning-references.html


"অবজেক্টস" পিএইচপি 5 এ মান হয় না এবং "পাস" করা যায় না। সমস্ত ভেরিয়েবলগুলি মান দ্বারা পাস হয় যদি ফাংশনটির প্যারামিটারটি পাস না করে &
newacct

@ নিউট্যাক্ট বেশ নয়? বিষয়গুলি কিছুটা রেফারেন্স দ্বারা পাস করা হয় । আমি মনে করি যে আমি পিএইচপি অবজেক্টগুলি সংজ্ঞায়িত &প্যারামিটারের সামনে সংজ্ঞায়িত না হলেও এমনকি ফাংশনগুলির দ্বারা সংশোধন করা যেতে পারে - যদি সেগুলি যদি পরামিতি হিসাবে ফাংশনটিকে ডেকে আনে এমন ক্ষেত্রটিতে থাকা অবজেক্টটি মান দ্বারা পাস করা হয় তবে ক্ষতিগ্রস্থ হবে না।
ফলিক্স গ্যাগন-গ্রেনিয়ার

3
@ ফালিক্সগ্যাগন-গ্রেনিয়ার: আবারও "অবজেক্টস" মান হয় না এবং "পাস" করা যায় না। আপনার পিএইচপি 5 তে কোনও "ভেরিয়েবল" থাকতে পারে না যার মান একটি "অবজেক্ট", আপনার কেবল একটি মান থাকতে পারে যা কোনও অবজেক্ট রেফারেন্স (অর্থাত্ কোনও বস্তুর প্রতি নির্দেশক)। অবশ্যই আপনি মান দ্বারা কোনও বস্তুর কাছে একটি পয়েন্টার নির্ধারণ করতে পারেন বা নির্ধারণ করতে পারেন এবং এমন কোনও পদ্ধতিতে কল করে যে বস্তুটিকে এটি নির্দেশ করে সেটি সংশোধন করতে পারে। রেফারেন্স দিয়ে পাস করার সাথে এর কোনও যোগসূত্র নেই। মান কী টাইপ এবং কোনও পরামিতি পাস-বাই-ভ্যালু / পাস-বাই-রেফারেন্স কিনা তা স্বাধীন এবং অরথোগোনাল জিনিস।
newacct

1
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>";

রেফারেন্সের মাধ্যমে পাস না হলে বৈশিষ্ট্যগুলি এখনও সংশোধনযোগ্য তাই সাবধান হন।

আউটপুট:

স্বাপবজেক্টস: বি, একটি অদলবদল: ক, খ


1

ভবিষ্যতে যে কারও কাছে এটি আসার জন্য, আমি একজন অনামী ব্যবহারকারী পোস্ট করা পিএইচপি ডক্স থেকে এই রত্নটি ভাগ করতে চাই :

এখানে কিছুটা বিভ্রান্তি মনে হচ্ছে। পয়েন্টার এবং রেফারেন্সের মধ্যে পার্থক্যটি বিশেষভাবে সহায়ক নয়। ইতোমধ্যে পোস্ট করা কিছু "বিস্তৃত" উদাহরণগুলির আচরণটি সহজতর একত্রিত শর্তে ব্যাখ্যা করা যেতে পারে। উদাহরণস্বরূপ, হেইলির কোডটি আপনার যা প্রত্যাশা করা উচিত তা হুবহু করছেন। (ব্যবহার করে> = 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 আপনি যা করতে পারবেন না তা হ'ল এটি কোনও ভিন্ন অবজেক্টের দিকে নির্দেশ করে। আপনি যদি স্পষ্টভাবে কোনও পরামিতিটিকে রেফারেন্স দ্বারা পাস হিসাবে ঘোষণা করেন তবেই আপনি এটি করতে সক্ষম হবেন।


0

প্রকৃতপক্ষে উভয় পদ্ধতিই বৈধ তবে এটি আপনার প্রয়োজনের উপর নির্ভর করে referenceপরিচয় অনুসারে পাস মানগুলি আপনার স্ক্রিপ্টকে ধীর করে দেয়। সুতরাং কার্যকর করার সময় বিবেচনা করে মান দ্বারা ভেরিয়েবলগুলি পাস করা ভাল। এছাড়াও আপনি যখন মান দ্বারা ভেরিয়েবলগুলি পাস করেন তখন কোড প্রবাহ আরও সুসংগত হয়।


0

আপনি যখন মূল ভেরিয়েবলটি সহজেই পরিবর্তন করতে চান এবং আবার নতুন ভেরিয়েবলের সাথে তার নতুন মান নির্ধারিত করে ফিরিয়ে দিতে চান তবে এটি ফাংশনগুলির জন্য ব্যবহার করুন।

function add(&$var){ // The &amp; 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

-7

সংস্করণ উপর নির্ভর করে, 4 মান দ্বারা হয়, 5 রেফারেন্স দ্বারা হয়।


11
আমি এটা সত্য মনে করি না।
নিক হেইনার

@ কার্ল সেগুইন, এটি আংশিক সত্য। ডিফল্টরূপে পিএইচপি 5 অবজেক্টটি মান দ্বারা পাস করার আগে 5 থেকে তারা হ্যান্ডলার দ্বারা পাস হয়, যা বাস্তবে একটি রেফারেন্স হিসাবে বিবেচনা করা যেতে পারে (কিছু ব্যতিক্রম সহ) কারণ আমরা তাদের মাধ্যমে php.net/manual/en/language এর মাধ্যমে অবজেক্টের বৈশিষ্ট্যগুলি সংশোধন করতে পারি। oop5.references.php
অ্যাডাম ফারিনা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.