Reference - What does this error mean in PHP?

2019-07-03 14:46发布

What is this?

This is a number of answers about warnings, errors, and notices you might encounter while programming PHP and have no clue how to fix them. This is also a Community Wiki, so everyone is invited to participate adding to and maintaining this list.

Why is this?

Questions like "Headers already sent" or "Calling a member of a non-object" pop up frequently on Stack Overflow. The root cause of those questions is always the same. So the answers to those questions typically repeat them and then show the OP which line to change in their particular case. These answers do not add any value to the site because they only apply to the OP's particular code. Other users having the same error cannot easily read the solution out of it because they are too localized. That is sad because once you understood the root cause, fixing the error is trivial. Hence, this list tries to explain the solution in a general way to apply.

What should I do here?

If your question has been marked as a duplicate of this one, please find your error message below and apply the fix to your code. The answers usually contain further links to investigate in case it shouldn't be clear from the general answer alone.

If you want to contribute, please add your "favorite" error message, warning or notice, one per answer, a short description what it means (even if it is only highlighting terms to their manual page), a possible solution or debugging approach and a listing of existing Q&A that are of value. Also, feel free to improve any existing answers.

The List

Also, see:

30条回答
来,给爷笑一个
2楼-- · 2019-07-03 15:19

Parse error: syntax error, unexpected T_VARIABLE

Possible scenario

I can't seem to find where my code has gone wrong. Here is my full error:

Parse error: syntax error, unexpected T_VARIABLE on line x

What I am trying

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

Answer

Parse error: A problem with the syntax of your program, such as leaving a semicolon off of the end of a statement or, like the case above, missing the . operator. The interpreter stops running your program when it encounters a parse error.

In simple words this is a syntax error, meaning that there is something in your code stopping it from being parsed correctly and therefore running.

What you should do is check carefully at the lines around where the error is for any simple mistakes.

That error message means that in line x of the file, the PHP interpreter was expecting to see an open parenthesis but instead, it encountered something called T_VARIABLE. That T_VARIABLE thing is called a token. It's the PHP interpreter's way of expressing different fundamental parts of programs. When the interpreter reads in a program, it translates what you've written into a list of tokens. Wherever you put a variable in your program, there is aT_VARIABLE token in the interpreter's list.

Good read: List of Parser Tokens

So make sure you enable at least E_PARSE in your php.ini. Parse errors should not exist in production scripts.

I always recommended to add the following statement, while coding:

error_reporting(E_ALL);

PHP error reporting

Also, a good idea to use an IDE which will let you know parse errors while typing. You can use:

  1. NetBeans (a fine piece of beauty, free software) (the best in my opinion)
  2. PhpStorm (uncle Gordon love this: P, paid plan, contains proprietary and free software)
  3. Eclipse (beauty and the beast, free software)

Related Questions:

查看更多
冷血范
3楼-- · 2019-07-03 15:19

Strict Standards: Non-static method [<class>::<method>] should not be called statically

Occurs when you try to call a non-static method on a class as it was static, and you also have the E_STRICT flag in your error_reporting() settings.

Example :

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

HTML::br() or $html::br()

You can actually avoid this error by not adding E_STRICT to error_reporting(), eg

error_reporting(E_ALL & ~E_STRICT);

since as for PHP 5.4.0 and above, E_STRICT is included in E_ALL [ref]. But that is not adviceable. The solution is to define your intended static function as actual static :

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

or call the function conventionally :

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

Related questions :

查看更多
我想做一个坏孩纸
4楼-- · 2019-07-03 15:20

Parse error: syntax error, unexpected T_XXX

Happens when you have T_XXX token in unexpected place, unbalanced (superfluous) parentheses, use of short tag without activating it in php.ini, and many more.

Related Questions:

For further help see:

查看更多
Evening l夕情丶
5楼-- · 2019-07-03 15:20

Notice: Undefined variable

Happens when you try to use a variable that wasn't previously defined.

A typical example would be

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

If you didn't define $counter before, the code above will trigger the notice.

The correct way would be to set the variable before using it, even if it's just an empty string like

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

Notice: Undefined property

This error means much the same thing, but refers to a property of an object. Reusing the example above, this code would trigger the error because the counter property hasn't been set.

$obj = new stdclass;
$obj->property = 2342;
foreach ($items as $item) {
    // do something with item
    $obj->counter++;
}

Related Questions:

查看更多
Emotional °昔
6楼-- · 2019-07-03 15:21

Fatal error: Cannot redeclare class [class name]

Fatal error: Cannot redeclare [function name]

This means you're either using the same function/class name twice and need to rename one of them, or it is because you have used require or include where you should be using require_once or include_once.

When a class or a function is declared in PHP, it is immutable, and cannot later be declared with a new value.

Consider the following code:

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();

The second call to do_stuff() will produce the error above. By changing require to require_once, we can be certain that the file that contains the definition of MyClass will only be loaded once, and the error will be avoided.

查看更多
Viruses.
7楼-- · 2019-07-03 15:22

Notice: Uninitialized string offset: *

As the name indicates, such type of error occurs, when you are most likely trying to iterate over or find a value from an array with a non-existing key.

Consider you, are trying to show every letter from $string

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

The above example will generate (online demo):

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

And, as soon as the script finishes echoing D you'll get the error, because inside the for() loop, you have told PHP to show you the from first to fifth string character from 'ABCD' Which, exists, but since the loop starts to count from 0 and echoes D by the time it reaches to 4, it will throw an offset error.

Similar Errors:

查看更多
登录 后发表回答