1

何らかの理由で、子クラスで継承される静的変数を取得できません。次のスニペットは問題ないように見えますが、機能しません。

abstract class UserAbstract {
    // Class variables
    protected $type;
    protected $opts;
    protected static $isLoaded = false;
    protected static $uid = NULL;

    abstract protected function load();
    abstract protected function isLoaded();
}


class TrexUserActor extends TrexUserAbstract {
    // protected static $uid;  // All is well if I redefine here, but I want inheritance
    /**
     * Constructor
     */
    public function __construct() {
        $this->load();  
    }

    protected function load() {
        if (!$this->isLoaded()) {
            // The following does NOT work. I expected self::$uid to be available...
            if (defined(static::$uid)) echo "$uid is defined";
            else echo self::$uid . " is not defined";  

            echo self::$uid;
            exit;

            // Get uid of newly created user
            self::$uid = get_last_inserted_uid();

            drupal_set_message("Created new actor", "notice");
            // Flag actor as loaded
            self::$isLoaded = true;

            variable_set("trex_actor_loaded", self::$uid);
        } else {
            $actor_uid = variable_set("trex_actor_uid", self::$uid);
            kpr($actor_uid);
            exit;
            $actor = user_load($actor_uid);
            drupal_set_message("Using configured trex actor ($actor->name)", "notice");  
        }
    }
}

コピー/貼り付け/再フォーマット エラーの可能性は別として、上記のコードには親の静的変数がないため、どこかで詳細が欠落していると思います。

何が起こっているのかについての手がかりをいただければ幸いです。

4

2 に答える 2

2

defined定数にのみ適用されます。あなたが使用している必要がありますisset

于 2013-01-17T22:55:08.290 に答える
1

いくつかのエラーが表示されます。つまり?

if (isset(self::$uid))
    echo "\$uid: " . self::$uid . " is defined";
else
    echo "\$uid is not defined";

更新

明確にするために、@stefgosselin と @supericy が言うように、バグはdefined代わりに使用が原因でしたisset。php5.3+ ではLate Static Bindingsが追加されました。

したがって、php5.3+ では次のように動作します。

if (isset(static::$uid))
    echo "\$uid: " . static::$uid . " is defined";
else
    echo "\$uid is not defined";

そして、TrexUserActorクラス外からこれも機能します:

if (isset(TrexUserActor::$uid))
    echo "\$uid: " . TrexUserActor::$uid . " is defined";
else
    echo "\$uid is not defined";
于 2013-01-17T22:56:45.807 に答える