ホームページ >バックエンド開発 >PHPチュートリアル >PHPで保護された属性を取得するにはどうすればよいですか?

PHPで保護された属性を取得するにはどうすればよいですか?

WBOY
WBOYオリジナル
2016-06-23 14:16:424467ブラウズ

クラス userVo 拡張モデル {
protected $userid = array(....);

....
}


class model{

public function getVoProtectedProperties(){

userVo で保護されたプロパティ (クラスではなくオブジェクト) を取得するにはどうすればよいですか? 指 $ this はサブカテゴリのインスタンスを指します
}}}




{
$ uservo = new uservo ()
$ Uservo- & GT;
; }

----------------------------------------------- --- -----------
属性を取得するために $class_date = new ReflectionClass(get_class($this)); を使用しないでください。
オブジェクトのすべての保護された属性のフィールドの値を直接取得することは可能ですか?



ディスカッションに返信 (解決策)

マジックメソッドを使用します。それがあなたが望むものであるかどうかはわかりません
class userVo extends model {

protected $userid = array(....)

;

protected $username = array(....);



プライベート関数 __get($property_name)
{
if(isset($this->$property_name))
{
return($this-> $property_name) ;
}else
{
return(NULL);
}

プライベート関数 __set($property_name, $value)
{
$this->$property_name = $value; }


リフレクションを使用しないと、userVo クラスにメソッド getProp を追加できます

public function getProp(){
return get_class_vars(get_class($this))
}

リフレクションがなければ、protected 属性と private 属性を外部で取得できませんクラス

get_class_vars() には、フィールドの名前が特定できないため、フィールドの変更された修飾子 protected を取得する方法がありません。私が欲しいのは、VO クラスの保護されたフィールドです。したがって、現在のメソッドは次のとおりです:


$class_date = new ReflectionClass(get_class($this));
$properties = $class_date->getProperties(ReflectionProperty::IS_PROTECTED);


しかし、私はいつも次のように感じています。オブジェクト内の保護されたフィールドの値を直接取得することについて?
安全上の理由からですか?

リフレクションを使用したくない場合は、各 VO クラスに追加の配列を追加し、配列の内容は保護された属性名であり、この配列を直接返します。

プログラミングの考え方によれば、属性名は名前が付けられず、特定のロジックで取得する必要があります。設計自体に欠陥があるのか​​?

<?phpclass userVo extends model {	protected $prote = array(		'userid' => 'id',		'username' => 'username',	);		// 而这个对象中完全可以用$this->prote['userid']来代替$this->userid}class model{	protected $prote = null;	public function getVoProtectedProperties(){		if(is_array($this->prote)) {			return array_keys($this->prote);		}	}}class Action {  public function init(){      $uservo = new userVo();       $uservo->getVoProtectedProperties();	  // 这里如果想用$uservo->userid的话,完全可以用魔术方法来实现 }}


protected 保護モードはクラス自体と派生クラスでのみアクセスできます

アプリケーションは親クラスのサブクラスの保護されたデータを読み取りますが、それ自体がルールに違反します (リフレクションの使用は違いすぎます) )

クラス間でデータを転送する必要がある場合は、シングルトン モードでコンテキスト クラスをキャリアとして設定することをお勧めします




親クラスはサブクラスのデータを読み取ります。親から継承するサブクラスがいくつかあるためです。クラス。親クラスによって均一に解析され、解析された VO はプレゼンテーション層に渡されて処理されます。

目的は次のとおりです: VO の設定、追加、削除、変更、チェックをすべて自動的に行います。したがって、VO の属性は動的に取得および解析することしかできません。

親クラスはサブクラスのデータを読み取るだけでなく、サブクラスの属性を改ざんしたり補足したりすることもできなければなりません。

PHP は非常に動的で、迅速な開発プラットフォームに適していると感じます。

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