3

私はこの動作を理解できません: 私のisset()チェックは、確実な値を持つ に対して常にfalseを返します!property

<?php

  class User {
    protected $userId; // always filled
    protected $userName; // always filled

    /**
     * Magic method for the getters.
     * 
     * @param type $property
     * @return \self|property
     */
    public function __get($property) {
        if (property_exists($this, $property)) {
            return $this->$property;
        } else {
            throw new Exception('property '.$property.' does not exist in '.__CLASS__.' class');
        }
    }

  }

?>

次のように別のクラスからこの変数をチェックすると:

isset($loggedUser->userName); // loggedUser is my instantiation of the User.php

戻るFALSE?? しかし__isset()、User.php で関数をオーバーロードすると、TRUE期待どおりに戻ります。

public function __isset($name)
{
    return isset($this->$name);
}

ただ明確にします:

echo $loggedUser->name;   // result "Adis"
isset($loggedUser->name); // results in FALSE, but why?

ご協力いただきありがとうございます!

4

4 に答える 4

6

protected属性は、オブジェクトのメソッド内からのみ表示されます。それらは、外部からのアクセスから見えないように隠されています。


class prot_text {
    protected $cannot_see_me;
    function see_me() {
       echo $this->cannot_see_me;
    }
}

$x = new prot_text();
echo $x->cannot_see_me; // does not work - accessing from "outside"
$x->see_me(); // works, accessing the attribute from "inside".
于 2012-10-15T16:06:53.790 に答える
5

$userName$loggedUser保護されているため、クラス外 (この例ではinitから) にアクセスできません。次のいずれかが必要です:
1) 作るpublic
2) カスタムメソッドを書く
3) magic(__isset) 関数を作る

編集: アクセスできないオブジェクト プロパティで isset() を使用する場合、__isset() オーバーロード メソッドが宣言されていれば呼び出されます。isset() php ドキュメント

これで説明がつくことを願っています。

于 2012-10-15T16:07:57.887 に答える
1

$userName は保護されているため、定義されているクラスまたはそれを拡張するクラス内からのみアクセスできます。

于 2012-10-15T16:07:07.410 に答える
1

これは、資産が保護されているためです。保護されたプロパティは、オブジェクト (または子オブジェクト) の外部からアクセスできません。オーバーロードされた関数はクラス内で定義されているため、正常に機能します。

これは OOP の機能です: ( http://php.net/manual/en/language.oop5.visibility.php ) どこからでもアクセスできるようにする場合は、プロパティを public として定義します。それ以外の場合は、その特定の関数を public でラップします。関数。

于 2012-10-15T16:07:32.287 に答える