3

値がtrueまたはfalseのいずれかで、変更されないクラス構造があり、現在変数として実装されている場合は、次のような定数に変更することをお勧めします。

class Parent {
    const BOOL_CONST = false;

    ...
}

class SomeChild extends Parent {
    const BOOL_CONST = true;

    ...
}

後で、そのクラス階層内の任意のタイプのオブジェクト(親またはその子の1つ)があり、「SomeChild」のように、値がtrueになるようにオーバーロードした子もあります。

クラスを知らなくても定数にアクセスできる方法はありますか?言い換えれば、私は次のようなことをすることができます:

$object->BOOL_CONST

または、実際には変更すべきではないのに、これらの値を変数のままにしておく方がよいでしょうか。

アップデート

私が尋ねようとしていたことをよりよく表現するために、上記の質問を言い換えました。

4

5 に答える 5

7

クラスを知らなくても定数にアクセスできる方法はありますか?言い換えれば、私は次のようなことをすることができます:

はい、定数を参照するには、次の構成を使用する必要があります。

  • self :: NAME_OF_CONSTANT:このクラスで定義された定数を教えてください。定義しない場合は、親から入手してください
  • static :: NAME_OF_CONSTANT:このクラスでのみ定義された定数を教えてください。私の親にそれを決して見ないでください
  • parent :: NAME_OF_CONSTANT:親クラスでのみ定義された定数を教えてください。決して自分自身にそれを求めない

ところで、あなたは「オーバーロード」という用語を使用しました。しかし、あなたは「上書きされた」と言うつもりだったと思います。オーバーロードは、オブジェクト指向言語では異なる意味を持ちます。

于 2012-03-30T20:39:29.653 に答える
2

二重コロンによるアクセスとして一定:​​:

Parent::BOOL_CONST

SomeChild::BOOL_CONST

within the class
parent::BOOL_CONST  
self::BOOL_CONST
于 2012-03-30T15:12:33.460 に答える
1

いいえ、オブジェクトコンテキストから定数にアクセスすることはできませんが、リフレクションを使用して$ objectのクラスを取得し、::を使用してBOOL_CONSTを取得することはできます。それで:

$class = get_class($object);
$class::BOOL_CONST;

さて、いいえ、それは技術的に反映されていません。また、$ class ::が正しく解決されるかどうかは100%わかりません。上記が機能しない場合は、実際のReflectionClassクラスを使用してください。

于 2012-03-30T15:13:38.063 に答える
1

$object->BOOL_CONSTクラス定数は静的に呼び出す必要があるため、を行うことはできません( SomeChild::BOOLCONSTANT)。

ただし、次のようなことを試すことができます。//編集:これは機能します:)

$class = get_class($object);
$const = $class::BOOL_CONST;
于 2012-03-30T15:14:27.150 に答える
1

PHP 5.3は、オブジェクトをクラス参照として受け入れるようになりました:$this::BOOL_CONSTが受け入れられるようになりました。

//
// http://php.net/manual/en/language.oop5.constants.php
//
// As of PHP 5.3.0, it's possible to
// reference the class using a variable.
// The variable's value can not be a keyword
// (e.g. self, parent and static). 
//

// I renamed "Parent" class name to "constantes"
// because the classname "Parent" can be confused with "parent::" scope
class constantes
{
    const  test                     = false;
}

// I renamed "SomeChild" too, with no reason...
class OverloadConst extends constantes
{
    const test                      = true;
    public function waysToGetTheConstant()
    {
        var_dump(array('$this'=>$this::test));    // true, also usable outside the class
        var_dump(array('self::'=>self::test));    // true, only usable inside the class
        var_dump(array('parent::'=>parent::test));    // false, only usable inside the class
        var_dump(array('static::'=>static::test));    // true, should be in class's static methods, see http://php.net/manual/en/language.oop5.late-static-bindings.php
    }
}

// Classic way: use the class name
var_dump(array('Using classname'    => OverloadConst::test));

// PHP 5.3 way: use the object
$object = new OverloadConst();
var_dump(array('Using object'       => $object::test));
$object->waysToGetTheConstant();

クラス定数はオーバーライドできますが、インターフェース定数はオーバーライドできないことに注意してください。constantesを実装するインターフェイスの 場合OverloadConsts、そのconst test(またはBOOL_CONST)をオーバーライドすることはできません。

ソース

于 2014-06-24T13:00:37.417 に答える