schedule2020-02-03

PHP Warning Illegal string offset 'foo'

PHPでWarningが出た時のメモです。

Warning: Illegal string offset 'foo'

この警告は次のように文字列を代入した変数から配列のように値を取ろうとすると出ます。

<?php
$foo = 'bar';
if($foo['foo']){ 
    echo 'true';
}else{
    echo 'false';
}
// Output for 5.4.0 - 7.4.2
// Warning: Illegal string offset 'foo' in /in/Ck5Qk on line 3
// true

このコードを実行してみる 3v4l.org

PHP 5.4から警告が出るようになっています。

// Output for 4.3.0 - 5.3.29
// true

これがよく出る多次元配列やオブジェクトにして配列と文字列が混雑してるとデバックが大変です。この場合はgettype等で型チェックが必要。

PHPは動的型付けなんで仕方ないですね。。。IDEで型のチェックもやってもらえると助かる。

型を宣言しよう

対処として、関数の引数には型宣言を行うと良い。ちゃんとTypeErrorが出てくれる。

<?php

function hoge(array $foo){
    if($foo['foo']){
        return 'true';
    }else{
        return 'false';
    }
}
$foo = 'bar';
echo hoge($foo);
/*
Fatal error: Uncaught TypeError: Argument 1 passed to hoge() must be of the type array, string given, called in /in/fClmT on line 11 and defined in /in/fClmT:3
Stack trace:
#0 /in/fClmT(11): hoge('bar')
#1 {main}
  thrown in /in/fClmT on line 3

 Process exited with code 255.
*/

このコードを実行してみる 3v4l.org

また、調べているとWordPressでPHPのバージョンアップをしたときに多いみたい。 WordPressではプラグインのバージョンを対応させるか、問題無ければWarningの通知を切ることもできるみたいです。