ホームページ >バックエンド開発 >PHPチュートリアル >PHPで保護された属性を取得するにはどうすればよいですか?
クラス userVo 拡張モデル {
protected $userid = array(....);
....
}
class model{
public function getVoProtectedProperties(){
userVo で保護されたプロパティ (クラスではなくオブジェクト) を取得するにはどうすればよいですか? 指 $ this はサブカテゴリのインスタンスを指します
}}}
{
$ uservo = new uservo ()
$ Uservo- & GT;
; }
----------------------------------------------- --- -----------
属性を取得するために $class_date = new ReflectionClass(get_class($this)); を使用しないでください。
オブジェクトのすべての保護された属性のフィールドの値を直接取得することは可能ですか?
ディスカッションに返信 (解決策)
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 属性を外部で取得できませんクラス
$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的话,完全可以用魔术方法来实现 }}
親クラスはサブクラスのデータを読み取ります。親から継承するサブクラスがいくつかあるためです。クラス。親クラスによって均一に解析され、解析された VO はプレゼンテーション層に渡されて処理されます。
親クラスはサブクラスのデータを読み取るだけでなく、サブクラスの属性を改ざんしたり補足したりすることもできなければなりません。
PHP は非常に動的で、迅速な開発プラットフォームに適していると感じます。