ある日突然、下記のようなエラーが出るようになった。
Fatal error: Namespace declaration statement has to be the very first statement or after any declare call
名前空間宣言ステートメントは、最初のステートメント、または宣言呼び出しの後にある必要があります。
平たく言うと、php namespace の前にコメントやHTML等、何も記述されていてはいけない・・・ってことになるが、まったく身に覚えのないことだ。
そもそも呼び出される側の外部クラスにおいて、php namespace の前に何かを記述しなければならない理由が理解できない。
結局のところ原因は意外なところにあった。
原因:BOM付きのphpファイルとして保存されていた。いつ何時、どのタイミングでそうなったのかは不明。
BOMを外して保存し直したら一気に解決した。
喜ぶのもつかの間、今度は違うエラーが・・・
// エラー内容
Only variables should be passed by reference
変数のみを参照渡しする必要があります
エラーが出ているクラス(呼ばれる側)対処法
<?php namespace program\numbers3; class Next { static function NextFunc($Data) { $ek = count($Data) - 1; // ↓ エラー (キーの 'num' は変数ではない) $ck = array_keys(array_column($Data, 'num'), end(array_column($Data, 'num'))); // ↓対処法 $arr = array_column($Data, 'num'); // 一旦変数に代入する $ck = array_keys($arr, end($arr)); // 変数同士を使って処理 foreach($ck as $k) { if($k < $ek) { $nk = $k + 1; $nextArr[] = $Data[$nk]['num']; } } return $nextArr; } } class NextRes extends Next { static function NextResFunc($Data) { $next = parent::NextFunc($Data); $acv = array_count_values($next); arsort($acv); foreach($acv as $n => $c) { echo '<span style="color:#ff0000">' . $n . '</span>' . ' (' . $c . '回)<br />'; } } }
// 呼び出し側 use program\numbers3\NextRes; spl_autoload_register(function($class_name){ $class_name = str_replace('\\', DIRECTORY_SEPARATOR, $class_name); include __DIR__ . DIRECTORY_SEPARATOR . $class_name . '.php'; });
$data配列の内容
Array ( [0] => Array ( [num] => 4 [day] => 24 [month] => 12 [week] => 2 ) [1] => Array ( [num] => 4 [day] => 25 [month] => 12 [week] => 3 ) [2] => Array ( [num] => 3 [day] => 26 [month] => 12 [week] => 4 ) [3] => Array ( [num] => 9 [day] => 27 [month] => 12 [week] => 5 ) [4] => Array ( [num] => 3 [day] => 30 [month] => 12 [week] => 1 ) )
処理を実行
NextRes::NextResFunc($data);
6 (98回) 9 (72回) 2 (68回) 8 (68回) 0 (67回) 5 (66回) 3 (63回) 7 (61回) 4 (54回) 1 (53回)
参照渡しする際は端折りたい気持ちを抑えて変数に代入してから処理しろってことらしい。