2016-07-12 2 views
0
class A 
{ 
    private $x=100; 
    private $y=200; 

} 
$a=new A(); 

$x=(array) $a; 

foreach($x as $key=>$val) 
{ 
    echo $x[$key]; 
} 

私はClass Aの変数に問題があります。phpクラスプライベートプロパティへのアクセス外部クラス

クラスオブジェクトを配列に型キャストすると、クラスの外部にある私的な変数へのアクセス。それはクラス外にアクセスすべきではありません。しかし、上記の例、私はクラスA.ここ

のプライベート変数にアクセスすることができ、結果である

100200 

は、どのように私はこの問題を解決することができますか?

+2

反射もそうすることができます。ちょうど... – FirstOne

+0

'access'はあなたがクラスでそれを操作することができることを意味しますが、プライベート/プロテクテッドメンバーでこれを行うことはできません。 – JustOnUnderMillions

+2

これをブロックする特別な理由はありますか? – FirstOne

答えて

0

あなたはプライベートメンバーにアクセスしていません。あなたが持っているのは、オブジェクトの状態を保持する配列だけです。カプセル化は保存されますが、クラスブロックの外ではprivateメンバーの操作はできません。

これで、後方に曲げてオブジェクトの状態を取得することができます。これを使って何かを行うことはできますが、それはあまり書いたクライアントです。

言語でできることは限られているため、どの言語でも良い/悪いコードを自由に書くことができます。

4

まず始めに、オブジェクト内にプライベートメンバーを配置する目的は、オブジェクト自体が内部的に絶対的な制御を持ち、特定の動作のためにその部分に依存できるようにすることです。メンバのプライバシーを保証するものではありません。なぜなら、メンバがすべての言語でアクセスできる方法があるからです(PHPが本当に簡単であっても)。

あなたがしたい場合にのみ、パブリックプロパティを公開し、独自の機能を行うことができます。

function toAccessibleElementArray($object) { 
    if (!is_object($object)) { return []; } //or other sensible default? 
    $reflectionClass = new ReflectionClass(get_class($object)); 
    $array = []; 
    foreach ($reflectionClass->getProperties() as $property) { 
     if ($property->isPublic()) { 
      $array[$property->getName()] = $property->getValue($object); 
     } 
    } 
    return $array; 
} 
+1

誰かがこれを使用する場合は、これを実行する前にis_object on $オブジェクトを必ず実行してください。 get_class(null)は現在のクラスを返しますので、このメソッドに対して本当に奇妙な結果が得られます:) – Erik

+0

@Erikは小さなチェックで更新されました。 – apokryfos

0

それは文書化行動だ:

http://www.php.net/manual/en/language.types.array.php

オブジェクトがに変換された場合配列の場合、結果は要素がオブジェクトのプロパティである配列になります。キーはメンバ変数名ですが、いくつかの例外があります:整数プロパティはアクセスできません。プライベート変数は、変数名の前にクラス名が付いています。保護された変数には、変数名の先頭に「*」が付いています。これらのプリペンドされた値は、いずれかの側にヌルバイトを持ちます。

関連する問題