icon
Let's create! WordPressサイト制作とメンテ/エラー対応から、PHP/CSS/javascriptプログラミング、動画・音・イラスト等制作まで扱うコラム

【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(関数の二重定義不可)』で処理が止まります。詳しくはマニュアルとか、プログラミング学習サイトも見てみてください。

また、各種ライブラリ・フレームワークでも頻出・使われていることが多いので、覚えておいて損はないでしょう。

別の名前空間(namespace)をuseしてCall to undefined functionを発生させる方法

参考:正しい挙動(キャラのコメントがきちんとechoされる)のコード

まず最初に、正しい挙動(キャラのコメントがきちんとechoされる)のコードを見てみましょう。 『namespace callMikeyのときはhi! this is Mikey!をecho』
『namespace callStephanieのときはhi! this is Stephanie!をecho』

というコード。中の関数はどちらもcallName()ですが、関数二重定義にはなりません。ポイントは以下の部分です。

use callMikey;
callMikey\callName();

useで名前空間『callMikey』を指定したうえで、『名前空間\関数呼び出し』という書き方をしています。これを実行すると
『hi! this is Mikey!』が出力されます。

別の名前空間(namespace)をuseしてみた例

で、次のが問題のコード。この関数のechoはエラーで実行されません。ポイントは以下の部分。名前空間は『callMikey』なのに、関数呼び出しの時は『callStephanie』がついています。

use callMikey;
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
【タグ】-

関連記事