9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHPで未定義変数のプロパティにアクセスしようとするときのエラーレベルはE_NOTICE

Posted at

説明

PHPで、未定義変数またはnullを持つ変数のメンバにアクセスするコードを実行すると、そのメンバがプロパティかメソッドかでエラーのレベルが異なります。

  • プロパティ(メンバ変数)へのアクセス: Notice (E_NOTICE)
  • メソッド(メンバ関数)へのアクセス: Fatal error (E_ERROR)

これらのレベルの違うエラーがレポートされるかどうかは、error_reportingの設定によります。

そしてプログラムの制御に関しては次の違いがあります。

  • E_NOTICE: 中断しない
  • E_ERROR: 中断

背景

私は先日あるバグを調べているときに、

  • ある変数のプロパティにアクセスする部分を無事に通過し
  • その後のメソッド呼び出しでFatal errorになっている

という現象に遭遇し、なぜプロパティへのアクセスの時点でエラーにならないのか、理解できませんでした。いろいろと調べた結果、エラーレベルの違いによるということが判明しました。

実験1

sample.php
<?php
error_reporting(E_ALL & ~E_NOTICE);

$a = null; // この行がなくても同じ
echo '[', $a->someProperty, "]\n"; // レポートされない
echo '[', $a->someMethod(), "]\n"; // エラーで中断

結果

[]
[PHP Fatal error:  Call to a member function someMethod() on a non-object in /Users/wada/sample.php on line 6

実験2

sample2.php
<?php
error_reporting(E_ALL);

$a = null; // この行がなくても同じ
echo '[', $a->someProperty, "]\n"; // レポートされるが継続
echo '[', $a->someMethod(), "]\n"; // エラーで中断

結果

[PHP Notice:  Trying to get property of non-object in /Users/wada/sample2.php on line 5
]
[PHP Fatal error:  Call to a member function someMethod() on a non-object in /Users/wada/sample2.php on line 6
9
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?