Skip to content

Commit

Permalink
Allow dereferencing of non-objects accross all supported PHP versions (
Browse files Browse the repository at this point in the history
…#832)

Fixes #831
  • Loading branch information
wisskid committed Nov 24, 2022
1 parent 4d1cf61 commit a34ee98
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 2 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- `$smarty->muteUndefinedOrNullWarnings()` now also mutes PHP7 notices for undefined array indexes [#736](https://github.com/smarty-php/smarty/issues/736)
- `$smarty->muteUndefinedOrNullWarnings()` now treats undefined vars and array access of a null or false variables
equivalent across all supported PHP versions

- `$smarty->muteUndefinedOrNullWarnings()` now allows dereferencing of non-objects accross all supported PHP versions [#831](https://github.com/smarty-php/smarty/issues/831)
## [4.3.0] - 2022-11-22

### Added
Expand Down
15 changes: 14 additions & 1 deletion libs/sysplugins/smarty_internal_errorhandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@ class Smarty_Internal_ErrorHandler
*/
public $allowUndefinedArrayKeys = true;

/**
* Allows {$foo->bar} where bar is not an object (e.g. null or false).
* @var bool
*/
public $allowDereferencingNonObjects = true;

private $previousErrorHandler = null;

/**
Expand Down Expand Up @@ -75,12 +81,19 @@ public function handleError($errno, $errstr, $errfile, $errline, $errcontext = [
}

if ($this->allowUndefinedArrayKeys && preg_match(
'/^(Undefined index|Undefined array key|Trying to access array offset on value of type (null|bool))/',
'/^(Undefined index|Undefined array key|Trying to access array offset on value of type)/',
$errstr
)) {
return; // suppresses this error
}

if ($this->allowDereferencingNonObjects && preg_match(
'/^Attempt to read property ".+?" on/',
$errstr
)) {
return; // suppresses this error
}

// pass all other errors through to the previous error handler or to the default PHP error handler
return $this->previousErrorHandler ?
call_user_func($this->previousErrorHandler, $errno, $errstr, $errfile, $errline, $errcontext) : false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,4 +145,37 @@ public function testUsingFalseAsAnArrayIsMuted() {
$this->assertEquals("ab", $this->smarty->fetch($tpl));
}

/**
* @group 20221124
*/
public function testDereferenceOnNull() {
$this->smarty->setErrorReporting(E_ALL & ~E_WARNING & ~E_NOTICE);
$this->smarty->muteUndefinedOrNullWarnings();
$tpl = $this->smarty->createTemplate('string:a{if $object->myprop}def{/if}b');
$this->smarty->assign('object', null);
$this->assertEquals("ab", $this->smarty->fetch($tpl));
}

/**
* @group 20221124
*/
public function testDereferenceOnBool() {
$this->smarty->setErrorReporting(E_ALL & ~E_NOTICE);
$this->smarty->muteUndefinedOrNullWarnings();
$tpl = $this->smarty->createTemplate('string:a{if $object->myprop}def{/if}b');
$this->smarty->assign('object', false);
$this->assertEquals("ab", $this->smarty->fetch($tpl));
}

/**
* @group 20221124
*/
public function testDereferenceOnString() {
$this->smarty->setErrorReporting(E_ALL & ~E_NOTICE);
$this->smarty->muteUndefinedOrNullWarnings();
$tpl = $this->smarty->createTemplate('string:a{if $object->myprop}def{/if}b');
$this->smarty->assign('object', 'xyz');
$this->assertEquals("ab", $this->smarty->fetch($tpl));
}

}

0 comments on commit a34ee98

Please sign in to comment.