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

কি পিএইচপি ভেরিয়েবল মূল্য দ্বারা বা রেফারেন্স দ্বারা গৃহীত হয়?

0

13 উত্তর

PHP variables are assigned by value, passed to functions by value, and when containing/representing objects are passed by reference. You can force variables to pass by reference using an &

মূল্য / রেফারেন্স উদাহরণ দ্বারা বরাদ্দ:

$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?

(যে শেষ উদাহরণ সম্ভবত ভাল হতে পারে ...)

0
যোগ
"অবজেক্টস" পিএইচপি 5 এর মান নয় এবং "পাস" করা যাবে না। $ foo এর মান একটি একটি বস্তুর পয়েন্টার$ foo <�বি> মান দ্বারা প্রেরিত ফাংশন changeFoo() হিসাবে, changeFoo() হিসাবে তার প্যারামিটার ঘোষণা করা হয়নি একটি & দিয়ে
যোগ লেখক newacct, উৎস

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

By default, function arguments are passed by value (so that if the value of the argument within the function is changed, it does not get changed outside of the function). To allow a function to modify its arguments, they must be passed by reference.

To have an argument to a function always passed by reference, prepend an ampersand (&) to the argument name in the function definition.

<?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.'
?>
0
যোগ
আমি এই সন্দেহ (নবাগত) ছিল - তাই শুধু পরিষ্কার হতে, এটি $ str = add_some_extra ($ str) হিসাবে একই হবে; যদি আমি রেফারেন্স ব্যবহার করা হয় নি, না? তারপর যে বাস্তব জোড়া মূল্য কি?
যোগ লেখক Obmerk Kronen, উৎস
@ ওবর্কে যদি আপনি না রেফারেন্স দ্বারা ইম্পারসেন্ড বোঝাতে ব্যবহার করেন তবে এটি সমতুল্য হবে না। লক্ষ্য করুন কিভাবে ফাংশনটির কোনও রিটার্ন স্টেটমেন্ট নেই, তাই আপনার কোডে $ str নিরপেক্ষ করা হবে।
যোগ লেখক Kimberly W, উৎস
যদি আপনি এই ভাবে @ObmerkKronen তারপর আপনি মান ফিরে এবং এটি আপনার কোড মাধ্যমে এটিও ধরা হবে। প্রাথমিক পরিবর্তনশীল অন্যথায় একই থাকবে।
যোগ লেখক Nabeel Khan, উৎস
আমি রেফারেন্স দ্বারা পারফরম্যান্স কিছু পারফরম্যান্স উপকারিতা আছে কিনা বা না ভাবছি? আমি একটি বড় অ্যারে পাস করছি এবং ডিফল্ট দ্বারা এটি মান দ্বারা পাস হয়। সুতরাং, যদি আমি রেফারেন্স দ্বারা কল ব্যবহার করি, তাহলে কিছু পারফরম্যান্স বুদ্ধিমান সুবিধা হবে ??? (পুরো প্রক্রিয়ার সময় অ্যারের মান অপরিবর্তিত রাখা)
যোগ লেখক Choxx, উৎস
আসল উপকার হচ্ছে আপনি বহুবিধ মূল্যবোধকে মানানসই করতে পারেন। আপনি রেফারেন্স দ্বারা ভেরিয়েবলও পাস করতে পারবেন এবং এখনও ফাংশনটি কিছু ফেরত দিতে পারবেন।
যোগ লেখক MA-Maddin, উৎস

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

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

0
যোগ
ফাংশনের প্যারামিটার যদি & না থাকে তবে সব ভেরিয়েবল পিএইচপি তে মান দ্বারা প্রেরিত হয়
যোগ লেখক newacct, উৎস

মনে হচ্ছে অনেক মানুষ ফাংশনের জন্য বস্তুগুলিকে পাস করেছেন এবং রেফারেন্স দ্বারা কী পাস হয় তা নিয়ে বিভ্রান্তি ঘটে। অবজেক্ট ভেরিয়েবল এখনও মান দ্বারা প্রেরিত হয়, এটি শুধু PHP5 এ পাস করা মান হল একটি রেফারেন্স হ্যান্ডেল। প্রমাণ হিসেবে:

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

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

0
যোগ
এটি একটি প্রমাণ নয় । প্রথম উদাহরণের আউটপুট ঠিক কি আপনি আশা করবে যদি সমগ্র বস্তুর বর্তমান মান swap ফাংশন প্রেরণ করা হয়েছিল; অন্য কথায়, যদি বস্তু "মান দ্বারা পাস" হয় অন্যদিকে, এটিও ঠিক যে আপনি যদি আশা করেন যে কোন বস্তু হ্যান্ডেলটি ফাংশনে প্রেরণ করা হয়েছিল, আসলে আসলে কি হবে। আপনার কোড এই দুটি ক্ষেত্রে মধ্যে পার্থক্য করে না।
যোগ লেখক EML, উৎস
আমি মনে করি এই প্রমাণ একটি ভুল ব্যাখ্যা। মনে হচ্ছে আপনি রেফারেন্সগুলি স্যপ করার চেষ্টা করছেন বস্তুগুলি কীভাবে বরাদ্দ করা হয় তার সাথে আপনার একটি সমস্যা আছে। আপনি অপরিবর্তনীয় যা রেফারেন্স reassigning হয়। এটি যে মানটিকে নির্দেশ করে তা ভিতরের থেকে পরিবর্তিত হতে পারে। সোয়াপের redefinition এখন ** এক্স পাস হয়, যা আপনাকে * x পরিবর্তন করতে দেয়। সমস্যাটি চিন্তা করে $ x = $ y যা $ x মূলত ইঙ্গিত করে।
যোগ লেখক grantwparks, উৎস

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

0
যোগ
আমি এটা সত্য না মনে হয়।
যোগ লেখক Nick Heiner, উৎস

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

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

0
যোগ

পিএইচপি ইন, ডিফল্ট বস্তু দ্বারা রেফারেন্স কপি হিসাবে একটি নতুন বস্তু প্রেরণ করা হয়।

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

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.

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

0
যোগ
1 ম এফ, obj এর রেফারেন্সের মূল্য ফাংশন প্রেরণ করা হয়, নতুন রেফারেন্স ব্যবহার করে obj এ পরিবর্তন একই obj প্রতি নির্দেশ অন্যান্য সব রেফারেন্স প্রতিফলিত হবে। দ্বিতীয়, আবার, obj এর রেফারেন্সের VALUE ফাংশন প্রেরণ করা হয়, ফাংশন একটি নতুন obj যাও রেফারেন্সের মান পরিবর্তন করা হয়, পুরানো obj একই থাকে। 3 য় তলা, obj এর রেফারেন্স মান রেফারেন্স ফাংশন মধ্যে পাস করা হয়, এইভাবে ফাংশন পরিবর্তন একই obj উপর অপারেটিং হয়।
যোগ লেখক s-hunter, উৎস
এই পিএইচপি বস্তু কাজ পরিচালনা কিভাবে খুব ভাল চিত্রিত।
যোগ লেখক Frederik Krautwald, উৎস

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

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

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

$result=5;
changeValue($result);

echo $result; // $result is 6 here
?>
0
যোগ

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

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
0
যোগ

আপনি এটি উভয় উপায় করতে পারেন।

put a '&' symbol in front and the variable you are passing becomes one and the same as its origin. ie: you can pass by reference, rather than making a copy of it.

সুতরাং

    $fred = 5;
    $larry = & $fred;
    $larry = 8;
    echo $fred;//this will output 8, as larry and fred are now the same reference.
0
যোগ
এটি অবচিত এবং একটি সতর্কবাণী উত্পন্ন করে
যোগ লেখক fijiaaron, উৎস

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

Read here: http://www.webeks.net/programming/php/ampersand-operator-used-for-assigning-reference.html

0
যোগ
"অবজেক্টস" পিএইচপি 5 এর মান নয় এবং "পাস" করা যাবে না। সমস্ত ভেরিয়েবল মূল্য দ্বারা প্রেরণ করা হয় যদি প্রেরিত ফাংশনের প্যারামিটারে & নেই
যোগ লেখক newacct, উৎস
@ ফেইলসগাগনন-গ্রেনিয়ার: আবার, "বস্তুগুলি" মান নয় এবং "পাস" করা যাবে না। আপনি পিএইচপি 5 তে "ভ্যারিয়েবল" থাকতে পারবেন না যার মূল্য একটি "বস্তু", আপনি কেবল একটি বস্তু পাবেন যা একটি বস্তুর রেফারেন্স (যেমন একটি বস্তুর একটি পয়েন্টার)। অবশ্যই আপনি মান দ্বারা একটি বস্তুর একটি পয়েন্টার প্রেরণ বা বরাদ্দ করতে পারেন এবং এই ধরনের সংশোধন করা হয় এমন একটি পদ্ধতি কল দ্বারা পয়েন্ট এটি পয়েন্ট পরিবর্তন। রেফারেন্স দ্বারা পাসের সাথে এর কিছুই করার নেই কি ধরনের একটি মান এবং একটি প্যারামিটার পাস-দ্বারা-মান / পাস-দ্বারা-রেফারেন্স স্বতন্ত্র এবং orthogonal জিনিস হয় কিনা।
যোগ লেখক newacct, উৎস
@ ননাকাট বেশ না? অবজেক্টগুলি কিছুটা রেফারেন্স দ্বারা পাস করা । আমি মনে করি যে আমি লক্ষ্য করেছি যে PHP বস্তুগুলি সংজ্ঞায়িত করা যায় ফাংশন দ্বারা & সাথে সংজ্ঞায়িত নাও হতে পারে যখন সংজ্ঞা অনুযায়ী প্যারামিটারের সামনে - যদি তারা মূল্য দ্বারা প্রদত্ত বস্তু দ্বারা প্রদত্ত বস্তুতে অন্তর্ভুক্ত হয় যা বলা হয় এটি একটি প্যারামিটার হিসাবে ফাংশন প্রভাবিত হবে না।
যোগ লেখক Félix Gagnon-Grenier, উৎস
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() . "
"; echo 'SwapObjects: ' . $a1->getValue() . ", " . $b1->getValue() . "
";

রেফারেন্স দ্বারা পাস না হলে বৈশিষ্ট্য এখনও পরিবর্তনশীল তাই সাবধান।

আউটপুট:

সোয়াপঅবজেক্টস: বি, এ সোয়াপলাইউস: এ, বি

0
যোগ

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

0
যোগ