クラス内で定数を定義し、クラスコンテキストで呼び出されたときにのみ表示されるようにするにはどうすればよいですか?
....何かのようなもの Foo::app()->MYCONSTANT;
(そしてMYCONSTANT
無視されるように呼び出された場合)
回答:
クラス定数を参照してください:
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"
(is_null(self::$staticVariable) === true) && (isset($value) === true)
のようにはるかに簡潔になりself::$staticVariable === null && $value !== null
ます。$value
常に関数内に設定されるため、を使用する必要はありませんisset
。そして、hyper-explicit=== true
は何も追加しません。
これは古い質問ですが、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以降、クラス定数に可視性修飾子が許可されています。
詳細はこちら
これはかなり古い質問ですが、おそらくこの答えは他の誰かを助けることができます。
次のように、事前定義された値を返すメソッドに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();
phpでクラス定数を定義できます。ただし、クラス定数には、どのオブジェクトインスタンスからもアクセスできます。これがphpの機能です。しかし、のようphp7.1、あなたがあなたのクラス定数を定義することができ、アクセス修飾子(public
、private
またはprotected
)。
回避策は、定数をprivate
またはとして定義し、protected
を介して読み取り可能にすることstatic function
です。この関数は、静的コンテキストから呼び出された場合にのみ定数値を返す必要があります。
親クラスでこの静的関数を作成し、他のすべてのクラスでこの親クラスを継承して、デフォルトの機能にすることもできます。
クレジット:http://dwellupper.io/post/48/defining-class-constants-in-php