CodeMafiaさんのUdemy講座「【PHP, MYSQL, Apache】ガチで学びたい人のためのWEB開発の基礎(バックエンド編)」を学習中のSec15-199でauth.phpを書いていましたが、後から見た時に「このフィイル何だっけ?」となることを考えコメントアウトでメモを残すことに
<!-- 認証機能 -->
<?php
namespace lib;
use db\UserQuery;
use model\UserModel;
と書くと何やらエラーが…「Fatal error: Namespace declaration statement has to be the very first statement or after any declare call in the script in」名前空間の宣言はvery first~となんのことやら?検索するとすぐに出ましたが、
・namespace名前空間は最初に書け、上に何も書いてはいけない
・<?php の上にも何も書いてはいけない
とあったので
<?php
//認証機能
namespace lib;
use db\UserQuery;
use model\UserModel;
と変更したところ解決です。しかし「<?php 開始タグの上の色々書くことは今までもあったよね?」と思い
<h1>hello</h1>
<h2>hello</h2>
<?php
//認証機能
namespace lib;
use db\UserQuery;
use model\UserModel;
とするとこれも同じエラー文でしたので、どうやら“名前空間の宣言”の時にはこういうルールがあるそうです。でもなぜ?名前空間宣言の<?php開始タグ上にコメントアウトでメモを残すくらい何がいけないのか…これは謎です…
さらに色々試していて新しいパターンもありましたのでご報告
<?php
//認証機能
namespace lib;
use db\UserQuery;
use model\UserModel;
一見解決したコードに見えますが上に“改行”が入っているだけでも同じエラー文でした。Scssで&:hoverが.btn:hoverになるため& :hoverでは空白が入っていてダメなどの“空白”には厳しいが、プログラミングは改行には甘いというイメージでした。もちろんnamespace名前空間の宣言でないファイルの<?php開始タグの上に改行を入れてもエラーにはなりませんので、やはりエラー文にあるようにNamespace declarationの時に気を付ける必要があるようです。
<?php
//認証機能
namespace lib;
use db\UserQuery;
use model\UserModel;
このように<?phpタグの中でどういった改行を大丈夫でしたが、
<?php
//認証機能
use db\UserQuery;
namespace lib;
use model\UserModel;
これはブラウザで先ほどのエラー文は表示されませんが、VSCodeで「このファイルおかしくない?」のエラーが出ました。
コメント