Scriptorama.nl

Header image showing a keyboard, mouse, laptop and books on design patterns

E_STRICT error reporting

Update 25/4/2006: Vanaf PHP 5.1.3 is keyword 'var' in classes niet meer depreciated.

PHP5 heeft een aantal grote veranderingen wanneer je het vergelijkt met PHP4. Meeste verbeteringen zullen bij de meeste web developers bekend zijn. Er zijn ook kleine veranderingen doorgevoerd die niet iedereen kent, waaronder de E_STRICT error reporting constante.

E_STRICT

PHP5 heeft een nieuwe error setting: E_STRICT. Deze zal waarschuwingen afvuren wanneer je depreciated methodes en functies gebruikt. Om specifieker te zijn:

  • Objecten gebruiken zonder een class definitie
  • Gebruik van var in plaats van public/protected/private
  • Naam van de class als constructor gebruiken in plaats van __construct()
  • is_a() gebruiken in plaats van instanceof
  • Een static functie aanroepen die niet als static is gedefineerd

Zoals je misschien weet zijn alle error constantes simpelweg 'defines', zoals op deze pagina is te zien. Alle error constantes zijn geen onderdeel van E_STRICT.

PHP:
  1. <?php
  2. error_reporting(E_STRICT);
  3. trigger_error('error!', E_NOTICE);
  4. ?>

Deze code zal geen warning produceren. E_STRICT is geen onderdeel van E_ALL. Je zult dus handmatig moeten aangeven dat je E_STRICT en E_ALL samen wilt gebruiken.

PHP:
  1. <?php
  2. error_reporting(E_STRICT | E_ALL);
  3. error_reporting(2048 + 2047); // hetzelfde
  4. ?>

Show me the errors!

Ik zal een voorbeeld laten zien waar E_STRICT warnings uitspuugt.

PHP:
  1. <?php
  2. error_reporting(E_ALL | E_STRICT);
  3. class A {
  4.    
  5.     var $a;
  6.    
  7.     public function __construct($param) {
  8.  
  9.         $this->a = $param;
  10.     }
  11.    
  12.     function A($param) {
  13.  
  14.         $this->a = $param;
  15.     }
  16. }
  17. $a->b = 'aa'; // regel 18
  18. print $a->b;
  19. ?>

Dit geeft de volgende output:

Strict Standards: Creating default object from empty value in /www/strict.php on line 18
aa

Op regel 18 zie je dat $a als object wordt behandeld, terwijl die niet bestaat. In PHP4 en PHP5 werkt dit gewoon, alleen goede code is het niet. Als je goed kijkt, zie je dat in de class twee keer een constructor staat. Zoals ik al vermeldde zou dit een warning moeten opleveren, maar het voorbeeld laat zien van niet.
Dit komt omdat PHP het bestand al heeft geparsed als je de error_reporting() in een script gebruikt. PHP mist daarom enkele errors. De oplossing is de error level in je php.ini te veranderen.

CODE:
  1. ; In php.ini veranderen!
  2. error_reporting  =  E_ALL | E_STRICT;

Nadat je dat hebt gedaan krijg je wel het gewenste resultaat (vergeet niet dat je je webserver moet herstarten!).

Strict Standards: var: Deprecated. Please use the public/private/protected modifiers in /www/strict.php on line 5
Strict Standards: Redefining already defined constructor for class A in /www/strict.php on line 12
Strict Standards: Creating default object from empty value in /www/strict.php on line 18
aa

Ik raad je aan om deze error reporting level te gebruiken, zodat je bewust wordt welke functies en methodes afgeraden zijn.
Ook leidt dit tot compatible code, voor je het weet werkt sommige code niet meer in PHP6!

Reageer ook!

Leave a comment
Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>