क्या PHP वेरिएबल्स को मूल्य या संदर्भ द्वारा पारित किया जाता है?


जवाबों:


312

यह PHP प्रलेखन के अनुसार मूल्य के अनुसार है ।

डिफ़ॉल्ट रूप से, फ़ंक्शन तर्क मान द्वारा पारित किए जाते हैं (ताकि यदि फ़ंक्शन के भीतर तर्क का मान बदल जाए, तो यह फ़ंक्शन के बाहर नहीं बदला जाता है)। किसी फ़ंक्शन को अपने तर्कों को संशोधित करने की अनुमति देने के लिए, उन्हें संदर्भ द्वारा पारित किया जाना चाहिए।

किसी फ़ंक्शन के लिए तर्क को हमेशा संदर्भ से पारित किया जाता है, फ़ंक्शन परिभाषा में एक ampersand ( & ) को तर्क नाम के लिए प्रस्तुत करता है।

<?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
@Obmerk यदि आप संदर्भ द्वारा सूचित करने के लिए एम्परसेंड का उपयोग नहीं कर रहे हैं , तो यह समकक्ष नहीं होगा। ध्यान दें कि फ़ंक्शन का कोई रिटर्न स्टेटमेंट नहीं है, इसलिए $strआपके मामले में, इसे रिक्त रखा जाएगा।
अज्ञात देव

यदि आप इसे इस तरह करते हैं @ObmerkKronen तो आपको मूल्य वापस करना होगा और इसे अपने कोड के माध्यम से भी पकड़ना होगा। प्रारंभिक चर ही रहेगा अन्यथा।
नबील खान 20

मैं सोच रहा था कि संदर्भ से गुजरने के कुछ प्रदर्शन लाभ हैं या नहीं? मैं एक बड़ी सरणी से गुजर रहा हूं और डिफ़ॉल्ट रूप से यह मूल्य से गुजर रहा है। तो, अगर मैं संदर्भ द्वारा कॉल का उपयोग करता हूं, तो क्या कुछ प्रदर्शन वार लाभ होगा ??? (पूरी प्रक्रिया के दौरान सरणी मूल्यों को अपरिवर्तित रखते हुए)
चोक्सएक्स

4
वास्तविक लाभ यह है कि आप मुल्टेर मानों में फेरबदल / वापसी कर सकते हैं। आप संदर्भ द्वारा चर भी पास करने में सक्षम हैं और फिर भी फ़ंक्शन को कुछ वापस करने दें।
मार्टिन श्नाइडर

65

PHP में, डिफ़ॉल्ट रूप से ऑब्जेक्ट्स को एक नई ऑब्जेक्ट के संदर्भ कॉपी के रूप में पारित किया जाता है।

इसका उदाहरण देखें …………।

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
यह बहुत अच्छी तरह से दिखाता है कि PHP ऑब्जेक्ट कैसे काम करता है।
फ्रेडरिक क्राउटवल्ड

2
1 पूर्व, obj के संदर्भ का मान फ़ंक्शन पर जाता है, नए संदर्भ का उपयोग करते हुए obj में परिवर्तन उसी obj की ओर इशारा करते हुए अन्य सभी संदर्भों को प्रतिबिंबित करेगा। 2 पूर्व, फिर से obj के संदर्भ का मान फ़ंक्शन में चला गया है, फ़ंक्शन एक नए obj को इंगित करने के लिए संदर्भ के मूल्य को बदल रहा है, पुरानी obj वही रहती है। 3 पूर्व, obj के संदर्भ के मूल्य का संदर्भ फ़ंक्शन में दिया गया है, इस प्रकार फ़ंक्शन में परिवर्तन उसी ओज पर चल रहे हैं।
एस-हंटर

बिल्कुल सही उदाहरण और जैसा मैंने सोचा था वैसा ही होगा। मैं PHP (जावास्क्रिप्ट / नोड.js पृष्ठभूमि से) के लिए एक नवागंतुक हूं और कभी-कभी यह मुश्किल है कि क्या चल रहा है, लेकिन यह बहुत स्पष्ट है!
TKoL

यह उदाहरण अनावश्यक रूप से जटिल है। $yजरूरत नहीं है - इसमें ऐसा कुछ भी नहीं है function changeValueजिसके लिए अंदर होना जरूरी है class Y, ताकि दो असंबंधित अवधारणाओं को एक साथ जोड़ दिया जाए। मैं function changeValueऊपर की ओर, बाहरी दायरे में जाता हूँ $x = new X();। सभी संदर्भ निकालें $y। अब यह देखना आसान है कि पहले दो उदाहरण $ x अकेले छोड़ देते हैं, और तीसरा एक अपनी सामग्री बदलता है new Y()। यह देखना आसान होगा कि क्या आपने इस तथ्य typeको धराशायी कर दिया है $x- यह तथ्य कि एक क्षेत्र को शामिल करने के लिए दोनों ही होते हैं Xऔर यह प्रदर्शित करने के लिए भी अप्रासंगिक हैY$abc
टूलमेकरसैट

60

ऐसा लगता है कि बहुत से लोग भ्रमित हो जाते हैं जिस तरह से वस्तुओं को कार्यों के लिए पारित किया जाता है और संदर्भ साधनों से गुजरता है। ऑब्जेक्ट चर अभी भी मूल्य द्वारा पारित किए जाते हैं, इसका सिर्फ एक मूल्य जो 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

संदर्भ से पारित करने के लिए।


18
मुझे लगता है कि यह प्रमाण एक गलत व्याख्या है। ऐसा लगता है कि आप संदर्भों को स्वैप करना चाह रहे थे। आपको एक समस्या है कि ऑब्जेक्ट कैसे असाइन किए जाते हैं। आप संदर्भ को फिर से सौंप रहे हैं जो अपरिवर्तनीय है। यह वह मान है जो इसे अंदर से बदला जा सकता है। स्वैप का पुनर्परिवर्तन अब ** x पास कर रहा है, जो आपको * x बदलने की अनुमति देता है। समस्या यह सोचकर है कि $ x = $ y बदल जाएगा क्या $ x मूल रूप से इंगित करता है।
अनुदान

9
यह कोई प्रमाण नहीं है । पहले उदाहरण का आउटपुट ठीक वही है जो आप अपेक्षा करेंगे कि यदि पूरी वस्तु का वर्तमान मान swapफ़ंक्शन में चला गया था ; दूसरे शब्दों में, अगर वस्तुओं को "मूल्य से पारित किया गया था"। दूसरी ओर, यह भी ठीक है कि आप क्या अपेक्षा करेंगे यदि कोई ऑब्जेक्ट हैंडल फ़ंक्शन को दिया गया था, जो वास्तव में होता है। आपका कोड इन दो मामलों के बीच अंतर नहीं करता है।
ईएमएल

31

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

PHP 5 में एक नया ऑब्जेक्ट मॉडल है। बेहतर प्रदर्शन और अधिक सुविधाओं के लिए PHP की वस्तुओं की हैंडलिंग पूरी तरह से फिर से लिखी गई है। PHP के पिछले संस्करणों में, वस्तुओं को आदिम प्रकार (उदाहरण के लिए पूर्णांक और तार) की तरह संभाला गया था। इस पद्धति का दोष यह था कि जब चर को सौंपा गया था, या किसी विधि के पैरामीटर के रूप में पारित किया गया था, तो शब्दार्थ पूरी वस्तु की प्रतिलिपि बनाई गई थी। नए दृष्टिकोण में, वस्तुओं को हैंडल द्वारा संदर्भित किया जाता है, न कि मूल्य द्वारा (किसी वस्तु के पहचानकर्ता के रूप में हैंडल के बारे में सोच सकते हैं)।


25

PHP वेरिएबल्स को मान द्वारा असाइन किया गया है, मान द्वारा फ़ंक्शंस को पास किया गया है, और जब ऑब्जेक्ट्स का प्रतिनिधित्व करते / करते हुए संदर्भ द्वारा पारित किए जाते हैं। आप एक का उपयोग करके संदर्भों को पास करने के लिए चर को बाध्य कर सकते हैं

मूल्य / संदर्भ उदाहरण द्वारा असाइन किया गया:

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

संदर्भ परीक्षा द्वारा पास किए गए ऑब्जेक्ट चर:

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
PHP5 में "ऑब्जेक्ट" मान नहीं हैं और इसे "पारित" नहीं किया जा सकता है। का मूल्य $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

PHP5 में आदिम प्रकारों वाले चर मूल्य से पारित किए जाते हैं। ऑब्जेक्ट वाली चर को संदर्भ द्वारा पारित किया जाता है। 2006 से लिनक्स जर्नल का काफी दिलचस्प लेख है जिसमें 4 और 5 के बीच इस और अन्य OO अंतरों का उल्लेख है।

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


यदि फ़ंक्शन का पैरामीटर कोई नहीं है, तो सभी चर PHP में मान द्वारा पारित किए जाते हैं &
newacct

1

PHP 5 में संदर्भ द्वारा और PHP में मूल्य द्वारा ऑब्जेक्ट्स पारित किए जाते हैं। चर डिफ़ॉल्ट रूप से मूल्य द्वारा पारित किए जाते हैं!

यहां पढ़ें: http://www.webeks.net/programming/php/ampersand-operator-used-for-assigning-reference.html


PHP5 में "ऑब्जेक्ट" मान नहीं हैं और इसे "पारित" नहीं किया जा सकता है। यदि फ़ंक्शन का पैरामीटर पास नहीं है, तो सभी चर मूल्य से पारित किए जाते हैं &
newacct

@newacct काफी नहीं है? वस्तुओं को संदर्भ से कुछ हद तक पारित किया जाता है । मुझे लगता है कि मैंने पाया है कि php ऑब्जेक्ट्स &को परिभाषा में मापदंडों के सामने परिभाषित नहीं होने पर भी फ़ंक्शन द्वारा संशोधित किया जा सकता है - यदि उन्हें उस मान से पास किया गया है जो उस दायरे में निहित वस्तु है जो फ़ंक्शन को पैरामीटर के रूप में कहा जाता है प्रभावित नहीं होना।
फेलिक्स गगनोन-ग्रेनियर

3
@ FélixGagnon-Grenier: फिर से, "ऑब्जेक्ट" मान नहीं हैं और "पारित" नहीं किया जा सकता है। PHP5 में आपका "वैरिएबल" नहीं हो सकता है जिसका मान "ऑब्जेक्ट" है, आपके पास केवल एक वैल्यू हो सकती है जो ऑब्जेक्ट रेफरेंस (यानी किसी ऑब्जेक्ट का पॉइंटर)। बेशक आप किसी ऑब्जेक्ट के लिए एक पॉइंटर को वैल्यू द्वारा पास या असाइन कर सकते हैं और उस ऑब्जेक्ट को संशोधित कर सकते हैं जो इस तरह के संशोधन को करने वाले तरीके को कॉल करके करता है। संदर्भ से गुजरने से कोई लेना-देना नहीं है। मान किस प्रकार का है और क्या कोई पैरामीटर पास-बाय-वैल्यू / पास-बाय-रेफरेंस स्वतंत्र और ऑर्थोगोनल चीजें हैं।
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>";

विशेषताएँ अभी भी परिवर्तनीय हैं जब संदर्भ से गुजरे नहीं तो सावधान रहें।

आउटपुट:

SwapObjects: b, a SwapValues: ए, बी


1

जो कोई भी भविष्य में इस पार आता है, मैं इस रत्न को PHP डॉक्स से साझा करना चाहता हूं , जो एक गुमनाम उपयोगकर्ता द्वारा पोस्ट किया गया है :

यहां कुछ भ्रम होने लगता है। संकेत और संदर्भों के बीच का अंतर विशेष रूप से सहायक नहीं है। पहले से ही पोस्ट किए गए कुछ "व्यापक" उदाहरणों में व्यवहार को सरल शब्दों में स्पष्ट किया जा सकता है। उदाहरण के लिए, हेले का कोड वास्तव में वही कर रहा है जिसकी आपको अपेक्षा करनी चाहिए। (उपयोग> = 5.3)

पहला सिद्धांत: एक पॉइंटर एक ऑब्जेक्ट को एक्सेस करने के लिए मेमोरी एड्रेस को स्टोर करता है। किसी भी समय एक वस्तु सौंपी जाती है, एक सूचक उत्पन्न होता है। (मैंने TOO को अभी तक Zend इंजन में गहराई से नहीं उतारा है, लेकिन जहाँ तक मैं देख सकता हूँ, यह लागू होता है)

दूसरा सिद्धांत, और सबसे अधिक भ्रम का स्रोत: किसी फ़ंक्शन को एक चर पास करना डिफ़ॉल्ट रूप से मान पास के रूप में किया जाता है, अर्थात, आप एक प्रतिलिपि के साथ काम कर रहे हैं। "लेकिन वस्तुओं को संदर्भ से पारित किया जाता है!" यहाँ और जावा दुनिया में एक आम गलत धारणा। मैंने कभी WHAT की कॉपी नहीं कहा। डिफ़ॉल्ट पासिंग वैल्यू द्वारा किया जाता है। हमेशा। हालांकि, कॉपी और पास किया जा रहा है, लेकिन सूचक है। "->" का उपयोग करते समय, आप निश्चित रूप से कॉलर फ़ंक्शन में मूल वैरिएबल के समान ही एक्सेस कर रहे होंगे। बस "=" का उपयोग केवल प्रतियों के साथ खेलेंगे।

तीसरा सिद्धांत: "और" स्वचालित रूप से और स्थायी रूप से एक अन्य चर नाम / पॉइंटर को उसी मेमोरी एड्रेस पर सेट करता है जब तक कि आप उन्हें डिकॉउप नहीं करते। यहां "उपनाम" शब्द का उपयोग करना सही है। इसे कूल्हे पर दो बिंदुओं में शामिल होने के रूप में सोचें जब तक कि "अनसेट ()" के साथ जबरन अलग न हो जाए। यह कार्यक्षमता दोनों एक ही दायरे में मौजूद होती है और जब किसी फ़ंक्शन को एक तर्क दिया जाता है। अक्सर पास किए गए तर्क को "मूल्य से गुजरने" और "संदर्भ से गुजरने" के बीच कुछ अंतरों के कारण "संदर्भ" कहा जाता है, जो सी और सी ++ में स्पष्ट थे।

बस याद रखें: वस्तुओं को इंगित करता है, न कि वस्तुओं को स्वयं, कार्यों के लिए पारित किया जाता है। जब तक आप मूल पैरामीटर को वास्तव में पारित करने के लिए अपनी "" सूची में उपयोग नहीं करते हैं, तब तक ये संकेत मूल के कॉपीराइट हैं। जब आप किसी वस्तु के आंतरिक भाग में खुदाई करते हैं, तो मूल परिवर्तन होंगे।

और यहाँ उदाहरण वे प्रदान करते हैं:

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

?>

मैंने जावास्क्रिप्ट के लिए इस विषय पर एक व्यापक, विस्तृत ब्लॉग पोस्ट लिखा है , लेकिन मेरा मानना ​​है कि यह PHP, C ++, और किसी भी अन्य भाषा में समान रूप से लागू होता है जहां लोग संदर्भ के माध्यम से मूल्य बनाम पास से भ्रमित होने लगते हैं।

स्पष्ट रूप से, PHP, C ++ की तरह, एक भाषा है जो संदर्भ द्वारा पास का समर्थन करती है। डिफ़ॉल्ट रूप से, वस्तुओं को मूल्य से पारित किया जाता है। वस्तुओं को संग्रहित करने वाले चरों के साथ काम करते समय, यह उन चरों को बिंदुओं के रूप में देखने में मदद करता है (क्योंकि यह मौलिक रूप से वे क्या हैं, विधानसभा स्तर पर हैं)। यदि आप एक पॉइंटर को मान से पास करते हैं, तब भी आप पॉइंटर को "ट्रेस" कर सकते हैं और इंगित की जा रही वस्तु के गुणों को संशोधित कर सकते हैं। आप जो नहीं कर सकते हैं वह एक अलग वस्तु की ओर इशारा करता है। केवल अगर आप स्पष्ट रूप से एक पैरामीटर घोषित करते हैं तो संदर्भ द्वारा पारित किया जा सकता है, क्या आप ऐसा कर पाएंगे।


0

वास्तव में दोनों विधियां मान्य हैं लेकिन यह आपकी आवश्यकता पर निर्भर करता है। संदर्भ द्वारा मान अक्सर आपकी स्क्रिप्ट को धीमा कर देता है। इसलिए निष्पादन के समय पर विचार करके वैरिएबल को पास करना बेहतर है। जब आप चर को मान से पास करते हैं तो भी कोड प्रवाह अधिक सुसंगत होता है।


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
मुझे नहीं लगता कि यह सच है।
निक हेइनर

@ कार्ल सेगिन, यह आंशिक रूप से सच है। डिफ़ॉल्ट रूप से PHP5 ऑब्जेक्ट से पहले मूल्य द्वारा पारित किया गया था, लेकिन 5 के बाद से वे हैंडलर द्वारा पारित किए जाते हैं, जिसे व्यवहार में एक संदर्भ (कुछ अपवादों के साथ) के रूप में माना जा सकता है क्योंकि हम ऑब्जेक्ट गुणों को उनके माध्यम से संशोधित कर सकते हैं php.net/manual/en/language। oop5.references.php
एडम फ्रैना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.