web-dev-qa-db-ja.com

PHPでCONSTクラスを定義するために文字列連結を使用できますか?

文字列連結を使用して、相互にグローバル定数を作成できることを知っています。

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のような自明なセットケース以外にクラス定数を相互に作成する方法はありますか?

48
selfsimilar

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

22
Trendfischer

唯一の方法は、式をdefine()し、クラスでその定数を使用することです

define('foobar', 'foo' . 'bar');

class Foo
{
    const blah = foobar;
}

echo Foo::blah;

別のオプションは、bugs.php.netにアクセスして、親切にこれを修正するよう依頼することです。

34
user187291

このようなことについては、常に信頼できるマニュアルに戻ってください。

定数 について:

値は、(たとえば)変数、プロパティ、数学演算の結果、または関数呼び出しではなく、定数式でなければなりません。

だから... "いいえ"が答えになります:D

14
Peter Bailey

class定数の場合、定数式以外を割り当てることはできません。引用 PHPマニュアル

「値は定数式である必要があり、(たとえば)変数、プロパティ、数学演算の結果、または関数呼び出しではありません。」

2
Dumb Guy

これは直接あなたが探しているものではないかもしれませんが、私はこのスレッドに出くわしたので、私が抱えていた問題に使用した解決策があります(@ user187291の回答に基づいています):

define('app_path', __DIR__ . '/../../');
const APPLICATION_PATH = app_path;
.
.
.
require_once(APPLICATION_PATH . "some_directory/some_file.php");
.
.
.

うまくいくようです!

1
MuffinTheMan

番号。

(私はないと思います)

0
Bingy