2008-09-16 3 views
0

PHPでは、プロパティのスコープ外のクラスにprotected/privateプロパティへの参照を返した場合、その参照はスコープをオーバーライドしますか?PHPプロパティのスコープが参照渡しでオーバーライドされていますか?

class foo 
{ 
    protected bar = array(); 
    getBar() 
    { 
    return &bar; 
    } 

} 

class foo2 
{ 
    blip = new foo().getBar(); // i know this isn't php 
} 

は、これは正しいですし、アレイバーは、参照によって渡されていますか?

+0

私は助けるが、なぜあなたはこれをやっているだろうか、それも良いアイデアであれば... –

+0

が私を許しますが、使用することはできませんパブリック変数であり、保護された変数へのアクセスを「ハックする」必要性を失いますか?あなたがやっていることは、かなり悪い考えのように思えるかもしれません...あなたが達成しようとしていたことの詳細を私たちに話したなら、それについてもっと良い方法を見つけることができました... –

+0

これは、このプロパティにアクセスする(フラットファイルの内容に関連してdbを正規化するため)。他の99/100倍の場合は、このプロパティにアクセスし、プライベートである方が良いです。 – Karan

答えて

3

サンプルコードはPHPではありませんが、保護された変数への参照を返す場合は、その参照を使用してクラスのスコープ外のデータを変更することができます。ここでの例は次のとおり、このコードが実行されると

<?php 
class foo { 
    protected $bar; 

    public function __construct() 
    { 
    $this->bar = array(); 
    } 

    public function &getBar() 
    { 
    return $this->bar; 
    } 
} 

class foo2 { 

    var $barReference; 
    var $fooInstance; 

    public function __construct() 
    { 
    $this->fooInstance = new foo(); 
    $this->barReference = &$this->fooInstance->getBar(); 
    } 
} 
$testObj = new foo2(); 
$testObj->barReference[] = 'apple'; 
$testObj->barReference[] = 'peanut'; 
?> 
<h1>Reference</h1> 
<pre><?php print_r($testObj->barReference) ?></pre> 
<h1>Object</h1> 
<pre><?php print_r($testObj->fooInstance) ?></pre> 

print_r()結果は$testObj->fooInstanceに格納されたデータが$testObj->barReferenceに記憶されている基準を使用して、変更されたことを示すであろう。ただし、関数は参照渡しとして定義されていなければならず、呼び出しも参照を要求する必要があります。あなたはそれらの両方が必要です!ここでは、関連するページには、その上のPHPマニュアルの外にあります:

http://www.php.net/manual/en/language.references.return.php

+0

ありがとう、それは私が混乱していた表記でした(*両方の*参照タグが必要です) – Karan

関連する問題