web-dev-qa-db-ja.com

PHPクラス定数-パブリック、プライベート、または保護されていますか?

Constプロパティが自動的に公開されると仮定するのは正しいですか?それらをプライベートまたは保護する方法はありますか?

前もって感謝します。

43
user154759

歴史的に、クラス定数は、クラスがロードされ、これを変更する方法がない限り、常に公的にアクセス可能でした。

PHP 7.1の時点では、デフォルトで公開されたままですが、 アクセス修飾子が適用される可能性があります 。リリースノートの例を次に示します。

<?php
class ConstDemo
{
    const PUBLIC_CONST_A = 1;
    public const PUBLIC_CONST_B = 2;
    protected const PROTECTED_CONST = 3;
    private const PRIVATE_CONST = 4;
}
40
BoltClock

クラス定数には、プライベート/保護のオプションが必要です。パブリックであると、他のクラス/コードがパブリックであるために使用しても問題ないと誤解して使用できるクラスの内部詳細が公開されるためです。

プライベート定数の変更は、それが定義されているクラスにのみ影響することを知っておくと便利です。残念ながら、そのオプションはありません。

オブジェクトの設計と分析を学んでいたときのことを思い出してください...クラスのメソッドと属性に可能な限り最も制限的なアクセスを与え、後で必要に応じてそれらを緩和します(他のクラス/コードがそれらを使用し始めるため、他の方法に戻るのははるかに困難ですその後、他のコードを壊します)。

WORKAROUND

最善の策は、プライベート変数または保護変数を作成し、それが定数であることを示すために大文字にすることです。正しいマジックメソッド/ splインターフェイスを実装して変更されないようにするconstant($ value_to_be_constant)というクラスをいつでも作成できます。

18
Scott

この質問は6歳です

PHP 7.1(現在はRC1)を使用すると、クラス定数の可視性を指定できます。

class Token {
        // Constants default to public
        const PUBLIC_CONST = 0;

        // Constants then also can have a defined visibility
        private const PRIVATE_CONST = 0;
        protected const PROTECTED_CONST = 0;
        public const PUBLIC_CONST_TWO = 0;

        //Constants can only have one visibility declaration list
        private const FOO = 1, BAR = 2;
}

追加情報

6
mrok

php7.1以降、アクセス修飾子を使用してクラス定数を定義できます。 )(publicprivateまたはprotected)。次の例を見てください。

<?php
class superheroes{
    public const kal_el = 'Superman';
    protected const bruce_wayne = 'Batman'; # works php7.1 onwards
    private const anthony_stark = 'Iron Man'; # works php7.1 onwards

    public static function show_remaining(){
        echo self::bruce_wayne, '<br />';
        echo self::anthony_stark, '<br />';
    }
}
echo superheroes::kal_el, '<br />';
superheroes::show_remaining();

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

2
Pranav Rana