PHP での参照

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBオリジナル
2016-06-23 14:32:29953ブラウズ

おかえりなさい!前回のコラムでは、基本的な PHP リファレンスとその使用方法を紹介しました。今週は、その基本的な紹介をさらに一歩進めて、PHP での参照のより高度な使用法のいくつかを実装します。まず、関数から参照を返す概念について説明し、次にオブジェクト内で参照を使用する方法について説明します。始めましょう。参照によって返す

先週、複数の値を返すために関数のパラメーターとして参照を使用する方法について説明しました。今週は、参照を関数の実際の戻り値として使用する方法と、これが開発者にとってどのように役立つかを見ていきます。議論を助けるために、次のクラスについて考えてみましょう:

<?php    class A {        function printmsg() {            echo  "Class is A<br>";        }    }    class B {        function printmsg() {            echo "Class is B<br>";        }    }$toolbox[] = new A();$toolbox[] = new B();?>

ご覧のとおり、A と B という 2 つの非常に単純なクラスを作成しました。それぞれのクラスには、printmsg() と呼ばれる単一のメンバー関数が含まれています。次に、各クラスのインスタンスが作成され、配列 $toolbox に保存されます。このオーバーヘッドの話はさておき、参照渡し関数について説明します。参照による戻り関数には多くの用途がありますが、今日作成する特定の関数は 1 つのパラメーター (このような単純な場合はブール値) を受け取り、上記で作成したオブジェクトの 1 つへの参照を返します。

そうですか

それで、私たちが作成したこの selectObject() 関数は正確に何をするのでしょうか?関数宣言を見ると、単一のブール値パラメーター $that が必要であることがわかりますが、関数名の前にあるアンパサンド (&) 文字は何のためにあるのでしょうか?このシンボルは、完全な変数ではなく PHP 参照を返す関数として定義します。関数内のコードを見ると、関数が前に定義した $toolbox 配列に格納されているオブジェクトの 1 つを返すことがわかります。したがって、パラメーターの値に応じて、定義したオブジェクトの 1 つへの参照を返します。

関連書籍

PHP クックブック
David Sklar、Adam Trachtenberg 著

目次
索引
サンプル章

オンラインで読む - Safari Safari でこの本を検索:
この本のみ Safari のすべて
コードフラグメントのみ

Let's take a look at how the function is actually used. As you can see above, we have initialized the variable $tool to the value that selectObject() returns. Note that we are not using the standard syntax for a variable assignment, but rather the reference-binding syntax introduced in my last column. Since selectObject() is a reference-returning function, we must treat $tool as a reference variable and assign it using the appropriate "=&" syntax. Once properly assigned, $tool now points to the same object as the first index of the $toolbox array $toolbox[0] and represents the instance of class A. The same process is used to assign the $anothertool variable to the instance of class B (we just pass false as the parameter, instead of true).

Although not particularly useful as shown, this method of using reference-returning functions is great when working with search trees or other complex data structures, by allowing the developer to search through the data structure and return a reference to the exact piece of data in question!

References in Object Constructors

Now that we've covered almost all there is to discuss regarding references, it's time to get to what probably is the most confusing reference phenomena -- referencing an object from within its constructor. Consider the following class:

<?php    class test {        function test($val) {            global $myref;            $myref = &$this;            $this->value = $val;        }        function printval() {            echo "The value of this class is '{$this->value}' <br>";        }        function setval($val) {            $this->value = $val;        }    }?>

Note that, in the constructor for this object, a global variable, $myref, is bound to a reference to $this (the pre-defined PHP reference to the object itself) and a member variable, $value, is set to the value of the passed parameter. When an instance of this class is created, a global variable, $myref, that points to this object will also be created. Hence, when this code is executed:

<?php    $myvar = new test('FooBar!');    $myvar->printval();    $myref->printval();?>

The output will be:

The value of this class is 'FooBar!'The value of this class is 'FooBar!'

Now, what if we were to change the member variable within our instance of this class? From what we have learned thus far from references, any changes made through either the $myvar->setval() or $myref->setval() member functions should effectively change both. However, when the code below is executed:

<?php    $myvar->setval('Changed the value from $myvar');    $myvar->printval();    $myref->printval();?>

The resulting output is as follows:

The value of this class is 'Change the value from $myvar'The value of this class is 'FooBar!'

Why didn't both change? The answer lies in when the object was first created. In PHP 4, the new statement does not return a reference by default. Rather, when the $myvar object was created, it returned a copy separate from the one referenced by the $myref variable. Thus, because they are separate instances of the same object, their variables are completely independent. To overcome this and achieve the desired result, we use the reference-binding operator when creating the objects, as shown:

<?php    $myvar =& new test('Foobar!');    $myvar->printval();    $myref->printval();    $myvar->setval('Now it works');    $myvar->printval();    $myref->printval();?>

And the output:

The value of this class is 'Foobar!'The value of this class is 'Foobar!'The value of this class is 'Now it works'The value of this class is 'Now it works'
That's All for Today

That's about everything there is to know about PHP references. From what I've shown you, you should be well on your way to using references to make your PHP scripts faster and more efficient, without using more code! Next week, I'll be changing gears and introducing some of the fundamental concepts around working with the browser to make your PHP pages more interactive and dynamic. See you then!

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。