かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

PHP class プロパティ定義で Constant expression contains invalid operations

PHP の class を定義してたら PHP Fatal error: Constant expression contains invalid operations in … というエラーが発生してなんでや!となったのでメモ

環境

Constant expression contains invalid operations エラーになった例

<?php
class MyClass {
  private static $resourcePath = get_template_directory() . '/resources';
  public static setResourcePath(string $path) {
     if ( !is_dir($path) ) {
      throw new \InvalidArgumentException('Invalid resource path');
    }
    self::$resourcePath = $path;
  }  
  
  public function __construct() {}
}

プロパティに wordpress のテーマへのパスを持ったクラスを作っていた所 private static $resourcePath = の箇所で上記の PHP Fatal error: Constant expression contains invalid operations in … エラーが発生しました

PHP のクラスのプロパティの初期値は定数しか取れない

宣言時に初期値を設定することもできますが、 初期値は 定数 値でなければなりません。
cf. PHP: プロパティ - Manual

つまりプロパティに関数の実行が入っているのが良くなかった。と言うことっぽい

1. 定数にすればOK

定数にしてしまえば問題はない。(class 内でプロパティが定義される前に定数になっているからだと思われる)

<?php
define('RESOURCES_DIR', get_template_directory() . '/resources');
class MyClass {
  private static $resourcePath = RESOURCES_DIR;
  // ...
  
  public function __construct() {}
}

2. コンストラクタで初期値を設定する

そもそも class プロパティの初期値を設定しなければ問題にならない
static プロパティの場合インスタンス化しないと初期値が設定されないのが問題にはなるけれど…

<?php
class MyClass {
  private static $resourcePath;
  // ...
  
  public function __construct() {
    if ( empty(self::$resourcePath) ) {
      self::$resourcePath = get_template_directory() . '/resources';
    }
    // … 
  }
}

🙅 変数は class プロパティに設定できない

define で定義した定数はOKだが、変数は エラーが発生になる

<?php
class MyClass {
  private static $resourcePath = $resource_dir;
  // ...
  public function __construct() {}
}

=> Constant expression contains invalid operations
(そもそも変数のスコープの問題があるのが…)

 
三畳紀ぶりに PHP を触っているので全てを忘れている…
ドキュメントの探し方のコツも忘れているので、これじゃない情報が検索で出てきすぎて PHP つらい…

おわり₍ ᐢ. ̫ .ᐢ ₎


[参考]

最近疲れが全然取れなくて困ってる…