2009-11-22 9 views
6

オブジェクトのメソッドは、同じクラスの別のオブジェクトの保護されたプロパティにアクセスできなければなりませんか?同じクラスの別のオブジェクトの保護されたプロパティにアクセスするメソッド

私はPHPでコーディングしていますが、オブジェクトの保護されたプロパティは、同じオブジェクトではなくても同じクラスのメソッドでアクセスできることを発見しました。

この例では、最初に出力に「3」が表示されます。readOtherUser関数が値に正常にアクセスした後、PHPの致命的なエラーが発生します。メインプログラムが失敗します同じ値にアクセスします。

<?php 

class user 
{ 
protected $property = 3; 

public function readOtherUser() 
{ 
    $otherUser = new user(); 
    print $otherUser->property; 
} 
} 

$user = new user(); 

$user->readOtherUser(); 
print $user->property; 

?>

これはPHPのバグですか、それが意図された動作です(と私はこの概念を再学習する必要があります... :))(事実への参照がありますか)?それは他のプログラミング言語でどのように行われますか?

ありがとうございます!

+1

NB。 Rubyの['private'](http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html#s4)は、説明したように動作します。プライベートメソッドを別のインスタンスで呼び出すことはできません。 – outis

答えて

6

これは意図したものです。同じクラスのプライベートメンバーにアクセスすることも可能です。したがって、修飾子はオブジェクト指向の修飾子ではなく、クラスごとの修飾子であると考えてください。

この機能を持つ言語は、PHPだけではありません。例えばJavaもこれを持っています。

2

これは意図した動作です。保護された変数または関数は、同じクラスまたはそのクラスから継承するすべてのクラスによってアクセス可能であることを意味します。保護されたメソッドは、クラス内からのみ呼び出すことができます。

$object = new MyClass(); 
$object->myProtectedFunction(); 

これはエラーとなります。しかし、定義されたクラス 'MyClass'の中から、保護された関数を完全に呼び出すことができます。

同じことがvariabelに適用されます。要約:

use PROTECTED on variables and functions when: 
1. outside-code SHOULD NOT access this property or function. 
2. extending classes SHOULD inherit this property or function. 
関連する問題