PHP-クラス内で定数を定義する


88

クラス内で定数を定義し、クラスコンテキストで呼び出されたときにのみ表示されるようにするにはどうすればよいですか?

....何かのようなもの Foo::app()->MYCONSTANT;

(そしてMYCONSTANT無視されるように呼び出された場合)


3
私はこの問題は最近持っていたstackoverflow.com/q/5710676/560299
伊武

回答:


140

クラス定数を参照してください:

class MyClass
{
    const MYCONSTANT = 'constant value';

    function showConstant() {
        echo  self::MYCONSTANT. "\n";
    }
}

echo MyClass::MYCONSTANT. "\n";

$classname = "MyClass";
echo $classname::MYCONSTANT. "\n"; // As of PHP 5.3.0

$class = new MyClass();
$class->showConstant();

echo $class::MYCONSTANT."\n"; // As of PHP 5.3.0

この場合、エコーMYCONSTANT自体が未定義の定数に関する通知を生成し、文字列に変換された定数名を出力します"MYCONSTANT"


編集-おそらくあなたが探しているのはこの静的プロパティ/変数です

class MyClass
{
    private static $staticVariable = null;

    public static function showStaticVariable($value = null)
    {
        if ((is_null(self::$staticVariable) === true) && (isset($value) === true))
        {
            self::$staticVariable = $value;
        }

        return self::$staticVariable;
    }
}

MyClass::showStaticVariable(); // null
MyClass::showStaticVariable('constant value'); // "constant value"
MyClass::showStaticVariable('other constant value?'); // "constant value"
MyClass::showStaticVariable(); // "constant value"

しかし、クラスの関数内でそれを定義することは機能しません:(
Alex

@Alex:いいえ、そうではありません(AFAIK、あいまいな方法があるかもしれません)。
Alix Axel

3
(is_null(self::$staticVariable) === true) && (isset($value) === true)のようにはるかに簡潔になりself::$staticVariable === null && $value !== nullます。$value常に関数内に設定されるため、を使用する必要はありませんisset。そして、hyper-explicit=== trueは何も追加しません。
deceze

1
以前にこの会話をしたことがありますか?それを助けることはできません、私はそのスタイルが本当に嫌いです。; -D
–deceze

@deceze:はい。私はこのスタイルに非常に慣れていて、それは私のために働くので、私はそれに固執するつもりですが、あなたも正しいです。=)
Alix Axel

24

これは古い質問ですが、PHP 7.1では、一定の可視性を定義できます。

<?php
class Foo {
    // As of PHP 7.1.0
    public const BAR = 'bar';
    private const BAZ = 'baz';
}
echo Foo::BAR . PHP_EOL;
echo Foo::BAZ . PHP_EOL;
?>

上記の例のPHP7.1での出力:

バー

致命的なエラー:キャッチされないエラー:プライベートconst Foo :: BAZにアクセスできません…

注: PHP 7.1.0以降、クラス定数に可視性修飾子が許可されています。

詳細はこちら


11
class Foo {
    const BAR = 'baz';
}

echo Foo::BAR;

これは、クラス定数を作成する唯一の方法です。これらの定数はFoo::BAR、を介して常にグローバルにアクセスできますが、を介してアクセスすることはできませんBAR

のような構文を実現するには、プロパティを持つクラスFoo::baz()->BARの関数からオブジェクトを返す必要があります。しかし、それは一定ではありません。任意の定数あなたが定義するには、常にどこからでも世界的にアクセス可能であり、関数呼び出しの結果に制限することはできません。baz()Foo BAR


6

これはかなり古い質問ですが、おそらくこの答えは他の誰かを助けることができます。

次のように、事前定義された値を返すメソッドにfinalキーワードを適用することにより、クラススコープ内で制限されているパブリック定数をエミュレートできます。

class Foo {

    // This is a private constant
    final public MYCONSTANT()
    {
        return 'MYCONSTANT_VALUE';
    }
}

メソッドのfinalキーワードは、拡張クラスがメソッドを再定義するのを防ぎます。クラス宣言の前にfinalキーワードを配置することもできます。その場合、キーワードはクラスの継承を防ぎます。

Alexが探していたものをほぼ正確に取得するには、次のコードを使用できます。

final class Constants {

    public MYCONSTANT()
    {
        return 'MYCONSTANT_VALUE';
    }
}

class Foo {

    static public app()
    {
        return new Constants();
    }
}

エミュレートされた定数値には、次のようにアクセスできます。

Foo::app()->MYCONSTANT();

3

phpでクラス定数を定義できます。ただし、クラス定数には、どのオブジェクトインスタンスからもアクセスできます。これがphpの機能です。しかし、のようphp7.1、あなたがあなたのクラス定数を定義することができ、アクセス修飾子publicprivateまたはprotected)。

回避策は、定数をprivateまたはとして定義し、protectedを介して読み取り可能にすることstatic functionです。この関数は、静的コンテキストから呼び出された場合にのみ定数値を返す必要があります。

親クラスでこの静的関数を作成し、他のすべてのクラスでこの親クラスを継承して、デフォルトの機能にすることもできます。

クレジット:http//dwellupper.io/post/48/defining-class-constants-in-php

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.