違い - php 変数 宣言




参考資料-このエラーはPHPで何を意味していますか? (20)

これは何ですか?

これは、PHPをプログラミングする際に遭遇する可能性のある警告、エラー、および注意事項に関する多くの回答であり、修正する手がかりがありません。 これはコミュニティWikiでもあり、誰もがこのリストの追加と管理に参加するよう呼びかけられています。

どうしてこれなの?

Stack Overflowで「Headers already sent」「non-objectのメンバーを呼び出す といった質問が頻繁にポップアップします 。 これらの質問の根本的な原因は常に同じです。 したがって、これらの質問に対する回答は、通常、それらを繰り返し、その特定のケースでどのラインを変更するのかをOPに示します。 これらの回答は、OPの特定のコードにのみ適用されるため、サイトに価値を追加するものではありません。 同じエラーを持つ他のユーザーは、ローカライズされているため、ソリューションを簡単に読み取ることができません。 根本的な原因を理解すれば、エラーを修正するのは簡単ではないので、悲しいです。 したがって、このリストは一般的な方法で解を説明しようとします。

私はここで何をすべきですか?

あなたの質問がこれの複製としてマークされている場合は、以下のエラーメッセージを見つけて、あなたのコードに修正を適用してください。 一般的な回答だけでは明らかではない場合に備えて、通常、回答にはさらに調査するためのリンクが含まれています。

貢献したい場合は、「お気に入り」のエラーメッセージ、警告または通知、回答ごとに1つ、簡単な説明(マニュアルページの用語を強調表示しているにすぎない)、可能な解決方法またはデバッグ方法、価値のある既存のQ&Aのリスト。 また、既存の回答を自由に改善してください。

リスト

また見てください


MySQL:SQL構文に誤りがあります。 あなたのMySQLサーバのバージョンに対応するマニュアルをチェックし、正しい構文が近いところで使用するようにしてください...

このエラーは、MySQLクエリに渡されたデータを適切にエスケープするのを忘れたためによく発生します。

ないことの例(「悪い考え」):

$query = "UPDATE `posts` SET my_text='{$_POST['text']}' WHERE id={$_GET['id']}";
mysqli_query($db, $query);

このコードは、 http://example.com/edit.php?id=10 =10(投稿番号10を編集する)などのURLを使用して、送信するフォームのページに含めることができます。

送信されたテキストに一重引用符が含まれているとどうなりますか? $queryは次のようになり$query

$query = "UPDATE `posts` SET my_text='I'm a PHP newbie' WHERE id=10';

このクエリがMySQLに送信されると、真ん中に余分な一重引用符があるため、構文が間違っていると不平を言うでしょう。

このようなエラーを回避するには、クエリで使用する前に常にデータをエスケープする必要があります。

SQL問合せで使用する前にデータをエスケープすることも非常に重要です。そうしないと、スクリプトにSQLインジェクションが開かれるためです。 SQLインジェクションは、レコード、テーブル、またはデータベース全体の変更、紛失または変更を引き起こす可能性があります。 これは非常に深刻なセキュリティ上の問題です。

ドキュメンテーション:


コードが実行されない/私のPHPコードの部分が出力されるように見える

あなたのPHPコードの結果が何も表示されない場合や、あなたのリテラルPHPソースコードの出力の一部がWebページに表示されている場合は、PHPが実際に実行されていないことを確かめることができます。ブラウザでソースを表示すると、おそらくPHPソースコードファイル全体がそのまま表示されます。PHPコードは<?php ?>タグに埋め込まれているので、ブラウザはそれらをHTMLタグとして解釈しようとしますが、結果はやや混乱して見えるかもしれません。

実際にPHPスクリプトを実行するには、次のものが必要です。

  • あなたのスクリプトを実行するWebサーバー
  • ファイル拡張子を.phpに設定する。そうでなければ、Webサーバーはそれをそのように解釈しない*
  • Webサーバー経由で.phpファイルにアクセスする

*再設定しない限り、すべてを設定できます。

この最後のものは特に重要です。ファイルをダブルクリックするだけで、次のようなアドレスを使用してブラウザで開くことができます。

file://C:/path/to/my/file.php

これは実行中のWebサーバーを完全にバイパスしており、ファイルは解釈されません。Webサーバ上のファイルのURLを訪問する必要があります。

http://localhost/my/file.php

また、あなたは短いオープンタグを使用しているかどうかをチェックすることをお勧めします<?代わりに<?phpして、PHPの設定が短いオープンタグをオフにしています。

PHPコードが実行されていないことを参照してください。代わりにページにコードが表示されます。


注意:初期化されていない文字列オフセット: *

名前が示しているように、このようなタイプのエラーは、反復処理しようとする可能性が最も高い場合、または存在しないキーを持つ配列から値を見つける場合に発生します。

$stringからすべての文字を表示しようとしてい$string

$string = 'ABCD'; 
for ($i=0, $len = strlen($string); $i <= $len; $i++){
    echo "$string[$i] \n"; 
}

上の例は、( オンラインデモ )を生成します

A
B
C
D
Notice: Uninitialized string offset: 4 in XXX on line X

そして、スクリプトがDをエコーし​​終えるとすぐに、 for()ループの中でPHPにあなたに'ABCD'文字列の最初から5番目の文字を表示するように指示しているので、エラーは発生しますが、ループは0から数え始め、 4に達するまでにDをエコーすると、オフセットエラーが発生します。

同様のエラー:

  • 不正な文字列オフセット 'オプション1'

注意:定義されていない定数XXXの使用 - 'XXX'

PHP 7.2以降では:

警告:定義されていない定数XXXの使用 - 「XXX」と仮定(将来のバージョンのPHPではエラーが発生します)

この通知は、トークンがコード内で使用され、定数のように見えるが、その名前による定数が定義されていない場合に発生します。

この通知の最も一般的な原因の1つは、連想配列キーとして使用される文字列を引用しないことです。

例えば:

// Wrong
echo $array[key];

// Right
echo $array['key'];

別の一般的な原因は、変数名の前に$ (ドル)記号がありません。

// Wrong
echo varName;

// Right
echo $varName;

あるいは、他の定数やキーワードのスペルミスがあります:

// Wrong
$foo = fasle;

// Right
$foo = false;

また、そのライブラリで定義された定数にアクセスしようとすると、必要なPHP拡張モジュールやライブラリが見つからないというサインになることもあります。

関連する質問:


注意:未定義の変数

これまでに定義されていない変数を使用しようとしたときに発生します。

典型的な例は

foreach ($items as $item) {
    // do something with item
    $counter++;
}

以前に$counter定義していなかった場合は、上記のコードが通知をトリガーします。

正しい方法は、たとえ空の文字列であっても変数を使用する前に変数を設定することです

$counter = 0;
foreach ($items as $item) {
    // do something with item
    $counter++;
}

関連する質問:


注意:配列から文字列への変換

配列を文字列として扱おうとすると、次のようになります。

$arr = array('foo', 'bar');

echo $arr;  // Notice: Array to string conversion
$str = 'Something, ' . $arr;  // Notice: Array to string conversion

echo結果がよく定義されていないため、配列を単に文字列と連結または結合することはできません。PHPは配列の代わりに "Array"という文字列を使用し、意図したものではなく、ここでコードをチェックするべきであることを示す通知をトリガします。代わりに、次のようなものが必要になるでしょう:

echo $arr[0];  // displays foo
$str = 'Something ' . join(', ', $arr); //displays Something, foo, bar

または、配列をループする:

foreach($arr as $key => $value) {
    echo "array $key = $value";
    // displays first: array 0 = foo
    // displays next:  array 1 = bar
}

この通知があなたが期待していないところに現れた場合、文字列であると思われる変数は実際には配列です。つまり、コードにバグがあり、この変数を期待した文字列ではなく配列にすることを意味します。


致命的なエラー:XXXバイトのメモリサイズが使い果たされました(XXXバイトを割り当てようとしました)

スクリプトを実行するのに十分なメモリがありません。 PHPがメモリ制限に達し、実行を停止します。 このエラーは致命的で、スクリプトは停止します。 メモリ制限の値は、 php.iniファイルまたはini_set('memory_limit', '128 M');いずれかで設定できますini_set('memory_limit', '128 M');php.ini定義された値を上書きします)。 メモリ制限の目的は、1つのPHPスクリプトが利用可能なメモリをすべて使い果たして、Webサーバー全体を停止させないようにすることです。

まず、スクリプトに必要なメモリ量を最小限に抑えることです。 たとえば、大きなファイルを変数に読み込んでいる場合や、データベースから多数のレコードを取り出して配列に格納している場合、メモリが大量に消費される可能性があります。 コードを変更して、行単位でファイルを読み込むか、データベースレコードを一度に1つずつメモリに格納しないでフェッチします。 これは、シーンの裏側で何が起こっているのか、データがメモリに格納されているのか他の場所に格納されているのかを概念的に認識させる必要があります。

スクリプトでメモリ集約型の作業が行われていないときにこのエラーが発生した場合は、コードをチェックしてメモリリークがないかどうかを確認する必要があります。 memory_get_usage関数はあなたの友人です。

関連する質問:

  • すべて "致命的なエラー:XXXバイトのメモリサイズが使い果たされました" に関する質問

致命的なエラー:[TraitA]と[TraitB]は[ClassC]の構成で同じプロパティ([$ x])を定義します。

クラスがuse複数のTraitを試行したときに発生します。複数のTraitのうち、2つ以上のTraitが同じ名前でプロパティ定義し、プロパティの初期値が異なります。

例:

<?php
trait TraitA
{
    public $x = 'a';
}
trait TraitB
{
    public $x = 'b';
}
class ClassC
{
    use TraitA, TraitB;
}

問題:競合するメソッド間の競合を解決することは可能ですが、現在競合する2つのプロパティ間の競合を解決する構文はありません。この時点の唯一の解決策はrefactorです。つまり、致命的なエラーを生成するプロパティ名間の競合を回避します。

関連する質問:


致命的なエラー:クラス[クラス名]を再宣言できません

致命的なエラー: [関数名]を再宣言できません

つまり、同じ関数/クラス名を2回使用していて、それらの名前の1つを変更する必要がありinclude_once 。それはrequire_onceまたはinclude_onceを使用requireまたはincludeを使用したためです。

クラスまたは関数がPHPで宣言されている場合、それは不変であり、後で新しい値で宣言することはできません。

次のコードを考えてみましょう:

class.php

<?php

class MyClass
{
    public function doSomething()
    {
        // do stuff here
    }
}

index.php

<?php

function do_stuff()
{
   require 'class.php';
   $obj = new MyClass;
   $obj->doSomething();
}

do_stuff();
do_stuff();

do_stuff()への2回目の呼び出しでは、上記のエラーが発生します。 requirerequire_onceに変更requireことによって、 MyClassの定義を含むファイルが一度だけロードされ、エラーが回避されることが確実になります。


致命的なエラー:書き込みコンテキストで関数の戻り値を使用できません

これは通常、 empty関数を直接使用するときに発生しempty

例:

if (empty(is_null(null))) {
  echo 'empty';
}

emptyは関数ではなく、言語構造であるため、5.5より前のPHPバージョンでは式を引数として呼び出すことはできません。 PHP 5.5以前では、 empty()への引数は変数でなければなりませんが、PHP 5.5以降では任意の式(関数の戻り値など)が許されています。

emptyでも、その名前にもかかわらず、変数が "空"であるかどうかは実際にはチェックされません。 代わりに、変数が存在しないかどうか、または== falseチェックし== false 。 式(例ではis_null(null)など)は常に存在すると見なされるため、 empty場合はfalseに等しいかどうかをチェックするだけです。 ここでempty()置き換えることができます! 例えばif (!is_null(null)) 、または明示的にfalseと比較します。たとえばif (is_null(null) == false)です。

関連する質問:


致命的なエラー:非オブジェクト上のメンバ関数への呼び出し...

xyz->method()に似たコードでxyz->method()はオブジェクトではないため、そのmethodを呼び出すことはできません。

これはスクリプトを停止させる致命的なエラーです(前方互換性に関する注意:PHP 7以降はキャッチ可能なエラーになります)。

多くの場合、これはコードがエラー状態のチェックを欠いているという兆候です。 そのメソッドを呼び出す前に、オブジェクトが実際にオブジェクトであることを検証します。

typical例は

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

上記の例では、クエリをprepare()ことはできず、 prepare()$statementfalseを代入しfalse 。 値が真であるため、 falseは "非オブジェクト"なので、 execute()メソッドを呼び出そうとすると致命的なエラーになります。

あなたの関数がオブジェクトではなくブール値を返した理由を理解してください。 たとえば、最後に発生したエラーの$pdoオブジェクトを確認します。 これをデバッグする方法の詳細は、問題の特定の関数/オブジェクト/クラスのエラー処理方法によって異なります。

->prepareでも失敗した場合、 $pdoデータベースハンドルオブジェクトは現在のスコープに渡されませんでした 。 定義された場所を見つけます。 それをパラメータとして渡すか、プロパティとして格納するか、グローバルスコープで共有します。

別の問題は、条件付きでオブジェクトを作成し、その条件ブロックの外にメソッドを呼び出そうとしていることがあります。 例えば

if ($someCondition) {
    $myObj = new MyObj();
}
// ...
$myObj->someMethod();

条件ブロックの外でメソッドを実行しようとすると、オブジェクトが定義されないことがあります。

関連する質問:

  • 非オブジェクト上のメンバ関数への呼び出し
  • すべてのPHPのリスト "致命的なエラー:メンバ関数への呼び出し...非オブジェクトの" に関する質問

解析エラー:構文エラー、予期しない '['

このエラーには2つのバリエーションがあります。

バリエーション1

$arr = [1, 2, 3];

この配列初期化子の構文は、PHP 5.4でのみ導入されました。それ以前のバージョンではパーサーエラーが発生します。可能であれば、インストールをアップグレードするか、古い構文を使用します。

$arr = array(1, 2, 3);

マニュアルのこの例も参照してください。

バリエーション2

$suffix = explode(',', 'foo,bar')[1];

配列逆参照関数の結果もPHP 5.4で導入されました。アップグレードが不可能な場合は、(一時的な)変数を使用する必要があります:

$parts = explode(',', 'foo,bar');
$suffix = $parts[1];

マニュアルのこの例も参照してください。


解析エラー:構文エラー、予期しないT_PAAMAYIM_NEKUDOTAYIM

スコープ解決演算子は、ヘブライ語の "Paamayim Nekudotayim"とも呼ばれます。פעמייםנקודתיים。 「二重コロン」または「二重ドット二度」を意味します。

このエラーは通常、誤って::をコードに入れた場合に発生します。

関連する質問:

ドキュメンテーション:


解析エラー:構文エラー、予期しないT_VARIABLE

考えられるシナリオ

私のコードがどこに間違っているのかわからない。ここで私の完全なエラーです:

解析エラー:構文エラー、予期しない行xのT_VARIABLE

私が試していること

$sql = 'SELECT * FROM dealer WHERE id="'$id.'"';

回答

解析エラー:プログラムの構文に問題があります。たとえば、ステートメントの末尾にセミコロンを残したり、上記の場合と同様に. オペレーター。 インタプリタは、解析エラーが発生したときにプログラムの実行を停止します。

簡単に言うと、これは構文エラーです。つまり、コード内に正しく解析されて実行されないようにするものがあります。

あなたがしなければならないことは、間違いが何らかの単純な間違いのどこにあるかを注意深く調べることです

このエラーメッセージは、ファイルのx行目にPHPインタプリタが開いたかっこを表示すると予想していたが、代わりに呼び出されT_VARIABLEたものがあることを意味しています。そのT_VARIABLEことをaといいますtoken。これは、プログラムのさまざまな基本部分を表現するPHPインタプリタの方法です。インタプリタがプログラムを読み込むと、あなたが書いたものをトークンのリストに変換します。あなたのプログラムに変数を置く場所にはT_VARIABLE、インタプリタのリストにトークンがあります。

良い読書:パーサートークンのリスト

だからあなたが少なくともあなたの人生で有効になっていることを確認E_PARSEしてくださいphp.ini。パースエラーは本番スクリプトには存在しないはずです。

コーディング中に次の文を追加することを常にお勧めします:

error_reporting(E_ALL);

PHPエラー報告

また、入力中に解析エラーを知らせるIDEを使用することをお勧めします。 あなたが使用することができます:

  1. NetBeans(素晴らしい美しさ、フリーソフトウェア)(私の意見では最高)
  2. PhpStorm(ゴードン叔父さんはこれを愛しています:P、有料プラン、独自のフリーソフトウェアを含んでいます)
  3. Eclipse(美と獣、フリーソフトウェア)

関連する質問:

  • 参照:PHPの構文解析/構文エラー。どのようにそれらを解決するために?

警告: [関数] :ストリームを開くことに失敗しました: [理由]

通常はincluderequireまたはfopenでファイルを呼び出すと、PHPがファイルを見つけられなかったり、ファイルを読み込むための十分な権限がありません。

これは、さまざまな理由で発生します。

  • ファイルパスが間違っています
  • ファイルパスは相対パスです
  • インクルードパスが間違っている
  • 権限があまりにも制限的
  • SELinuxは有効です
  • などなど ...

1つのよくある間違いは、絶対パスを使用しないことです。 これは、 dirname(__FILE__)dirname(__FILE__)ようなフルパスやマジック定数を使うと簡単に解決できます:

include __DIR__ . '/inc/globals.inc.php';

または:

require dirname(__FILE__) . '/inc/globals.inc.php';

正しいパスが使用されていることを確認することは、これらの問題のトラブルシューティングの1つのステップです。これは、存在しないファイル、PHP自体によるアクセスまたはオープンベースの制限を防ぐファイルシステムの権利に関連する可能性があります。

この問題をすばやく解決する最善の方法は、以下のトラブルシューティングのチェックリストに従うことです。

関連する質問:

関連するエラー:


警告:mysql_connect():ユーザー 'name'のアクセスが拒否されました@ 'host'

この警告は、資格情報が無効または不足しているMySQL / MariaDBサーバに接続すると表示されます(ユーザ名/パスワード)。だから、これは一般的にあるではないコードの問題が、サーバー構成の問題。

  • mysql_connect("localhost", "user", "pw")例については、マニュアルページを参照してください。

  • 実際にa $usernameとbを使用していることを確認してください$password

    • あなたがパスワードを使わないでアクセスするのは珍しいことです。これは、警告が発せられたときに起きたこと(using password: NO)です。
    • 通常、ローカルのテストサーバだけが、ユーザ名root、パスワード、およびtestデータベース名で接続することができます。

    • コマンドラインクライアントを使用して、それらが本当に正しいかどうかをテストできます。
      mysql --user="username" --password="password" testdb

    • ユーザー名とパスワードは大文字と小文字を区別し、空白は無視されません。パスワードに以下のようなメタ文字が含まれている場合は、$それらをエスケープするか、パスワードを一重引用符で囲みます

    • ほとんどの共有ホスティングプロバイダは、unixユーザアカウントに関連してmysqlアカウントをプリペアします(プレフィックスや余分な数字の接尾辞だけであることもあります)。パターンやドキュメント、パスワードを設定するためのCPanelなどのインタフェースについては、ドキュメントを参照してください。

    • コマンドラインを使用したユーザーアカウントの追加に関するMySQLのマニュアルを参照してください。管理ユーザーとして接続すると、次のようなクエリを発行できます。
      CREATE USER 'username'@'localhost' IDENTIFIED BY 'newpassword';

    • また、AdminerWorkBenchなどのグラフィカルツールを使用して、アカウントの詳細を作成、確認、修正することもできます。

    • あなたの資格情報を修正できない場合は、インターネットに「助けてください」と尋ねることは効果がありません。あなたとあなたのホスティングプロバイダだけが、物事を診断して修正するのに十分なアクセス権とアクセス権を持っています。

  • プロバイダが指定したホスト名を使用して、データベースサーバにアクセスできることを確認します。
    ping dbserver.hoster.example.net

    • あなたのWebサーバー上のSSHコンソールからこれを直接確認してください。ローカル開発クライアントから共有ホスティングサーバーへのテストはほとんど意味がありません。

    • サーバ名"localhost"は通常、使用可能な場合にはローカルの名前付きソケットを使用します。他の場合は"127.0.0.1"代替として試すことができます。

    • あなたのMySQL / MariaDBサーバは、別のポートでリッスンしてから使用してください"servername:3306"

    • それが失敗すると、おそらくファイアウォールの問題があります。(オフトピック、プログラミングの質問ではありません。リモート推測は不可能です。)

  • 例えば、またはのような定数を使用するときは、実際にdefinedていることを確認してください。DB_USERDB_PASSWORDdefined

    • あなたがa "Warning: Access defined for 'DB_USER'@'host'"とa を得るなら"Notice: use of undefined constant 'DB_PASS'"、それはあなたの問題です。

    • あなたの例xy/db-config.phpが実際に含まれていたかどうかを確認してください。

  • 正しく設定されたGRANT権限がないか確認してください。

    • username+ passwordペアを持つことは十分ではありません。

    • 各MySQL / MariaDBアカウントには、一連のアクセス権が添付されています。

    • これらは、接続が許可されているデータベース、接続が発生しているクライアント/サーバー、許可されているクエリを制限できます。

    • したがって、特定のテーブルまたは/ およびより一般的なものからのmysql_queryアクセス権を持っていない場合は、「アクセス拒否」警告がコールに表示されることがあります。SELECTINSERTUPDATEDELETE

    • 次のようなクエリを使用してadminアカウントを使用してコマンドラインクライアントごとに接続すると、アカウントのアクセス許可を変更できます。
      GRANT ALL ON yourdb.* TO 'username'@'localhost';

  • 警告が最初に表示されるWarning: mysql_query(): Access denied for user ''@'localhost'場合は、php.iniの事前設定されたアカウントとパスワードのペアがあります。

    • それを確認mysql.default_user=し、mysql.default_password=意味のある値を持っています。

    • 多くの場合、これはプロバイダー構成です。だから、不一致のサポートに連絡してください。

  • 共有ホスティングプロバイダのドキュメントを探します:

  • 使用可能な接続プールなくなっている可能性があります。同時接続数が多すぎると、アクセス拒否警告が表示されます。(セットアップを調査する必要があります。これはプログラミングに関する質問ではなく、トピック以外のサーバー構成の問題です。)

  • libmysqlクライアントのバージョンがデータベース・サーバーと互換性がない可能性があります。通常、MySQLおよびMariaDBサーバには、ドライバでコンパイルされたPHPを使用できます。カスタムセットアップ、古いPHPバージョン、さらには新しいデータベースサーバ、または古いバージョンのデータベースがある場合、バージョンが一致しないと接続が妨げられることがあります。(いいえ、自分で調べる必要があります。誰もあなたの設定を推測することはできません)。

その他の参考文献:

Btw、あなたはおそらく、mysql_*もはや機能を使用したくないでしょう。新規参入者はしばしばmysqliに移行しますが、これはちょっと退屈です。代わりにPDOと準備されたステートメントを読んでください
$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");


警告:open_basedirの制限が有効です

この警告は、ファイルおよびディレクトリのアクセスに関連するさまざまな機能とともに表示されます。 設定の問題について警告します。

表示されると、アクセスが一部のファイルに禁止されていることを意味します。

警告自体は何も破るものではありませんが、ファイルへのアクセスが妨げられた場合、スクリプトは正常に機能しません。

修正は、通常、 PHPの設定を変更することです、関連する設定はopen_basedirと呼ばれopen_basedir

ときどき間違ったファイルやディレクトリ名が使用されることがありますが、正しいものを使用するように修正されています。

関連する質問:


警告:ゼロ除算

警告メッセージ 'Division by zero'は、新しいPHP開発者の間で最もよく尋ねられる質問の1つです。このエラーは例外を発生させないため、開発者の中には、式の前にエラー抑止演算子@を追加することによって、警告を時折抑止するものがあります。例えば:

$value = @(2 / 0);

しかし、どのような警告と同様、最善の方法は、警告の原因を追跡して解決することです。警告の原因は、0で割った場合、0に等しい変数、または割り当てられていない変数(NULL == 0なので)の結果が「未定義」になるためです。

この警告を修正するには、値が0ではないことを確認するために式を書き直す必要があります。値がゼロの場合は、除算しないでください。または値を1に変更してから除算して、除算結果が追加の変数のみで除算されたものと等しくなるようにします。

if ( $var1 == 0 ) { // check if var1 equals zero
    $var1 = 1; // var1 equaled zero so change var1 to equal one instead
    $var3 = ($var2 / $var1); // divide var1/var2 ie. 1/1
} else {
    $var3 = ($var2 / $var1); // if var1 does not equal zero, divide
}

関連する質問:


警告:不正な文字列オフセット 'XXX'

これは、角括弧構文で配列要素にアクセスしようとしたときに起こりますが、配列ではなく文字列に対してこれを実行しているので、操作がはっきりとわかりません

例:

$var = "test";
echo $var["a_key"];

変数を配列にする必要があると思う場合は、その変数がどこから来ているのかを確認し、そこで問題を修正してください。


厳密な標準:非静的メソッド[<class> :: <method>]は静的に呼び出されるべきではありません

静的であるためにクラスで非静的メソッドを呼び出そうとしたときに発生E_STRICTし、error_reporting()設定にもフラグが設定されています。

例:

class HTML {
   public function br() {
      echo '<br>';
   }
}

HTML::br() または $html::br()

あなたが実際に追加しないことで、このエラーを回避することが可能E_STRICTerror_reporting()、例えば

error_reporting(E_ALL & ~E_STRICT);

PHP 5.4.0以降E_STRICTE_ALL[ ref ]に含まれているからです。しかし、それはアドバイスできません。解決方法は、目的の静的関数を実際のものとして定義することstaticです。

public static function br() {
  echo '<br>';
}

従来どおり関数を呼び出すことができます:

$html = new HTML();
$html->br();

関連する質問:







warnings