文字列連結を使用して、相互にグローバル定数を作成できることを知っています。
define('FOO', 'foo');
define('BAR', FOO.'bar');
echo BAR;
「foobar」を出力します。
ただし、クラス定数を使用して同じことをしようとするとエラーが発生します。
class foobar {
const foo = 'foo';
const foo2 = self::foo;
const bar = self::foo.'bar';
}
foo2は問題なく定義されていますが、const barを宣言するとエラーになります
解析エラー:構文エラー、予期しない「。」、「、」または「;」が必要です
また、sprintf()などの関数を使用してみましたが、文字列連結子「。」以外の左括弧は好きではありません。
では、foo2のような自明なセットケース以外にクラス定数を相互に作成する方法はありますか?
Imho、@ jamminのおかげで、この質問はPHP 5.6 +の回答に値します comment
PHP 5.6以降、定数の静的スカラー式を定義できます:
class Foo {
const BAR = "baz";
const HAZ = self::BAR . " boo\n";
}
これは問題の一部ではありませんが、実装の制限に注意する必要があります。以下は機能しませんが、静的コンテンツです(ただし、実行時に操作される可能性があります)。
class Foo {
public static $bar = "baz";
const HAZ = self::$bar . " boo\n";
}
// PHP Parse error: syntax error, unexpected '$bar' (T_VARIABLE), expecting identifier (T_STRING) or class (T_CLASS)
class Foo {
public static function bar () { return "baz";}
const HAZ = self::bar() . " boo\n";
}
// PHP Parse error: syntax error, unexpected '(', expecting ',' or ';'
詳細については、次を参照してください: https://wiki.php.net/rfc/const_scalar_exprs および http://php.net/manual/en/language.oop5.constants .php
唯一の方法は、式をdefine()し、クラスでその定数を使用することです
define('foobar', 'foo' . 'bar');
class Foo
{
const blah = foobar;
}
echo Foo::blah;
別のオプションは、bugs.php.netにアクセスして、親切にこれを修正するよう依頼することです。
このようなことについては、常に信頼できるマニュアルに戻ってください。
定数 について:
値は、(たとえば)変数、プロパティ、数学演算の結果、または関数呼び出しではなく、定数式でなければなりません。
だから... "いいえ"が答えになります:D
class定数の場合、定数式以外を割り当てることはできません。引用 PHPマニュアル :
「値は定数式である必要があり、(たとえば)変数、プロパティ、数学演算の結果、または関数呼び出しではありません。」
これは直接あなたが探しているものではないかもしれませんが、私はこのスレッドに出くわしたので、私が抱えていた問題に使用した解決策があります(@ user187291の回答に基づいています):
define('app_path', __DIR__ . '/../../');
const APPLICATION_PATH = app_path;
.
.
.
require_once(APPLICATION_PATH . "some_directory/some_file.php");
.
.
.
うまくいくようです!
番号。
(私はないと思います)