bug #18449 [PropertyAccess] Fix regression (nicolas-grekas)
This PR was merged into the 2.3 branch.
Discussion
----------
[PropertyAccess] Fix regression
| Q | A
| ------------- | ---
| Branch? | 2.3
| Bug fix? | yes
| New feature? | no
| BC breaks? | no
| Deprecations? |
| Tests pass? | yes
| Fixed tickets | #18437
| License | MIT
| Doc PR | -
All credits go to @MisatoTremor
I don't measure any perf impact.
Commits
-------
2b30d48
[PropertyAccess] Fix regression
This commit is contained in:
commit
416f7d751f
@ -181,6 +181,7 @@ class PropertyAccessor implements PropertyAccessorInterface
|
|||||||
if ($propertyPath->isIndex($i)) {
|
if ($propertyPath->isIndex($i)) {
|
||||||
if ($overwrite = !isset($zval[self::REF])) {
|
if ($overwrite = !isset($zval[self::REF])) {
|
||||||
$ref = &$zval[self::REF];
|
$ref = &$zval[self::REF];
|
||||||
|
$ref = $zval[self::VALUE];
|
||||||
}
|
}
|
||||||
$this->writeIndex($zval, $property, $value);
|
$this->writeIndex($zval, $property, $value);
|
||||||
if ($overwrite) {
|
if ($overwrite) {
|
||||||
|
@ -0,0 +1,176 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Component\PropertyAccess\Tests\Fixtures;
|
||||||
|
|
||||||
|
class TestClass
|
||||||
|
{
|
||||||
|
public $publicProperty;
|
||||||
|
protected $protectedProperty;
|
||||||
|
private $privateProperty;
|
||||||
|
|
||||||
|
private $publicAccessor;
|
||||||
|
private $publicMethodAccessor;
|
||||||
|
private $publicGetSetter;
|
||||||
|
private $publicAccessorWithDefaultValue;
|
||||||
|
private $publicAccessorWithRequiredAndDefaultValue;
|
||||||
|
private $publicAccessorWithMoreRequiredParameters;
|
||||||
|
private $publicIsAccessor;
|
||||||
|
private $publicHasAccessor;
|
||||||
|
private $publicGetter;
|
||||||
|
|
||||||
|
public function __construct($value)
|
||||||
|
{
|
||||||
|
$this->publicProperty = $value;
|
||||||
|
$this->publicAccessor = $value;
|
||||||
|
$this->publicMethodAccessor = $value;
|
||||||
|
$this->publicGetSetter = $value;
|
||||||
|
$this->publicAccessorWithDefaultValue = $value;
|
||||||
|
$this->publicAccessorWithRequiredAndDefaultValue = $value;
|
||||||
|
$this->publicAccessorWithMoreRequiredParameters = $value;
|
||||||
|
$this->publicIsAccessor = $value;
|
||||||
|
$this->publicHasAccessor = $value;
|
||||||
|
$this->publicGetter = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setPublicAccessor($value)
|
||||||
|
{
|
||||||
|
$this->publicAccessor = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setPublicAccessorWithDefaultValue($value = null)
|
||||||
|
{
|
||||||
|
$this->publicAccessorWithDefaultValue = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setPublicAccessorWithRequiredAndDefaultValue($value, $optional = null)
|
||||||
|
{
|
||||||
|
$this->publicAccessorWithRequiredAndDefaultValue = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setPublicAccessorWithMoreRequiredParameters($value, $needed)
|
||||||
|
{
|
||||||
|
$this->publicAccessorWithMoreRequiredParameters = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPublicAccessor()
|
||||||
|
{
|
||||||
|
return $this->publicAccessor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPublicAccessorWithDefaultValue()
|
||||||
|
{
|
||||||
|
return $this->publicAccessorWithDefaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPublicAccessorWithRequiredAndDefaultValue()
|
||||||
|
{
|
||||||
|
return $this->publicAccessorWithRequiredAndDefaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPublicAccessorWithMoreRequiredParameters()
|
||||||
|
{
|
||||||
|
return $this->publicAccessorWithMoreRequiredParameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setPublicIsAccessor($value)
|
||||||
|
{
|
||||||
|
$this->publicIsAccessor = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isPublicIsAccessor()
|
||||||
|
{
|
||||||
|
return $this->publicIsAccessor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setPublicHasAccessor($value)
|
||||||
|
{
|
||||||
|
$this->publicHasAccessor = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hasPublicHasAccessor()
|
||||||
|
{
|
||||||
|
return $this->publicHasAccessor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function publicGetSetter($value = null)
|
||||||
|
{
|
||||||
|
if (null !== $value) {
|
||||||
|
$this->publicGetSetter = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->publicGetSetter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPublicMethodMutator()
|
||||||
|
{
|
||||||
|
return $this->publicGetSetter;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function setProtectedAccessor($value)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getProtectedAccessor()
|
||||||
|
{
|
||||||
|
return 'foobar';
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function setProtectedIsAccessor($value)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function isProtectedIsAccessor()
|
||||||
|
{
|
||||||
|
return 'foobar';
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function setProtectedHasAccessor($value)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function hasProtectedHasAccessor()
|
||||||
|
{
|
||||||
|
return 'foobar';
|
||||||
|
}
|
||||||
|
|
||||||
|
private function setPrivateAccessor($value)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getPrivateAccessor()
|
||||||
|
{
|
||||||
|
return 'foobar';
|
||||||
|
}
|
||||||
|
|
||||||
|
private function setPrivateIsAccessor($value)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
private function isPrivateIsAccessor()
|
||||||
|
{
|
||||||
|
return 'foobar';
|
||||||
|
}
|
||||||
|
|
||||||
|
private function setPrivateHasAccessor($value)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
private function hasPrivateHasAccessor()
|
||||||
|
{
|
||||||
|
return 'foobar';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPublicGetter()
|
||||||
|
{
|
||||||
|
return $this->publicGetter;
|
||||||
|
}
|
||||||
|
}
|
@ -15,6 +15,7 @@ use Symfony\Component\PropertyAccess\PropertyAccessor;
|
|||||||
use Symfony\Component\PropertyAccess\Tests\Fixtures\Author;
|
use Symfony\Component\PropertyAccess\Tests\Fixtures\Author;
|
||||||
use Symfony\Component\PropertyAccess\Tests\Fixtures\Magician;
|
use Symfony\Component\PropertyAccess\Tests\Fixtures\Magician;
|
||||||
use Symfony\Component\PropertyAccess\Tests\Fixtures\MagicianCall;
|
use Symfony\Component\PropertyAccess\Tests\Fixtures\MagicianCall;
|
||||||
|
use Symfony\Component\PropertyAccess\Tests\Fixtures\TestClass;
|
||||||
use Symfony\Component\PropertyAccess\Tests\Fixtures\Ticket5775Object;
|
use Symfony\Component\PropertyAccess\Tests\Fixtures\Ticket5775Object;
|
||||||
use Symfony\Component\PropertyAccess\Tests\Fixtures\TypeHinted;
|
use Symfony\Component\PropertyAccess\Tests\Fixtures\TypeHinted;
|
||||||
|
|
||||||
@ -422,4 +423,14 @@ class PropertyAccessorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->propertyAccessor->setValue($object, 'date', $date);
|
$this->propertyAccessor->setValue($object, 'date', $date);
|
||||||
$this->assertSame($date, $object->getDate());
|
$this->assertSame($date, $object->getDate());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testArrayNotBeeingOverwritten()
|
||||||
|
{
|
||||||
|
$value = array('value1' => 'foo', 'value2' => 'bar');
|
||||||
|
$object = new TestClass($value);
|
||||||
|
|
||||||
|
$this->propertyAccessor->setValue($object, 'publicAccessor[value2]', 'baz');
|
||||||
|
$this->assertSame('baz', $this->propertyAccessor->getValue($object, 'publicAccessor[value2]'));
|
||||||
|
$this->assertSame(array('value1' => 'foo', 'value2' => 'baz'), $object->getPublicAccessor());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user