web-dev-qa-db-ja.com

PHP-クラス内の定数を定義

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

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

(そして、MYCONSTANTのように呼び出されると無視されます)

76
Alex

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

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を単独でエコーすると、未定義の定数に関する通知が発生し、文字列に変換されたconstant名が出力されます:"MYCONSTANT"


[〜#〜] edit [〜#〜]-おそらくあなたが探しているのはこれです 静的プロパティ/変数

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"
119
Alix Axel

これは昔からの質問ですが、今ではPHP 7.1で常に可視性を定義できます。

[〜#〜] example [〜#〜]

<?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;
?>

上記の例の出力PHP 7.1:

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

注:PHP 7.1.0可視性修飾子はクラス定数に使用できます。

詳細 こちら

18
matiaslauriti
_class Foo {
    const BAR = 'baz';
}

echo Foo::BAR;
_

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

Foo::baz()->BARのような構文を実現するには、propertyFooを持つクラスBARの関数baz()からオブジェクトを返す必要があります。しかし、それは一定ではありません。定義するconstantは常にどこからでもグローバルにアクセスでき、関数呼び出しの結果に制限することはできません。

10
deceze

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

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

class Foo {

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

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

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

final class Constants {

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

class Foo {

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

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

Foo::app()->MYCONSTANT();
6
Wouter van Dam

PHPでクラス定数を定義できます。ただし、クラス定数は、オブジェクトインスタンスからもアクセスできます。これはphpの機能です。ただし、php7.1の時点では、access modifierspublicprivate、またはprotected)を使用してクラス定数を定義できます。

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

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

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

3
Pranav Rana