PHP/debugging

from HTYP, the free directory anyone can edit if they can prove to me that they're not a spambot
< PHP
Revision as of 13:35, 13 June 2021 by Woozle (talk | contribs) (Created page with "=Debugging PHP= ==Blank Pages== This code will cause most errors to generate page output, rather than just a blank page: <syntaxhighlight lang=php> $fErrLevel = E_ALL; error_r...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Debugging PHP

Blank Pages

This code will cause most errors to generate page output, rather than just a blank page:

$fErrLevel = E_ALL;
error_reporting($fErrLevel);
if (!ini_get('display_errors')) {
    ini_set('display_errors', 'TRUE');
}

Some errors will crash PHP completely, causing a blank page even with error_reporting turned on; this command (h/t) will show even those:

php -l <name of PHP file>

Newbie Traps & Pitfalls

PHP will let you get away with a lot of syntax mistakes which are perfectly valid code (often creating unexpected variables in the process) but not what you intended.

Here are some mistakes I made when re-learning PHP in 2005 after not using it since 1997, most of which produced no immediate error messages; the code simply wouldn't work, and it took me several edit-upload-run cycles to find each problem:

  • Classes:
    • Member vars and functions must always be referred to using $this->FunctionName()
    • However, var members do not take a $ prefix: $this->varName
    • In a child function (class child extends parent), if the parent has member variables declared as "private" and you attempt to access them with $this->varname, PHP will silently create new member variables for the child scope rather than referencing the old ones or generating an error. (Change the var declarations to "protected".)
  • Operators:
    • As in C/C++:
      • The "is equal to" comparison operator is "==", not "=".
        • You can, however, use the assignment operator ("=") within an expression, and the expression will evaluate to the result of the final assignment.

obsolete

These were true in earlier versions of PHP, but behavior was changed in PHP 5 or maybe 7:

  • If you pass an object to a function, the function will be operating on a copy of the object unless the function is called with the object passed as a reference: CalledFunction(&$objName);. The function declaration itself needs no modifications.
  • If the function is expected to store the object for later use (e.g. it is a class constructor), the function must also use a reference when saving the object: $this->localName =& $iObjectParam;. Otherwise (again) it will be using a copy, not the original.