【PHP学習】別の名前空間(namespace)をuseして、名前は合っているのにCall to undefined function(未定義関数エラー)を発生させる方法
| 更新: 2025/04/16 | 2218文字

今回は、以前管理人がpiza.ioで遊んでいて『関数の名前は合っているのに未定義関数エラーになる』みたいな状況を発生させていたので、その概要をまとめてお伝えします。『こういうエラー発生もありえる』ということで参考になるかはわかりませんが、さっそくコードを見ていきましょう。
目次
以前管理人がやってみた例
twitterにちょっと書いたんですけど、paiza.io上で実行して『関数の名前は合っているのに未定義関数エラーになる』というコードです。getName()っていう関数があって、それを読んでいるにもかかわらずCall to undefined functionになるといった挙動です。
『なんのこっちゃ』ってなるかもしれませんが、ポイントは名前空間(namespace)でした。
PHPの名前空間(namespace)とは?
使われる用途としては、『ライブラリとかと、自分が作ったプログラムで関数名が衝突するので、別の名前空間を定義して衝突を避ける』のような形で使われることが多いような気がします。
名前空間を分けないで同じ関数名で定義してしまうと『PHP Fatal error: Cannot redeclar(関数の二重定義不可)』で処理が止まります。詳しくはマニュアルとか、プログラミング学習サイトも見てみてください。
また、各種ライブラリ・フレームワークでも頻出・使われていることが多いので、覚えておいて損はないでしょう。
PHPマニュアル 名前空間概要
https://www.php.net/manual/ja/language.namespaces.rationale.php
PHPのキーワードnamespaceについて現役エンジニアが解説(techacademy)
https://magazine.techacademy.jp/magazine/32647
別の名前空間(namespace)をuseしてCall to undefined functionを発生させる方法
参考:正しい挙動(キャラのコメントがきちんとechoされる)のコード
まず最初に、正しい挙動(キャラのコメントがきちんとechoされる)のコードを見てみましょう。
『namespace callMikeyのときはhi! this is Mikey!をecho』
『namespace callStephanieのときはhi! this is Stephanie!をecho』
というコード。中の関数はどちらもcallName()ですが、関数二重定義にはなりません。ポイントは以下の部分です。
callMikey\callName();
useで名前空間『callMikey』を指定したうえで、『名前空間\関数呼び出し』という書き方をしています。これを実行すると
『hi! this is Mikey!』が出力されます。
別の名前空間(namespace)をuseしてみた例
で、次のが問題のコード。この関数のechoはエラーで実行されません。ポイントは以下の部分。名前空間は『callMikey』なのに、関数呼び出しの時は『callStephanie』がついています。
callStephanie\callName();
これを実行したときは『PHP Fatal error: Uncaught Error: Call to undefined function callStephanie\callStephanie\callName()』が発生します。関数名は合っているけど、名前空間が違うので未定義扱いになります。
おまけ・名前空間を分けないで、同じ名前の関数呼んでしまうと?
おまけですが、管理人も昔やらかしてたエラーを紹介。『名前空間を使わないで同じ名前の関数を作って呼ぶ』というものです。callName()を2回書いちゃっています。
これは単純に関数二重定義エラーで『PHP Fatal error: Cannot redeclare callName()』となります。衝突とはこのことです。コンピュータ側も『どっちのcallName()を呼べばいいかわからん』って感じですからね~。
あとがき・まとめ
- phpの名前空間(namespace)を使って、関数名の衝突を避けることができる
- 使うときは、useした名前空間と関数呼び出し時に指定する名前空間を合わせる
- 別の名前空間で呼んでしまうとCall to undefined functionエラー
- 名前空間を使わないで同じ名前の関数呼ぶと、Cannot redeclare 〇〇()
まとめると、こんなところでしょうか。二重定義、未定義は昔よくやらかしていましたが、こういうプログラム作ってみると発生原因がわかって楽しい・・・かもしれません。
【カテゴリ】- PHP
【タグ】-